Historia pytania:
W pierwszych wersjach Javy wprowadzono mechanizm dziedziczenia, który pozwala klasie potomnej rozszerzać zachowanie klasy nadrzędnej. Aby odwołać się do członków klasy nadrzędnej, używa się słowa kluczowego super, które zostało zaadoptowane z C++.
Problem:
Czasami zachodzi potrzeba wyraźnego odwołania się do metody lub pola klasy nadrzędnej, jeśli zostały one nadpisane lub ukryte. Bez właściwego użycia super mogą wystąpić błędy lub nieprawidłowe zachowanie, na przykład podczas pracy z konstruktorami.
Rozwiązanie:
Dzięki super można:
Przykład:
class Animal { void makeSound() { System.out.println("Animal sound"); } } class Dog extends Animal { void makeSound() { super.makeSound(); // Animal sound System.out.println("Bark"); } }
Kluczowe cechy:
Czy wywołanie super może być niepierwszą linijką konstruktora?
Nie. Wywołanie konstruktora rodzica za pomocą super() musi być pierwszą linijką konstruktora. Jeśli to ograniczenie zostanie naruszone - kompilator zgłosi błąd.
Czy można używać super w metodach statycznych lub kontekście?
Nie. Słowo kluczowe super ma zastosowanie tylko w kontekście nienumerycznym (instancji), ponieważ odnosi się do hierarchii obiektów, a nie klas.
Czy można przez super odwołać się do prywatnej metody rodzica?
Nie. Prywatne metody nie są widoczne dla potomków - nawet przez super. Tylko metody publiczne, chronione i pakietowo-prywatne mogą być dostępne przez super.
Programista zapomina wyraźnie wywołać super() w konstruktorze klasy pochodnej, a klasa nadrzędna nie ma konstruktora domyślnego.
Zalety:
Wady:
Nadpisana metoda w klasie podrzędnej najpierw wywołuje implementację super, a następnie rozszerza ją dodatkową logiką.
Zalety:
Wady: