Ł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ę.
Wyzwanie
ŁatwyStwó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) iprice(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()igetPrice()umożliwiające dostęp do pól
- Pola prywatne
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)
- Pole prywatne
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 wynikgetDetails().
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()
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online