GeeksforGeeks
warunek-konstruktory w Javie
Łańcuch Konstruktora jest procesem wywołania jednego konstruktora z innego konstruktora w odniesieniu do bieżącego obiektu.
Łańcuch konstruktora można wykonać na dwa sposoby:
- wewnątrz tej samej klasy: można to zrobić używając słowa kluczowego this() dla konstruktorów w tej samej klasie
- z klasy bazowej: używając słowa kluczowego super() do wywołania konstruktora z klasy bazowej.
Łańcuch konstruktora następuje poprzez dziedziczenie. Zadaniem konstruktora podklasy jest najpierw wywołanie konstruktora klasy super. Zapewnia to, że tworzenie obiektu klasy podrzędnej rozpoczyna się od inicjalizacji elementów danych klasy super. W łańcuchu dziedziczenia może być dowolna liczba klas. Każdy konstruktor wywołuje łańcuch aż do osiągnięcia klasy na górze.
po co nam łańcuch konstruktora?
ten proces jest używany, gdy chcemy wykonywać wiele zadań w jednym konstruktorze zamiast tworzyć kod dla każdego zadania w jednym konstruktorze tworzymy oddzielny konstruktor dla każdego zadania i robimy ich łańcuch, który sprawia, że program jest bardziej czytelny.
łączenie konstruktorów w obrębie tej samej klasy za pomocą słowa kluczowego this() :
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();
}
}
wyjście:
755The Default constructor
zasady łączenia konstruktorów:
- wyrażenie this() powinno być zawsze pierwszą linią konstruktora.
- powinien istnieć przynajmniej jeden konstruktor bez słowa kluczowego this () (konstruktor 3 w powyższym przykładzie).
- Łańcuch konstruktora można uzyskać w dowolnej kolejności.
co się stanie, jeśli zmienimy kolejność konstruktorów?
nic, Łańcuch konstruktora można osiągnąć w dowolnej kolejności
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
);
}
}
wyjście:
default580
Uwaga: W przykładzie 1 domyślny konstruktor jest wywoływany na końcu, ale w przykładzie 2 domyślny konstruktor jest wywoływany na początku. Stąd kolejność w łańcuchach konstruktorów nie jest ważna.
łączenie konstruktora z inną klasą za pomocą słowa kluczowego super () :
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"
);
}
}
wyjście:
Calling parameterized constructor of baseCalling parameterized constructor of derived
Uwaga: podobnie jak w przypadku łańcuchów konstruktorów w tej samej klasie, super () powinna być pierwszą linią konstruktora, ponieważ konstruktory klasy super są wywoływane przed konstruktorem klasy podrzędnej.
Metoda alternatywna: użycie bloku Init:
gdy chcemy, aby pewne wspólne zasoby były wykonywane z każdym konstruktorem, możemy umieścić kod w bloku init. Blok Init jest zawsze wykonywany przed dowolnym konstruktorem, zawsze gdy konstruktor jest użyty do wytworzenia nowego obiektu.
przykład 1:
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
);
}
}
wyjście:
init blockdefaultinit block10
UWAGA: jeśli istnieje więcej niż jeden blok, są one wykonywane w kolejności, w jakiej są zdefiniowane w tej samej klasie. Zobacz byłego.
przykład :
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
);
}
}
wyjście :
initseconddefaultinitsecond10
autorem artykułu jest Apoorva singh. Jeśli podoba Ci się GeeksforGeeks i chciałbyś przyczynić się, możesz również napisać artykuł za pomocą contribute.geeksforgeeks.org lub wyślij swój artykuł do [email protected]. Zobacz swój artykuł pojawiający się na stronie głównej GeeksforGeeks i pomóż innym maniakom.