Zřetězení konstruktorů v Javě je prostě akt jednoho konstruktora, který volá jiného konstruktora dědictví. To se implicitně děje, když je vytvořena podtřída: jejím prvním úkolem je volat metodu konstruktoru nadřazené. Programátoři však mohou pomocí klíčových slov explicitně zavolat i jiného konstruktéra tento() nebo super (). tento() klíčové slovo volá další přetížený konstruktor ve stejné třídě; super () klíčové slovo volá nestandardní konstruktor v nadřazené třídě.
Implicitní řetězení konstruktorů
Zřetězení konstruktoru nastává pomocí dědičnosti. Prvním úkolem metody konstruktoru podtřídy je vyvolání metody konstruktoru její nadtriedy. Tím je zajištěno, že vytvoření objektu podtřídy začíná inicializací tříd nad ním v řetězci dědičnosti.
V řetězci dědictví by mohlo být libovolné množství tříd. Každá metoda konstruktoru vyvolá řetězec, dokud není dosažena a inicializována třída na vrcholu. Poté se každá následující třída inicializuje, jak se řetěz vine zpět dolů do původní podtřídy. Tento proces se nazývá řetězení konstruktorů.
Všimněte si, že:
- Toto implicitní volání do nadtřídy je stejné, jako kdyby podtřída zahrnovala super () klíčové slovo, tj. super () je zde implicitní.
- Pokud konstruktér bez args není zahrnut do třídy, Java vytvoří jednoho za scénami a vyvolá jej. To znamená, že pokud váš jediný konstruktor vezme argument, musíte explicitně použijte a tento() nebo super () klíčové slovo k vyvolání (viz níže).
Zvažte tuto superclass Animal, kterou rozšířil Mammal:
třída Animal {
// konstruktor
Zvíře(){
System.out.println ("Jsme ve konstruktéři třídy Animal.");
}
}
třída Mammal rozšiřuje Animal {
//constructor
Savec(){
System.out.println ("Jsme ve konstruktoru Mammalovy třídy.");
}
}
Teď si představme třídu savců:
public class ChainingConstructors {
/**
* @param args
*/
public static void main (String [] args) {
Savci m = nový savci ();
}
}
Když se výše uvedený program spustí, Java implicitně spustí volání do konstruktéra Animal superclass, poté do konstruktoru třídy '. Výstupem tedy bude:
Jsme ve konstruktérovi Animal
Jsme ve konstruktéru Mammalovy třídy
Explicitní řetězení konstruktorů pomocí tohoto () nebo super ()
Explicitní použití tento() nebo super () Klíčová slova umožňují volat konstruktora, který není výchozí.
- Chcete-li volat výchozí konstruktor bez args nebo přetížený konstruktor z téže třídy, použijte tento() klíčové slovo.
- Chcete-li z podtřídy zavolat konstruktor nestandardní superclass, použijte super () klíčové slovo. Například, pokud má nadtřída více konstruktorů, může podtřída vždy chtít zavolat konkrétní konstruktor, nikoli výchozí.
Všimněte si, že volání jiného konstruktoru musí být prvním příkazem v konstruktoru nebo Jáva vyvolá chybu kompilace.
Vezměme si níže uvedený kód, ve kterém nová podtřída, Carnivore, zdědí z třídy savců, která zdědí z třídy Animal, a každá třída má nyní konstruktor, který bere argument.
Zde je superclass Animal:
veřejná třída AnimalVšimněte si, že konstruktor nyní vezme název typu Tětiva jako parametr a že tělo třídy volá tento() na konstruktéra. Bez výslovného použití tohle jméno, Java by vytvořila výchozí konstruktér bez args a místo toho ho vyvolala.
soukromé jméno řetězce;
public Animal (String name) // konstruktor s argumentem
{
this.name = name;
System.out.println ("Jsem proveden jako první.");
}
}
Tady je podtřída Mammal:
public class Mammal rozšiřuje Animal {
veřejné savce (String name)
{
super (jméno);
System.out.println ("Jsem popraven druhý");
}
}
Jeho konstruktér také vezme argument a používá super (jméno) vyvolat konkrétní konstruktor ve své nadřazené třídě.
Tady je další podtřída Carnivore. To zdědí od savce:
public class Carnivore rozšiřuje Mammal {
veřejný masožravec (String name)
{
super (jméno);
System.out.println ("Jsem proveden jako poslední");
}
}
Při spuštění se tyto tři bloky kódu vytisknou:
Nejprve jsem popraven.
Jsem popraven druhý.
Jsem popraven jako poslední.
Shrnout: Když je vytvořena instance třídy Carnivore, první akcí metody konstruktoru je volání metody konstruktéra savců. Podobně první akcí metody konstruktéra savců je volání metody konstruktéra zvířat. Volání metody konstruktoru zajistí, že instance objektu Carnivore správně inicializuje všechny třídy v řetězci dědičnosti.