Jesteś gotowy(-a) na kolejną część materiału o języku Java 😄? Zaprezentuję Ci kolejne słowo kluczowe umożliwiające m.in. wywoływanie "pierwotnej" wersji przesłanianej metody. Jest nim "super" w języku Java. Ma to po części związek z wątkiem dziedziczenia, ale jaki konkretny to już zapraszam do środka!
"SUPER" W JĘZYKU JAVA. JEDNO SŁOWO, WIELE ZNACZEŃ
Czy kojarzysz słówko "super" 🙃? Musiało Ci się ukazać przed oczami chociaż parę razy. Jeżeli skupisz swoją uwagę na tym artykule, dołączysz do grona osób rozumiejących znaczenie tego słowa 😁. Tutaj stoimy na rozdrożu.
ODWOŁYWANIE SIĘ DO KLASY BAZOWEJ
Pierwsze znaczenie: odwoływanie się do metod i konstruktorów dotyczących klasy, od której się dziedziczy. Zakładając, że są dwie klasy posiadające tę samą metodę, jedna dziedziczy od drugiej i ta dziedzicząca od drugiej posiada przesłoniętą metodę o tej samej nazwie, to wyrażenia:
doSomething();
oraz
super.doSomething();
będą znaczyły coś innego. Pierwsze wywołanie spowoduje wykonanie instrukcji tej przesłoniętej metody, a drugie wywołanie spowoduje "powrócenie" do klasy, od której się dziedziczy, wyszukanie tej samej metody i wykonanie instrukcji znajdujących się w klasie bazowej (nadrzędnej)! Dziedziczenie pozwala posunąć się dalej przez co można połączyć jedno z drugim i dzięki temu wykonać parę własnych instrukcji w przesłoniętej metodzie ORAZ wykonać "pierwowzór" za jednym zamachem 😎! Konkretnie, to chodzi mi o to:
public class ChildClass extends BaseClass {
@Override
public void doSomething() {
super.doSomething();
// własne instrukcje
}
}
KONSTRUKTOR KLASY BAZOWEJ
Wspomniałem też coś o konstruktorach: owszem. To również dotyczy konstruktorów i one też mają związek ze słowem "super" w języku Java 😊. Wówczas mamy do czynienia z wywołaniem konstruktora klasy bazowej zgodnego z listą parametrów!
public class ChildClass extends BaseClass {
public ChildClass() {
super(); // wywołanie konstruktora bezargumentowego (jeżeli nie istnieje, błąd kompilacji!)
}
}
Są dwie zasady, których musimy przestrzegać. Po pierwsze, wywołanie konstruktora klasy bazowej musi być pierwszą instrukcją w konstruktorze klasy, która ją wywołuje, a po drugie, używamy samego słowa "super" wraz z parą nawiasów okrągłych dla parametrów. Nie piszemy nazwy klasy jak przy tworzeniu instancji ⛔!
Tak na marginesie jeszcze dopiszę, że "łańcuch" wywołań konstruktorów nie kończy się na naszej klasie "najbardziej ogólnej", tylko na "ukrytej" klasie "Object", "matce" wszystkich obiektów. W chwili tworzenia własnej klasy, wykonywane jest niejawne rozszerzanie o klasę "Object", tak samo jakbyśmy dopisali "extends Object" i to się dzieje za każdym razem, jeżeli nie rozszerzamy jawnie o inną klasę ✅. Zatem to:
public class MyClass
jest równoznaczne z tym:
public class MyClass extends Object
KONTRAWARIANCJA
Drugie znaczenie: kontrawariancja typu generycznego. A że dotyczy to typów generycznych, zachęcam do poczytania o teorii stosowania typów generycznych. Mogłeś(-aś) zobaczyć słowo "super" w języku Java wewnątrz nawiasów kątowych. Coś takiego jak to:
ArrayList< ? super Integer> list = new ArrayList<Object>();
Znak zapytania znany jest pod hasłem "wildcard", czyli "znak wieloznaczny" w znaczeniu dosłownym. Zapis wstawiony powyżej oznaczać będzie ograniczenie nadtypu, czyli możliwość wstawienia typu klasy od podanego, do jej klasy bazowej, którą na końcu zawsze będzie "Object". To tylko jedna z różnic, a po szczegóły zapraszam do załączonego artykułu.
![]() |
"super" w języku Java umożliwia sięgnięcie "wstecz" do klasy nadrzędnej i wywołanie tamtejszych metod lub konstruktorów. Słowo kluczowe można też znaleźć podczas definiowania kontrawariancji z użyciem typu wieloznacznego ("wildcard").
Oto dwa miejsca występowania słowa kluczowego "super". Rozumiem, jeżeli to drugie mogło Cię przerazić z racji tego, że poniekąd wyprzedziłem materiał jaki mam przewidziany w programie 😝. Niemniej jednak zachęcam do zainteresowania się typami generycznymi, one naprawdę potrafią ułatwić życie 😄!
NASTĘPNY ARTYKUŁ: Archiwum JAR w języku Java. Uruchamianie z wiersza poleceń