GeeksforGeeks

előfeltétel-konstruktorok Java-ban
konstruktor-láncolás az a folyamat, amikor egy konstruktort meghívunk egy másik konstruktortól az aktuális objektumhoz képest.
a konstruktor láncolás kétféle módon történhet:

  • belül ugyanabban az osztályban: meg lehet csinálni ezzel() kulcsszó konstruktorok ugyanabban az osztályban
  • base class: segítségével super() kulcsszó hívni konstruktor az alap osztály.

a konstruktor láncolás örökléssel történik. A sub osztály konstruktor feladata, hogy hívja super osztály konstruktor első. Ez biztosítja, hogy az alosztály objektumának létrehozása a szuper osztály adattagjainak inicializálásával kezdődik. Az öröklési láncban tetszőleges számú osztály lehet. Minden konstruktor felhívja a láncot, amíg el nem éri a legfelső osztályt.

miért van szükség konstruktor láncolásra ?
ezt a folyamatot akkor használjuk, ha több feladatot akarunk végrehajtani egyetlen konstruktorban, ahelyett, hogy minden feladathoz kódot hoznánk létre egyetlen konstruktorban, minden feladathoz külön konstruktort hozunk létre, és elkészítjük azok láncát, amely a programot olvashatóbbá teszi.

konstruktor láncolás ugyanazon osztályon belül ezzel a () kulcsszóval :

Konstruktor Láncolás Java-Ban

class Temp
{
Temp()
{
this(5);
System.out.println("The Default constructor");
}
Temp(int x)
{
this(5, 15);
System.out.println(x);
}
Temp(int x, int y)
{
System.out.println(x * y);
}
public static void main(String args)
{
new Temp();
}
}



kimenet:

755The Default constructor

a konstruktor láncolás szabályai :

  1. A this () kifejezésnek mindig a konstruktor első sorának kell lennie.
  2. legalább egy konstruktornak kell lennie a this() kulcsszó nélkül (a fenti példában a 3.konstruktor).
  3. konstruktor láncolás lehet elérni bármilyen sorrendben.

mi történik, ha megváltoztatjuk a konstruktorok sorrendjét?

semmi, a konstruktor láncolás bármilyen sorrendben elérhető

class Temp
{
Temp()
{
System.out.println("default");
}
Temp(int x)
{
this();
System.out.println(x);
}
Temp(int x, int y)
{
this(5);
System.out.println(x * y);
}
public static void main(String args)
{
new Temp(8, 10);
}
}



kimenet:

default580

megjegyzés: Az 1. példában az alapértelmezett konstruktort a végén hívják meg, de a 2.példában az alapértelmezett konstruktort először hívják meg. Ezért a konstruktor láncolatának rendje nem fontos.

konstruktor láncolás más osztályba a super() kulcsszó használatával :

class Base
{
String name;
Base()
{
this("");
System.out.println("No-argument constructor of" +
" base class");
}
Base(String name)
{
this.name = name;
System.out.println("Calling parameterized constructor"
+ " of base");
}
}
class Derived extends Base
{
Derived()
{
System.out.println("No-argument constructor " +
"of derived");
}
Derived(String name)
{
super(name);
System.out.println("Calling parameterized " +
"constructor of derived");
}
public static void main(String args)
{
Derived obj = new Derived("test");
}
}



kimenet:

Calling parameterized constructor of baseCalling parameterized constructor of derived

Megjegyzés: hasonlóan a konstruktor láncoláshoz ugyanabban az osztályban, a super() legyen a konstruktor első sora, mivel a super osztály konstruktorát az alosztály konstruktora előtt hívják meg.

alternatív módszer: init blokk használata:
ha bizonyos közös erőforrásokat akarunk végrehajtani minden konstruktorral, akkor a kódot az init blokkba helyezhetjük. Az Init blokk mindig végrehajtásra kerül bármely konstruktor előtt, amikor egy konstruktort használnak új objektum létrehozásához.

1. példa:

class Temp
{
{
System.out.println("init block");
}
Temp()
{
System.out.println("default");
}
Temp(int x)
{
System.out.println(x);
}
public static void main(String args)
{
new Temp();
new Temp(10);
}
}



kimenet:

init blockdefaultinit block10

MEGJEGYZÉS: Ha egynél több blokk van, akkor azok abban a sorrendben kerülnek végrehajtásra, amelyben ugyanabban az osztályban vannak meghatározva. Lásd az ex.
példa :

class Temp
{
{
System.out.println("init");
}
Temp()
{
System.out.println("default");
}
Temp(int x)
{
System.out.println(x);
}
{
System.out.println("second");
}
public static void main(String args)
{
new Temp();
new Temp(10);
}
}



kimenet :

initseconddefaultinitsecond10

ezt a cikket Apoorva singh írta. Ha tetszik a GeeksforGeeks, és szeretne hozzájárulni, akkor is írhat egy cikket a hozzájárulás használatával.geeksforgeeks.org vagy küldje el a cikket [email protected]. lásd a GeeksforGeeks főoldalán megjelenő cikket, és segítsen más geekeknek.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.