Netiesioginis ir aiškus konstruktorių grandinėjimas

Konstruktorių sujungimas Java yra paprasčiausias vieno konstruktoriaus veiksmas, kviečiantis kitą konstruktorių per paveldėjimas. Tai įvyksta netiesiogiai, kai konstruojamas poklasis: jo pirmoji užduotis yra iškviesti tėvo konstruktoriaus metodą. Bet programuotojai taip pat gali paskambinti kitam konstruktoriui, naudodamiesi raktiniais žodžiais tai () arba super (). tai () raktinis žodis vadina kitu perkrautas konstruktorius toje pačioje klasėje; super () raktinis žodis vadina konstruktorių, kuris nėra numatytasis, superklasėje.

Numanomas konstruktorių grandinėjimas

Konstruktorių grandinės atsiranda naudojant paveldėjimą. Pirma poklasio konstruktoriaus metodo užduotis yra vadinti superklasės konstruktoriaus metodą. Tai užtikrina, kad poklasio objekto sukūrimas prasideda nuo klasių, esančių virš jo paveldėjimo grandinėje, inicijavimo.

Paveldėjimo grandinėje gali būti bet koks klasių skaičius. Kiekvienas konstruktoriaus metodas iššaukia grandinę, kol pasiekiama ir inicijuojama klasė viršuje. Tada kiekviena paskesnė klasė yra inicializuojama, kai grandinė suka atgal į pradinį poklasį. Šis procesas vadinamas konstruktorių grandine.

instagram viewer

Prisimink tai:

  • Šis numanomas kvietimas į superklasę yra tas pats, kaip jei poklasis būtų apėmęs super () raktinis žodis, t.y. super () čia yra numanomas.
  • Jei konstruktorius, kuriam nėra jokių prieštaravimų, neįtrauktas, „Java“ sukuria jį užkulisiuose ir iškviečia. Tai reiškia, kad jei jūsų vienintelis konstruktorius pasirenka argumentą, turite aiškiai naudoti tai () arba super () raktinis žodis, kad jį panaudotumėte (žr. žemiau).

Apsvarstykite šį superklasės gyvūną, kurį pratęsė žinduolis:

klasės gyvūnas {
// konstruktorius
Gyvūnas(){
 System.out.println („Mes esame„ Gyvūnų klasės konstruktoriai “.);
}
}
klasės žinduolis pratęsia gyvūną {
//constructor
Žinduolis () {
 System.out.println ("Mes esame žinduolių konstruktoriaus klasėje.");
}
}

Dabar pažiūrėkime apie klasės žinduolį:

viešosios klasės grandininiai konstruktoriai {
 /**
* @param args
*/
public static void main (stygos [] args) {
Žinduolis m = naujas žinduolis ();
}
}

Kai vykdoma aukščiau pateikta programa, „Java“ netiesiogiai sušaukia superklasės „Animal“ konstruktorių, tada klasės konstruktorių. Taigi rezultatas bus:

Mes esame „Animal“ konstruktorius
Mes esame „Mammal“ konstruktoriaus klasėje

Aiškus konstruktoriaus sujungimas naudojant šį () arba super ()

Aiškus naudojimosi tai () arba super () raktiniai žodžiai leidžia paskambinti statytoju, kuris nėra numatytasis.

  • Norėdami paskambinti nenumatytuoju konstruktoriumi arba perkrautu konstruktoriumi iš tos pačios klasės, naudokite tai () raktinis žodis.
  • Norėdami iš poklasio paskambinti neprisijungusį superklasės konstruktorių, naudokite super () raktinis žodis. Pavyzdžiui, jei superklasė turi kelis konstruktorius, poklasis visada gali norėti paskambinti konkrečiam konstruktoriui, o ne numatytajam.

Atminkite, kad kvietimas kitam konstruktoriui turi būti pirmasis sakinys konstruktoriuje arba „Java“ išmes kompiliavimo klaidą.

Apsvarstykite žemiau esantį kodą, kuriame naujas poklasis - mėsėdžiai, paveldi iš žinduolių klasės, kuri paveldi iš gyvūnų klasės, ir kiekviena klasė dabar turi konstruktorių, kuris priima argumentą.

Štai superklasis gyvūnas:

visuomenės klasės gyvūnas
privatus stygos pavadinimas;
viešas gyvūnas (stygos pavadinimas) // konstruktorius su argumentu
{
this.name = vardas;
System.out.println („Aš vykdomas pirmiausia.“);
}
}
Atminkite, kad dabar konstruktorius naudoja a vardas tipo Stygos kaip parametras ir kad klasės kūnas skambina tai () ant konstruktoriaus. Aiškiai nenaudojant tai.pavadinimas, „Java“ sukurs numatytąjį konstruktorių be jokių ženklų ir, naudodamas jį, pasitelks.

Čia yra poklasis „Žinduolis“:

viešosios klasės žinduolis pratęsia gyvūną {
viešas žinduolis (eilutės vardas)
{
super (vardas);
System.out.println („Man įvykdyta antra“);
}
}

Jo konstruktorius taip pat laiko argumentą ir naudojasi super (vardas) pasikviesti konkretų konstruktorių jo superklasėje.

Štai dar vienas poklasis „Carnivore“. Tai paveldima iš žinduolių:

viešosios klasės mėsėdis pratęsia žinduolį {
viešas mėsėdis (stygos pavadinimas)
{
super (vardas);
System.out.println („Aš vykdomas paskutinis“);
}
}

Vykdant šie trys kodų blokai atspausdins:

Aš įvykdytas pirmiausia.
Aš įvykdytas antras.
Aš įvykdytas paskutinis.

Norėdami atminti: Kai sukuriamas mėsėdžių klasės egzempliorius, pirmasis jo konstruktoriaus metodo veiksmas yra iššaukti žinduolių konstruktoriaus metodą. Panašiai, pirmasis žinduolių konstruktoriaus metodo veiksmas yra vadinamas gyvūno konstruktoriaus metodu. Konstruktoriaus metodo iškvietimų grandinė užtikrina, kad mėsėdžio objekto egzempliorius tinkamai inicijavo visas paveldėjimo grandinės klases.