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 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.
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ą, bezparametrową wersję metody. W ramach niej uruchamiamy metodę przeciążającą, do której przekazujemy parametr (w postaci tekstu z opisem):
   
public void setDescription() {
     setDescription("Appa " + id + " description");
}   
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):
   
public void setDescription(String description) {
    setDescription(description, "JavAPPa");
}   
Uruchomienie tej metody skutkuje już wykonaniem finalnej części procesu:
   
public void setDescription(String description, String author) {
    this.description = description + " created by " + author;
}
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:
item1.setDescription("Some description...", "JavAPPa");
item2.setDescription("Another description...", "JavAPPa");
item3.setDescription("And another one...", "JavAPPa");   
Lepiej wywołać naszą drugą metodę:
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ó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:
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
Zdjęcie autora
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, 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: stackshare
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 .


Pozycjonowanie stron: Grupa TENSE