Impliciete en expliciete constructorketens

Constructor chaining in Java is gewoon de handeling van een constructor die een andere constructor via aanroept erfenis. Dit gebeurt impliciet wanneer een subklasse wordt geconstrueerd: de eerste taak is het aanroepen van de constructormethode van de ouder. Maar programmeurs kunnen ook expliciet een andere constructor aanroepen met behulp van de trefwoorden deze() of super(). De deze() zoekwoord roept een ander aan overbelaste constructeur in dezelfde klas; de super() trefwoord roept een niet-standaard constructor aan in een superklasse.

Impliciete constructorketens

Constructor-chaining vindt plaats door het gebruik van overerving. De eerste taak van een subklasse constructormethode is het aanroepen van de constructormethode van de superklasse. Dit zorgt ervoor dat het maken van het subklasse-object begint met de initialisatie van de klassen erboven in de overervingsketen.

Er kunnen een onbeperkt aantal klassen zijn in een overervingsketen. Elke constructormethode roept de ketting op totdat de klasse bovenaan is bereikt en geïnitialiseerd. Vervolgens wordt elke volgende klasse hieronder geïnitialiseerd terwijl de ketting teruggaat naar de oorspronkelijke subklasse. Dit proces heet constructor chaining.

instagram viewer

Let daar op:

  • Deze impliciete aanroep van de superklasse is hetzelfde alsof de subklasse de super() zoekwoord, d.w.z. super() is hier impliciet.
  • Als een no-args-constructor niet in de klasse is opgenomen, maakt Java er een achter de schermen en roept deze aan. Dit betekent dat als je enige constructor een argument aanneemt, je dat moet doen uitdrukkelijk gebruik een deze() of super() trefwoord om het aan te roepen (zie hieronder).

Beschouw dit superklasse dier uitgebreid door Mammal:

klasse Dier {
// constructeur
Dier(){
 System.out.println ("We zitten in de klasse Animal's constructor.");
}
}
klasse Mammal verlengt Animal {
//constructor
Zoogdier(){
 System.out.println ("We zitten in de klasse van Mammal 's constructeur.");
}
}

Laten we nu de klasse Mammal instantiëren:

openbare klasse ChainingConstructors {
 /**
* @param betoogt
*/
openbare statische leegte main (String [] args) {
Zoogdier m = nieuw zoogdier ();
}
}

Wanneer het bovenstaande programma wordt uitgevoerd, activeert Java impliciet een aanroep naar de superklasse Animal constructor en vervolgens naar de class 'constructor. De output zal daarom zijn:

We zitten in de constructeur van Animal
We zitten in de bouwer van Mammal

Expliciete Constructor Chaining met behulp van deze () of super ()

Expliciet gebruik van de deze() of super() Met trefwoorden kunt u een niet-standaardconstructor aanroepen.

  • Gebruik de. Om een ​​niet-args-standaardconstructor of een overbelaste constructor vanuit dezelfde klasse aan te roepen deze() zoekwoord.
  • Gebruik de om een ​​niet-standaard superklasse constructor uit een subklasse aan te roepen super() zoekwoord. Als de superklasse bijvoorbeeld meerdere constructors heeft, wil een subklasse mogelijk altijd een specifieke constructor aanroepen in plaats van de standaard.

Merk op dat de aanroep naar een andere constructor de eerste instructie in de constructor of moet zijn Java zal een compilatiefout opleveren.

Beschouw de onderstaande code waarin een nieuwe subklasse, Carnivore, erft van de klasse Mammal die erft van de klasse Animal, en elke klasse heeft nu een constructor die een argument aanneemt.

Hier is de superklasse Animal:

openbare klasse Animal
private String naam;
public Animal (String name) // constructor met een argument
{
this.name = naam;
System.out.println ("Ik word eerst uitgevoerd.");
}
}
Merk op dat de constructor nu een naam van type Draad als parameter en dat de body van de klas aanroept deze() op de constructeur. Zonder expliciet gebruik van deze naam, Java zou een standaard constructor zonder argumenten maken en die in plaats daarvan aanroepen.

Hier is de subklasse Mammal:

openbare klasse Mammal verlengt Animal {
public Mammal (String naam)
{
super (naam);
System.out.println ("Ik word als tweede uitgevoerd");
}
}

De constructor neemt ook een argument aan en gebruikt het super (naam) om een ​​specifieke constructor aan te roepen in zijn superklasse.

Hier is nog een subklasse Carnivore. Dit erft van Mammal:

public class Carnivore verlengt Mammal {
public Carnivore (String naam)
{
super (naam);
System.out.println ("Ik ben als laatste uitgevoerd");
}
}

Wanneer deze worden uitgevoerd, worden deze drie codeblokken afgedrukt:

Ik word eerst geëxecuteerd.
Ik ben als tweede geëxecuteerd.
Ik ben als laatste geëxecuteerd.

Om samen te vatten: Wanneer een instantie van de Carnivore-klasse wordt gemaakt, is de eerste actie van de constructormethode het aanroepen van de Mammal-constructormethode. Evenzo is de eerste actie van de Mammal constructor-methode het aanroepen van de Animal constructor-methode. Een reeks constructor methodeaanroepen zorgt ervoor dat de instantie van het Carnivore-object alle klassen in zijn overervingsketen correct heeft geïnitialiseerd.

instagram story viewer