Menu
Coddy logo textTech

Łańcuch wywołań konstruktorów

Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 23 z 87.

Łańcuchowe wywoływanie konstruktorów to proces wywoływania jednego konstruktora z innego. Ta technika pomaga uniknąć powielania kodu, gdy klasa ma wiele konstruktorów lub gdy pracujesz z hierarchiami dziedziczenia.

W obrębie tej samej klasy możesz łączyć konstruktory za pomocą this(). Dzięki temu możesz mieć jeden „główny” konstruktor, który wykonuje całą pracę, podczas gdy pozostałe konstruktory po prostu przekazują mu sterowanie:

public class Rectangle {
    private int width;
    private int height;
    
    public Rectangle() {
        this(1, 1);  // Wywołuje konstruktor z dwoma parametrami
    }
    
    public Rectangle(int size) {
        this(size, size);  // Tworzy kwadrat
    }
    
    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
}

W dziedziczeniu łańcuchowe wywoływanie konstruktorów odbywa się automatycznie. Gdy tworzysz obiekt podklasy, Java najpierw wywołuje konstruktor klasy nadrzędnej za pomocą super(). Jeśli nie wywołasz jawnie super(), Java automatycznie wstawia super() (wersję bez argumentów):

public class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
        System.out.println("Animal constructor");
    }
}

public class Dog extends Animal {
    private String breed;
    
    public Dog(String name, String breed) {
        super(name);  // Musi być w pierwszym wierszu
        this.breed = breed;
        System.out.println("Dog constructor");
    }
}

Utworzenie new Dog("Buddy", "Labrador") najpierw wyświetla „Animal constructor”, a następnie „Dog constructor”. Dzięki temu klasy nadrzędne są zawsze prawidłowo inicjalizowane, zanim klasa potomna doda własną konfigurację.

challenge icon

Wyzwanie

Łatwy

Stwórzmy system zamówień produktów, który pokazuje łańcuchowe wywoływanie konstruktorów zarówno w obrębie jednej klasy, jak i w hierarchii dziedziczenia. Zobaczysz, jak this() łączy konstruktory w tej samej klasie, a super() wywołuje konstruktory klasy nadrzędnej.

Utworzysz trzy pliki, aby uporządkować swój kod:

  • Product.java: Utwórz klasę nadrzędną reprezentującą dowolny produkt w sklepie. Powinna zawierać:
    • Pola prywatne name (String) i price (double)
    • Główny konstruktor, który przyjmuje nazwę i cenę, inicjuje pola i wyświetla: Product constructor: [name]
    • Drugi konstruktor, który przyjmuje tylko nazwę i wywołuje główny konstruktor za pomocą this(name, 0.0), aby ustawić domyślną cenę równą 0.0
    • Metody getName() i getPrice() umożliwiające dostęp do pól
  • Electronics.java: Utwórz podklasę rozszerzającą Product i dodającą informacje o gwarancji:
    • Pole prywatne warrantyYears (int)
    • Główny konstruktor, który przyjmuje nazwę, cenę i warrantyYears — użyj super(name, price), aby zainicjować klasę nadrzędną, a następnie ustaw gwarancję i wyświetl: Electronics constructor: [warrantyYears] year warranty
    • Drugi konstruktor, który przyjmuje tylko nazwę i cenę i wywołuje główny konstruktor za pomocą this(name, price, 1), aby ustawić domyślną gwarancję na 1 rok
    • Trzeci konstruktor, który przyjmuje tylko nazwę i wywołuje drugi konstruktor za pomocą this(name, 0.0)
    • Metoda getDetails(), która zwraca: [name] - $[price] ([warrantyYears] year warranty)
  • Main.java: Zademonstruj działanie łańcuchowego wywoływania konstruktorów. Otrzymasz trzy dane wejściowe: nazwę produktu (String), cenę (double) i liczbę lat gwarancji (int). Utwórz obiekt Electronics, używając wszystkich trzech parametrów, a następnie wyświetl wynik getDetails().

Otrzymasz trzy dane wejściowe: nazwę produktu, cenę i liczbę lat gwarancji.

Sformatuj cenę w getDetails() tak, aby wyświetlała 2 miejsca po przecinku, używając String.format("%.2f", price). Przyjrzyj się uważnie wynikowi — zobaczysz komunikaty konstruktorów pojawiające się w odpowiedniej kolejności, pokazujące, jak łańcuch przebiega od klasy nadrzędnej do podrzędnej!

Spróbuj swoich sił

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Wczytaj dane wejściowe
        String name = scanner.nextLine();
        double price = scanner.nextDouble();
        int warrantyYears = scanner.nextInt();
        
        // TODO: Utwórz obiekt Electronics, używając wszystkich trzech parametrów
        
        // TODO: Wypisz wynik getDetails()
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Java online