Konstruktorkedjning i Java är helt enkelt handlingen av en konstruktör som kallar en annan konstruktör via arv. Detta händer implicit när en underklass är konstruerad: dess första uppgift är att kalla sin föräldrars konstruktormetod. Men programmerare kan också ringa en annan konstruktör uttryckligen med hjälp av nyckelorden detta() eller super(). De detta() nyckelordet kallar en annan överbelastad konstruktör i samma klass; de super() nyckelordet kallar en icke-standardkonstruktör i en superklass.
Konstruktorkedjning sker genom användning av arv. En underklasskonstruktormetods första uppgift är att kalla sin superklass 'konstruktormetod. Detta säkerställer att skapandet av underklassobjektet börjar med initialisering av klasserna ovanför det i arvskedjan.
Det kan finnas valfritt antal klasser i en arvskedja. Varje konstruktionsmetod anropar kedjan tills klassen överst har nåtts och initialiserats. Sedan initialiseras varje efterföljande klass nedan när kedjan lindar ner till den ursprungliga underklassen. Denna process kallas konstruktorkedjning.
Anteckna det:
Tänk på detta superklassdjur utökat av däggdjur:
klass Djur
// konstruktör
Djur()
System.out.println ("Vi är i klassens Djurens konstruktör.");
klass däggdjur utökar djur
//konstruktör
Däggdjur()
System.out.println ("Vi är i klass däggdjurs konstruktör.");
Låt oss nu anpassa klassen däggdjur:
public class ChainingConstructors
/ **
* @param arg
* /
public static void main (String [] args)
Däggdjur m = nytt däggdjur ();
När ovanstående program körs utlöser Java implicit ett samtal till superklassens djurkonstruktör och sedan till klassens konstruktör. Utgången kommer därför att vara:
Vi är i klass Djurens konstruktör
Vi är i klassens däggdjurs konstruktör
Explicit användning av detta() eller super() nyckelord låter dig ringa en icke-standardkonstruktör.
Observera att samtalet till en annan konstruktör måste vara det första uttalandet i konstruktören eller Java kommer att kasta ett sammanställningsfel.
Tänk på koden nedan där en ny underklass, Carnivore, ärver från däggdjursklassen som ärver från djurklassen, och varje klass har nu en konstruktör som tar ett argument.
Här är superklassen Animal:
allmän klass DjurObservera att konstruktören nu tar en namn av typ Sträng som en parameter och att kroppen i klassen anropar detta() på konstruktören. Utan den uttryckliga användningen av detta namnet, Java skulle skapa en standard, no-args-konstruktör och åberopa det istället.
privat strängnamn;
public animal (String name) // konstruktör med ett argument
this.name = name;
System.out.println ("Jag körs först.");
Här är underklassen däggdjur:
däggdjur från allmän klass utökar djur
offentligt däggdjur (strängnamn)
super (namn);
System.out.println ("Jag körs sekund");
Dess konstruktör tar också ett argument, och den använder super (namn) att åberopa en specifik konstruktör i sin superklass.
Här är en annan underklass Carnivore. Detta ärver från däggdjur:
offentlig klass Carnivore utökar däggdjur
public Carnivore (String name)
super (namn);
System.out.println ("Jag körs senast");
När de körs skulle dessa tre kodblock skrivas ut:
Jag är avrättad först.
Jag är avrättad andra.
Jag är avrättad sist.
För att sammanfatta: När en instans av Carnivore-klassen skapas är den första åtgärden med dess konstruktormetod att ringa däggdjurskonstruktormetoden. På samma sätt är den första åtgärden med däggdjurskonstruktormetoden att kalla djurkonstruktormetoden. En kedja med konstruktionsmetodsamtal säkerställer att förekomsten av Carnivore-objektet har korrekt initierat alla klasser i dess arvskedja.