Leer het gebruik van deze () en (super) in Java Constructor Chaining

Constructor chaining in Java is gewoon de handeling van een constructor die een andere constructor aanroept via overerving. Dit gebeurt impliciet wanneer een subklasse wordt geconstrueerd: de eerste taak is om de constructormethode van de ouder aan te roepen. Maar programmeurs kunnen ook een andere constructor aanroepen met behulp van de sleutelwoorden deze() of super(). De deze() trefwoord roept een andere overbelaste constructor in dezelfde klasse aan; de super() trefwoord roept een niet-standaard constructor aan in een superklasse.

Impliciete Constructor Chaining

Constructor chaining vindt plaats door het gebruik van overerving. De eerste taak van een subklasse constructormethode is de constructormethode van zijn superklasse aan te roepen. Dit zorgt ervoor dat het maken van het subklasseobject begint met de initialisatie van de klassen erboven in de overervingsketen.

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

Let daar op:

  • Deze impliciete aanroep naar de superklasse is hetzelfde alsof de subklasse de super() trefwoord, 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 op. Dit betekent dat als uw enige constructeur een argument aanneemt, u dat moet doen uitdrukkelijk gebruik een deze() of super() trefwoord om het op te roepen (zie hieronder).

Beschouw deze superklasse Animal uitgebreid door Mammal:

klasse dier 
// constructeur
Dier()
 System.out.println ("We zitten in de constructor van de klas Animal.");

klasse Zoogdier verlengt dier 
// constructor
Zoogdier()
 System.out.println ("We zitten in de constructor van Mammal.");

Laten we nu de klasse Zoogdier instantiëren:

openbare klasse ChainingConstructors 
 / **
* @param args
* /
public static void main (String [] args)
Mammal m = new Mammal ();

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

We zitten in de constructeur van klasse Animal
We zitten in de aannemer van klasse Mammal

Expliciete Constructor Chaining met 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 uit dezelfde klasse aan te roepen deze() trefwoord. 
  • Gebruik de om een ​​niet-standaard superklasseconstructor uit een subklasse aan te roepen super() trefwoord. Als de superklasse bijvoorbeeld meerdere constructors heeft, wil een subklasse 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 moet zijn, anders zal Java een compilatiefout veroorzaken.

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 dier
private String naam;
public Animal (tekenreeksnaam) // constructor met een argument

this.name = name;
System.out.println ("Ik word eerst uitgevoerd.");

Merk op dat de constructor nu een neemt naam van het type Draad als parameter en dat de body van de klasse aanroept deze() op de constructeur. Zonder het expliciete gebruik van deze naam, Java zou een standaard, no-args constructor maken en dat in plaats daarvan aanroepen.

Hier is de subklasse Mammal:

public class Mammal breidt dier 
public Mammal (tekenreeksnaam)

super (naam);
System.out.println ("Ik word als tweede uitgevoerd");

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

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

public class Carnivore breidt zoogdier 
public Carnivore (tekenreeksnaam)

super (naam);
System.out.println ("Ik ben het laatst geëxecuteerd");

Wanneer uitgevoerd, zouden deze drie codeblokken worden afgedrukt:

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

Samenvatten: Wanneer een instantie van de Carnivore-klasse wordt gemaakt, is de eerste actie van de constructormethode de methode Mammal constructor aan te roepen. Evenzo is de eerste actie van de constructiemethode voor zoogdieren de methode Animal constructor aan te roepen. Een aanroep van een constructormethode zorgt ervoor dat de instantie van het Carnivore-object alle klassen in zijn overervingsketen correct heeft geïnitialiseerd.