Mi az a konstruktor láncolás?
A Java konstruktor egy speciális metódus, amelyet egy osztály objektum létrehozására használnak. A konstruktor minden alkalommal meghívásra kerül, amikor az osztály egy objektumát létrehozzák. Használható értékek hozzárendelésére az objektum tulajdonságaihoz a létrehozáskor. Egy Java osztályban több konstruktor is lehet, különböző paraméterlistákkal. A konstruktorláncolás az azonos osztályba/szülőosztályba tartozó konstruktorok különböző implementációinak meghívására szolgál az objektum létrehozásának időpontjában.
Hogyan valósul meg a konstruktorláncolás a Java-ban?
A konstruktorok láncolásának két módja van a konstruktor meghívása alapján. Ezek a következők.
- a(z) kulcsszó használatával – azonos osztályba tartozó konstruktorok meghívásához
- super() kulcsszó használatával – a szülőosztály konstruktorainak meghívásához
Ezt a következő példák magyarázzák.
Példa konstruktorok láncolására #1 – A konstruktorokat ezzel a() kulcsszóval láncolják
A DerivedClass négy konstruktőrét deklaráltuk. Az egyik érv nélkül, a másik három pedig különböző érvekkel. Az egyes konstruktorokon belül
ez a() kulcsszó az azonos osztály következő konstruktorának meghívására szolgál.
package com.tutorialwriting.constchaining;
public class DerivedClass{
String firstName;
String country;
int age;
public DerivedClass() {
this("Maggie");
}
public DerivedClass(String firstName) {
this(firstName, 15);
}
public DerivedClass(String firstName, int age) {
this(firstName, age, "Australia");
}
public DerivedClass(String firstName, int age, String country) {
this.firstName = firstName;
this.age = age;
this.country = country;
}
void displayValues() {
System.out.println("First Name : " + firstName);
System.out.println("Country : " + country);
System.out.println("Age : " + age);
}
public static void main(String args[]) {
DerivedClass object = new DerivedClass();
object.displayValues();
}
}
A végrehajtás kimenete
Konstruktorláncolási példa #2 – A konstruktorok a szuper() kulcsszó használatával vannak láncolva
Itt a gyermekosztály a szuper() kulcsszó használatával hívja meg a szülőosztály konstruktorait . A BaseClass-nek három konstruktora van. Az argumentumok nélküli konstruktor meghívja a BaseClass három argumentumból álló konstruktorának egyikét
a this() használatával .
package com.tutorialwriting.constchaining;
public class BaseClass {
public BaseClass() {
this("Male", "English", "1989/11/10");
System.out.println("I'm executed third!!!");
}
public BaseClass(String firstName, String surname, int idNo) {
System.out.println("I'm executed first!");
System.out.println("First name : " + firstName);
System.out.println("Surname : " + surname);
System.out.println("ID Number : " + idNo);
}
public BaseClass(String gender, String nationality, String birthDate) {
System.out.println("I'm executed second!!");
System.out.println("Gender : " + gender);
System.out.println("Nationality : " + nationality);
System.out.println("Birth Date : " + birthDate);
}
}
A DerivedClass két konstruktorral rendelkezik, amelyek mindegyike a szuperosztály különböző konstruktorait hívja meg a
super() segítségével .
package com.tutorialwriting.constchaining;
public class DerivedClass extends BaseClass {
public DerivedClass() {
super();
}
public DerivedClass(String firstName, String surname, int idNo) {
super(firstName, surname, idNo);
}
public static void main(String args[]) {
DerivedClass object2 = new DerivedClass("Paul", "Wilson", 123456);
DerivedClass object1 = new DerivedClass();
}
}
A végrehajtás kimenete
Implicit vs. explicit konstruktorhívás
A Java kétféle módon hívhatja meg a konstruktorokat: implicit hívás és explicit hívás.
- Az explicit hívás a konstruktorok explicit meghívására utal a kódban a this() vagy super() használatával .
- Az implicit hívás a szuperosztály argumentummentes konstruktorának implicit meghívására utal, ha nincs ilyen explicit hívás a gyermekosztály konstruktorától. Más szóval, a fordító hozzáadja a super() hívást a gyermekosztályok bármelyik konstruktorának első soraként, ha a programozó kifejezetten nem hívja meg a super()-t a kódban.
Miért van szükségünk a konstruktőri láncra?
Számos különböző célja van a konstruktorláncnak a Java nyelven, az alábbiak szerint.
- Ez egy módja annak, hogy hozzáférjen más konstruktorok vagy a szülőosztályok tulajdonságaihoz.
- Más konstruktorok hívásakor csak egy objektum kerül felhasználásra, amely az osztály aktuális példánya. Az inicializálás egy helyen történik, de megvan az a kiváltságunk, hogy egy láncon keresztül különböző konstruktor implementációkat hívhatunk meg. Ez nagyban segít a memóriakezelésben és a kód karbantartásában.
Következtetés
Ebben az oktatóanyagban a konstruktorláncolást tárgyaltuk Java nyelven. A konstruktorok metódusszerű kódszegmensek, amelyeket az objektumok létrehozásakor hívnak meg. Egy Java osztálynak tetszőleges számú konstruktora lehet különböző paraméterlistákkal. A konstruktorláncolás praktikus módja a különböző inicializálások kezelésének egy osztály egyetlen példányával. Az alábbiakban felsorolunk néhány fontos pontot, amelyeket meg kell jegyezni ebből az oktatóanyagból.
- Ha a programozó nem adja hozzá kifejezetten a kódhoz, a fordító egy nyilvános argumentummentes konstruktort ad a Java osztályhoz. Ezt nevezzük alapértelmezett konstruktornak.
- ezt() és super() a konstruktor első soraként kell írni.
- A this() ugyanazon osztály konstruktorainak hívására szolgál, míg a super() a közvetlen szuperosztály konstruktorainak hívására szolgál.
- Legalább egy olyan konstruktornak kell lennie az osztályon belül, amely nem tartalmazza ezt a() kulcsszót.
- Ha nincs kifejezetten hozzáadva, a fordító minden gyermekosztály-konstruktorhoz hozzáad egy argumentum nélküli super() hívást. Ez segíti az osztályok helyes példányosítását.