Kurs Java

Przeciążanie metod (Overloading)

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).
public class Item {

    int id;
    String name;
    String description;
    
    public Item(int id) {
    	this(id, "Appa Item no. " + id);
    }
    
    public Item(int id, String name) {
    	this.id = id;
    	this.name = name;
    }
    
    public void setDescription() {
    	setDescription("Appa " + id + " description");
    }
    
    public void setDescription(String description) {
    	setDescription(description, "JavAPPa");
    }
    
    public void setDescription(String description, String author) {
    	this.description = description + " created by " + author;
    }
    
    public String getName() {
    	return name;
    }
    
    public String getDescription() {
    	return description;
    }
}
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 liczebość tych parametrów), wówczas takie metody lub konstruktory nazywamy przeciążonymi.

Ciekawostka. 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. Takie rozwiązanie powoduje, że jeśli tylko chcemy to 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 chcemy 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.
public class Item {

    int id;
    String name;
    String description;
    
    public Item(int id) {
        this(id, "Appa Item no. " + id);
    }
    
    public Item(int id, String name) {
        this.id = id;
        this.name = name;
    }
    
    ...
}
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ą wersję metody. W ramach niej uruchamiamy metodę przeciążającą, do której za każdym razem przekażemy ten sam parametr (w postaci tekstu z opisem), więc ostatecznie nasze pole description zawsze będzie wyglądało tak samo.
   
public void setDescription() {
    setDescription("Appa " + id + " description");
}   
Co się jednak dzieje dalej? Przyjrzyjmy sie wywoływanej tutaj metodzie:
   
public void setDescription(String description) {
    setDescription(description, "JavAPPa");
}   
W ramach tej metody uruchamiamy metodę przeciążającą określając "na sztywno" parametr o nazwie autor. Wywołanie metody zawsze będzie skutkowało ustawieniem autora o nazwie JavAPPa. Innymi słowy wywołując tę metodę nie musimy się martwić o ustawianie autora własnoręcznie. 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ć:
item1.setDescription("Some description...", "JavAPPa");
item2.setDescription("Another description...", "JavAPPa");
item3.setDescription("And another one...", "JavAPPa");   
Wtedy wystarczy:
item1.setDescription("Some description...");
item2.setDescription("Another description...");
item3.setDescription("And another one...");   
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óre używamy niezależnie, a z drugiej możemy w łatwy sposób łączyć ich wywołania wykorzystując potencjał każdej z nich.

Przykład w programie

Teraz zobaczmy jak kod naszego programu wygląda w IDE:
public class Start {

    public static void main(String[] args) {
        
        Item item = new Item(1);
        System.out.println(item.getName());
        
        Item item2 = new Item(2, "Appa Item no. 2");
        System.out.println(item2.getName());
        
        item.setDescription();
        System.out.println(item.getDescription());
        
        item2.setDescription("Appa 2 description");
        System.out.println(item2.getDescription());        
    }
}
Tak wygląda efekt jego uruchomienia:
Przeciążenie konstruktora i metody - program
Linki
https://www.javatpoint.com/method-overloading-in-java
Masz pytanie dotyczące tego rozdziału? Zadaj je nam!
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.
kursjava@javappa.com

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy:
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .