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 :
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 :
- A this () kifejezésnek mindig a konstruktor első sorának kell lennie.
- legalább egy konstruktornak kell lennie a this() kulcsszó nélkül (a fenti példában a 3.konstruktor).
- 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.