Przeciążanie metod

Metody mogą przyjmować różne rodzaje parametrów. Zarówno typy proste jak i obiektowe, w różnej ilości, lub wcale. Tym razem zajmiemy się zagadnieniem, które nazywa się przeciążaniem metod (ang. Overloading ). Pozwala to najprościej mówiąc na tworzenie metod o takich samych nazwach, ale różnych parametrach. Analogicznie nieprawidłowe jest utworzenie w jednej klasie dwóch metod o identycznej nazwie i przyjmującej takie same parametry, a także metody o takiej samej nazwie i parametrach, ale różniące się tylko zwracanym typem. Poprawna jest więc poniższa klasa:

class Test{
  int dodaj(int a, int b){
    return a+b;
  }

  double dodaj(double a, double b){
    return a+b;
  }
}

Kurs Java

Natomiast niepoprawnesą na przykład:

class Test2{
  int dodaj(int a, int b){
    return a+b;
  }

  double dodaj(int a, int b){
    return a+b;
  }
}

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.

Poniżej znajdziesz archiwalne wpisy z czasów, gdy strona była jeszcze hobbystycznym blogiem.

szeri

Jak to zrobić z użyciem BidDecimal?

szeri

ok już wiem :)

Krzysiek

To może byś zarzucił krótkim przykładzikiem i podzieliłbyś się z innymi, bo mnie te wielkie liczby strasznie irytują, krótko mówiąc są upierdliwe;)

kamel

W pierwszej klasie: BigDecimal dodaj(BigDecimal a, BigDecimal b){ System.out.println("Zwracany typ: BigDecimal"); return a.add(b); } W drugiej klasie(przykładowe wywołanie): Klasa1 obiekt = new Klasa1(); System.out.println(obiekt.dodaj(BigDecimal.valueOf(6324329941.545351435),BigDecimal.valueOf(56546084565.34234423)));

Kamil

Tak się zastanawiam po co przeciążać metody? jaki ma to cel?

krzysiek

Przeciążanie metod, oprócz tego co napisał już Sławek z tym kołem, jest strategicznie ważne w programowaniu obiektowym. Bez tego nie mógłbyś dziedziczyć z żadnej klasy abstrakcyjnej, ani implementować żadnego interfejsa. A jeśli chodzi o wygodę związaną z przeciążaniem metod, to bardzo sobie ją cenię w tak zwanych klasach adapterach (np. MouseInputAdapter). Również np. tworzenie WŁASNYCH komponentów (przycisków, etykiet itd) bez przeciążenia metody paintComponent byłoby praktycznie pisaniem wszystkiego od początku.

krzysiek

Sorry pomieszałem trochę Overloading z Overrides, ale może komuś ten komentarz też się przyda;) Overloading to to o czym jest napisane w tej lekcji i z tym kołem, a Overriding to metoda w klasie dziedziczącej "nadpisująca" metodę o tej samej nazwie i argumentach w klasie z której dziedziczy. Pewnie dowiecie się o tym później z tego kursu;) A ja już może lepiej więcej nic nie komentuję;)

Slawek

Dodanie dodatkowej funkcjonalności. Najprostszy przykład - chcąc stworzyć obiekt klasy Koło fajnie jest mieć możliwość wywołania konstruktora zarówno z parametrami (Point p, int promień), jak i (int X, int Y, int promień). Kod jest bardziej uniwersalny i dajesz większe możliwości osobom, które z niego będą korzystały.

karpiu

przeciążanie metod jest przydatne, prosty przykład: kalkulator, po wprowadzeniu przez użytkownika dwóch wartości, program sam sobie wybierze odpowiednią metodę do obliczeń

Michał

trochę nieścisłości, ale rozumiem, że argument MUSI się różnić, zwracany typ niekoniecznie? tj. może być class Test{ int dodaj(int a, int b){ return a+b; } int dodaj(double a, double b){ return a+b; } } ?

Przemek

Przy przeładowaniu zwracany typ nie ma znaczenia. Ważne są jedynie kolejność i typy argumentów: np dopuszczalne jest: private int dodaj(int x, double y){}; oraz poprawne jest: private int dodaj(double x, int y){};

Przemek

rozpędziłem się, a zwracany typ przy sumie tych obiektów powinien być double. Ciała klasy nie pisałem wraz z "return", gdyż chciałem podkreślić tylko ideę przeładowania z różnymi parametrami.

FAN

zadanie "domowe" bardzo pouczające. Szczególnie przy wprowadzaniu "literałów" - dodaj(1.2,12) - obie liczby zostały potraktowane jako double. Świetny kurs. Bardzo podoba mi się, że lekcje są krótki i zwięzłe. A najlepsze są zadania do samodzielnego rozwiązania. Dziękuję bardzo

Mateusz

Linki "poprzednia lekcja" przenoszą o dwie lekcje do tyłu ;)

Gapcio

Bo to chodzi o lekcję "Argumenty metod" dla tego przenosi tam ( bynajmniej ja tak to rozumiem :) )

k2marko

Czy w ramach Overloadingu mogę zmieniać również instrukcje (a nie tylko parametry) różnych metod o takiej samej nazwie? Czy jest to dopuszczalne?

Filip

Możesz zmieniać instrukcje, JEŚLI zmienisz też parametry.