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() :

Łańcuch Konstruktora W Javie

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:

  1. wyrażenie this() powinno być zawsze pierwszą linią konstruktora.
  2. powinien istnieć przynajmniej jeden konstruktor bez słowa kluczowego this () (konstruktor 3 w powyższym przykładzie).
  3. Ł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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.