Poprzednio pisaliśmy o przesłanianiu metod. Teraz przyszedł czas na ich przeciążanie. Nie jest to związane bezpośrednio z dziedziczeniem (choć czasem bywa), ale jest bardzo
ważnym elementem programowania w Javie. Przejdźmy od razu do konkretów. Mamy klasę
Item, w której znajdują się trzy pola:
id,
name,
description. W klasie tej przeciążamy metodę
setDescription
oraz metodę konstruującą obiekt (
konstruktor).
Widzimy, że zarówno konstruktor obiektu
Item jak i metoda
setDescription
zostały wpisane do tej samej klasy kilka razy. Różnią się one od siebie jedynie listą parametrów. Jeśli metoda albo konstruktor posiadają
tę samą nazwę, ale różne parametry (różne typy parametrów lub/i liczebność tych parametrów), wówczas takie metody lub konstruktory nazywamy
przeciążonymi.
Appa Notka. Termin przeciążenie jest bardzo często mylony z terminem przesłonięcie. Pamiętajmy, że przesłaniamy metodę,
która znajduje się w nadklasie, natomiast przeciążać możemy metodę znajdującą się zarówno w tej samej klasie jak i w nadklasie!
Innymi słowy, jeśli mamy klasę dziedziczącą z klasy Item, na przykład MovieItem i jedną z powyższych metod setDescription przeniesiemy do tejże klasy, wówczas będzie ona nadal przeciążała metodę z
nadklasy Item. Nie będzie ona przesłaniała metody setDescription z klasy Item, bo posiada inną listę parametrów.
Temat ten jest często poruszany podczas rozmów kwalifikacyjnych, więc warto to dobrze zapamiętać.
Konstruktor wywołujący inny konstruktor
W naszym przykładzie można łatwo zauważyć, że konstruktor przyjmujący jeden parametr w postaci identyfikatora, uruchamia konstruktor z większą listą parametrów.
To jest dosyć często stosowana praktyka.
Przykładowo, jeśli tylko chcemy, możemy utworzyć obiekt klasy
Item,
korzystając z
konstruktora jednoargumentowego, który sam ustawi domyślną wartość dla parametru z nazwą itema (
name).
Jeśli jednak wolimy własnoręcznie nadać nazwę, wtedy wykorzystujemy
konstruktor z dwoma parametrami. Oczywiście możemy wprowadzać konstruktory również z większą ilością parametrów.
W trakcie wywołania jednego konstruktora z drugiego konstruktora nie podajemy nazwy konstruktora.
W zamian za to używamy słowa kluczowego
this. Inaczej jest w przypadku zwykłych metod.
Metoda wywołująca inną metodę
Wywołanie metody przeciążającej z poziomu metody przeciążonej nie wymaga użycia specjalnego słowa kluczowego. Wystarczy użyć nazwy docelowej metody
z wybraną przez nas listą parametrów.
Przyjrzyjmy się teraz dokładnie, jak to wygląda w przypadku kodu naszej klasy
Item.
Najpierw definiujemy podstawową, bezparametrową wersję metody. W ramach niej uruchamiamy
metodę przeciążającą, do której przekazujemy
parametr (w postaci tekstu z opisem):
Co się dzieje dalej? Przyjrzyjmy się wywoływanej metodzie przeciążającej.
W ramach tej metody uruchamiamy
kolejną metodę przeciążającą, tym razem dwuparametrową, gdzie drugi parametr określamy "na sztywno" (
autor JavAPPa):
Uruchomienie tej metody skutkuje już wykonaniem finalnej części procesu:
Wywołanie pierwszej, bezparametrowej metody, zawsze będzie ustawiało ten sam tekst oraz tego samego autora.
Bezpośrednie wywołanie drugiej metody pozwoli zdefiniować tekst, ale autora nie będziemy musieli ustawiać.
Jest to pomocne, gdy chcemy stworzyć kilka obiektów typu
Item i każdy
z nich ma mieć domyślnego autora. Nie ma wtedy sensu za każdym razem pisać tego samego:
Lepiej wywołać naszą drugą metodę:
Podsumowując, możemy stwierdzić, że otrzymaliśmy całkiem użyteczny mechanizm, który pozwala nam upiec dwie pieczenie na jednym ogniu.
Z jednej strony mamy różne metody, których używamy niezależnie, a z drugiej możemy w łatwy sposób łączyć ich wywołania dodając potencjał każdej z nich.
Przykład w programie
Teraz zobaczmy jak kod całego programu wygląda w IDE:
Tak wygląda efekt jego uruchomienia:
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
Czy informacje, które otrzymałeś, były pomocne?
Jeśli tak, zapraszam Cię do podarowania mi kawy.
Masz pytanie dotyczące prezentowanego materiału?
Coś jest dla Ciebie niejasne i Twoje wątpliwości przeszkadzają Ci w pełnym zrozumieniu treści?
Napisz do nas maila, a my chętnie znajdziemy odpowiednie rozwiązanie.
Najciekawsze pytania wraz z odpowiedziami będziemy publikować pod rozdziałem.
Nie czekaj. Naucz się programować jeszcze lepiej.