Jesteście gotowi na następną część z tematu dziedziczenia? Podnosimy poprzeczkę i zaprezentuję Wam kolejne słowo kluczowe umożliwiające łączenie przesłaniania metody z wywoływaniem jej "wersji pierwotnej". Dziedziczenie w języku Java to jeden z szerszych tematów który co gorsza, jest elementarną podstawą do umiejętnego wykorzystywania paradygmatu obiektowego.

DZIEDZICZENIE W JĘZYKU JAVA. ODWOŁYWANIE SIĘ DO KLASY DZIEDZICZĄCEJ

Czy kojarzycie słówko "super"? Musiało się Wam przewinąć 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. Jednym zdaniem, to pozwala na 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ę (np. "saySomething"), jedna dziedziczy od drugiej i ta dziedzicząca od drugiej posiada przesłoniętą metodę o tej samej nazwie, to wyrażenia:

saySomething();

oraz

super.saySomething();

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 z której się dziedziczy, wyszukanie tej samej metody i wykonanie instrukcji znajdujących się w klasie bazowej (nadrzędnej). Dziedziczenie w języku Java 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 i wykonać "pierwowzór" za jednym zamachem!

Wspomniałem też coś o konstruktorach: owszem. To również dotyczy konstruktorów i one też mają związek ze słowem "super". Natomiast wtedy to jest zupełnie inna postać rzeczy. Po pierwsze, konstruktor 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 listą parametrów. Wszystko się wyjaśni jak zobaczycie poniższy kod.

WYKORZYSTYWANIE "SUPER" W PRAKTYCE

Podsumujmy te wiadomości w miarę zwięzłym kodem źródłowym. Dziedziczenie w języku Java pozwala używać "super" zarówno w kontekście metod, jak i konstruktorów klasy bazowej. Wystarczy tylko opanować kilka zasad składniowych:

  • KLASA "Main"
public class Main
{
	public static void main(String[] args)
	{
		Warrior w = new Warrior();

		w.setLevel(86);
	}
}
  • KLASA "Character"
public abstract class Character
{
	private int level;

	public Character(int level)
	{
		setLevel(level);
	}

	public void setLevel(int level)
	{
		this.level = level;
	}
}
  • KLASA "Warrior"
public class Warrior extends Character
{
	public Warrior()
	{
		super(1);
	}

	@Override
	public void setLevel(int level)
	{
		super.setLevel(level);
		System.out.println("\"Warrior\" teraz ma poziom " + level + ".");
	}
}

Funkcja "setLevel" domyślnie tylko nadpisuje daną składową. Aby nie tracić znaczenia nazwy metody, przesłanianie odwołuje się do klasy bazowej, wykonuje instrukcje, a następnie wraca i dodaje nowe polecenia, w tym przypadku komunikat. Dodam, że jeśli w klasie "Character" zamienicie metodę "setLevel" na zwykłe przypisanie wartości do zmiennej "level", to wówczas zobaczycie tylko jeden tekst zamiast dwóch. Wiecie już dlaczego?

"super" i dziedziczenie w języku Java

"super" umożliwia sięgnięcie "wstecz" do klasy nadrzędnej i wywołanie tamtejszych metod lub konstruktorów.


Jest już trochę trudniej, prawda? Zbliżamy się do końca tego długiego wątku, jutro dalszy ciąg zabaw w dziedziczenie!

PODOBNE ARTYKUŁY