Jason. Cała informatyka w jednym miejscu!

Jesteście gotowi na kolejną część materiału o języku Java :)? Zaprezentuję Wam 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 kojarzycie słówko "super"? Musiało się Wam ukazać przed oczami chociaż parę razy. Jeśli skupicie swoją uwagę na tym artykule, dołączycie do grona osób rozumiejących znaczenie tego słowa :D. 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" (jeśli nie rozszerzamy jawnie o inną klasę). Zatem to:

public class MyClass

jest równoznaczne z tym:

public class MyClass extends Object

KOWARIANCJA

Drugie znaczenie: kowariancja typu generycznego. A że dotyczy to typów generycznych, zachęcam do poczytania o teorii stosowania typów generycznych. Mogliście 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>();

Uwaga! Celowo nie wstawiłem otwierającego nawiasu kątowego, bo powstawał problem podczas próby zapisu.

Znak zapytania znany jest pod hasłem "wildcard", czyli "znak wieloznaczny" w znaczeniu dosłownym. Zapis wstawiony powyżej oznaczać będzie możliwość wstawienia typu klasy pochodnej w miejsce typu klasy bazowej. Więcej informacji na ten temat znajduje się w dokumentacji.

Słowo kluczowe "super" w języku Java

"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 kowariancji dla typów generycznych.


Oto dwa miejsca występowań słowa kluczowego "super". Rozumiem, jeżeli to drugie mogło przerazić część z Was, z racji tego że poniekąd wyprzedziłem materiał jaki mam przewidziany w programie :P. Niemniej jednak zachęcam do zainteresowania się typami generycznymi, one naprawdę potrafią ułatwić życie :D!

PODOBNE ARTYKUŁY