Jason. Cała informatyka w jednym miejscu!

Materiał stanowić będzie kontynuację jednego z poprzednich tematów wprowadzających Czytelnika do metod w języku Java. Ma również związek z dziedziczeniem z uwagi na możliwość definiowania niestandardowych implementacji mając nadal tę część wspólną. Sprawdźmy co nam daje przesłanianie metody w języku Java i co to takiego jest 😀!

PRZESŁANIANIE METODY W JĘZYKU JAVA TO ZWIĘKSZENIE PROFESJONALIZMU W KODZIE

Wyjaśnimy sobie na sam początek termin, bo "przesłanianie" może na pierwszy rzut oka wyglądać komicznie 😊. Bywają często takie sytuacje, w których klasy potomne powinny wykonywać inne instrukcje niż te, jakie dostarcza nam klasa bazowa. Na przykład jedna osoba może spędzać cały dzień na spacerze, a ktoś kto pracuje na etacie, wykonuje przez ten dzień swoje obowiązki w firmie. Może trafić się również taki człowiek, który pracuje na pół etatu i wykonuje wspomniane czynności jedna po drugiej (odstawiamy na bok skrócony czas na te czynności 🙂).

Gdybyśmy chcieli to przedstawić w kodzie źródłowym, to właśnie przyjdzie nam z pomocą przesłanianie metody w języku Java 😇! Przesłanianie polega na tym, że klasa potomna zawierająca metodę, może sobie "zamienić" domyślne instrukcje na całkiem inny blok kodu, a potem w chwili jej wywołania poprzez instancję, zostanie wykonana ta przesłonięta wersja! Określa się to "przesłanianiem" (także "nadpisywaniem"), ponieważ to w gruncie rzeczy przypomina "zasłonięcie" pierwotnego bloku instrukcji do wykonania na coś zupełnie innego, choć nie musimy rezygnować kompletnie z pierwotnych instrukcji - więcej o dostępnych kombinacjach w dalszym ciągu 😉.

PRÓBKA KODU

Zbierzmy sobie to do kupy. Mamy klasę dla osoby, która spaceruje całymi dniami:

public class Person {
	public void spendDay() {
		System.out.println("Spaceruję.");
	}
}

Potrzebujemy też klasy dla osoby pracującej komercyjnie, zatem będzie to klasa potomna:

public class FullTimeWorkingPerson extends Person {
	public void spendDay() {
		System.out.println("Pracuję na pełen etat.");
	}
}

No i jeszcze trzecia osoba pracująca na pół etatu 👌:

public class HalfTimeWorkingPerson extends Person {
	public void spendDay() {
		System.out.println("Pracuję na pół etatu.");
		System.out.println("Spaceruję.");
	}
}

Mamy duplikację! To jest zawsze źle postrzegane i nie możemy sobie pozwolić na niepotrzebne pisanie tego samego w tym samym miejscu o tym samym kontekście.

NIE DUPLIKUJ, TYLKO PRZESŁOŃ

Zastosuj w takim wypadku przesłanianie metody w języku Java 🌟! Popatrz jak to się robi:

public class HalfTimeWorkingPerson extends Person {
	@Override
	public void spendDay() {
		System.out.println("Pracuję na pół etatu.");
		super.spendDay();
	}
}

Kiedy chcesz tylko dołożyć nowe instrukcje do już istniejącego zestawu, lecz nie chcesz z niego rezygnować, wystarczy że podstawisz takie oto wywołanie:

super.spendDay();

Słowo kluczowe "super" jest ważnym hasłem w języku Java i oznacza odwołanie się do klasy bazowej. Jednym ze znaczeń jest "wejście" do bazowej wersji metody, czyli tej z klasy bazowej i wykonanie wszystkich zawartych tam instrukcji. Konkretniej, to tego:

public void spendDay() {
	System.out.println("Spaceruję.");
}

To jest jedna możliwość przesłaniania, czyli takie przesłanianie addytywne 😄. Od razu piszę, że nie da się wykonać powiedzmy 3/4 instrukcji, a resztę odrzucić - wtedy już musimy część powielić, chociaż wtedy aż się prosi o utworzenie sobie nowej metody tylko z tymi instrukcjami, które na 100% mają być wykonywane 😎.

A co, jeżeli chcemy całkowicie przesłonić domyślne instrukcje? A pamiętasz treść tej drugiej klasy?

public class FullTimeWorkingPerson extends Person {
	@Override
	public void spendDay() {
		System.out.println("Pracuję na pełen etat.");
	}
}

Po prostu piszesz swoje, tylko już bez wywołania tamtej metody 😁!

ADNOTACJA "OVERRIDE"

Zwróć koniecznie uwagę na zapis jaki został wstawiony nad nagłówkiem przesłanianej metody:

@Override

"Override" jest specjalnym oznaczeniem, który oznacza przesłanianie metody w języku Java. Dla porządku, ono nie jest wymagane i kompilator dopuści do uruchomienia kodu, jednak wysoce zalecam stosować tę etykietę dla zachowania porządku i zostawienia informacji dla samego siebie, że ta metoda została przesłonięta świadomie i my o tym wiemy 👍.

RAZ TO ZALECENIE, RAZ TO KONIECZNOŚĆ

Kilka krótkich zdań o tym, kiedy możemy przesłonić metodę, kiedy nie możemy...oraz kiedy musimy 😯!

  • MUSIMY, kiedy klasa potomna dziedziczy od klasy abstrakcyjnej i zawiera w sobie metodę abstrakcyjną, ponieważ kompilator musi zapewnić, że na czas uruchomienia programu każda instancja będzie posiadała własny zestaw instrukcji (nawet jeśli pusty),
  • MOŻEMY, kiedy klasa potomna ma dostęp do danej metody (jeżeli modyfikator dostępu jest inny niż prywatny), a metoda nie jest oznaczona jako finalna,
  • NIE MOŻEMY, kiedy klasa potomna nie ma dostępu do metody bądź jest finalną.

Finalna metoda to synonim metody "stałej" czy też niezmiennej. Żadna klasa potomna nie może zmienić implementacji metodzie finalnej - pozwól, że odeślę do odrębnego artykułu 😊. Tyle!

Przesłanianie metody w języku Java

Przesłanianie metody w języku Java polega na nałożeniu nowej niestandardowej implementacji dla klas potomnych powodując, że zmieniamy blok instrukcji przy użyciu tej samej sygnatury metody.


Zdecydowanie warto poznać ten mechanizm jak on działa i jak z niego korzystać, bo to też stanowi podstawę ☝!

PODOBNE ARTYKUŁY