Szkolenia programowania we Wrocławiu
Kurs Java Podstawy - rozszerzony

Przeciążanie metod

Poprzednia lekcja kursu nauczyła nas, że 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;
  }
}

Natomiast niepoprawne są na przykład:

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

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

Zadania do samodzielnego wykonania:

2.4 Napisz program składający się z dwóch klas. Pierwsza niech zawiera kilka metod o nazwie dodaj(), ale zwracających różne typy wyników i przyjmujących po minimum dwa parametry typów liczbowych wybranych przez Ciebie. Ich zadaniem jest zwrócenie, lub wyświetlanie sumy podanych argumentów. W drugiej klasie Testowej utwórz obiekt tej klasy i sprawdź działanie swoich metod, wyświetlając wyniki działań na ekranie. Dodatkowo każda z metod niech wyświetla swój typ zwracany i rodzaj argumentów, abyś wiedział, która z nich zadziałała.

Rozwiązanie.

<- Poprzednia LekcjaNastępna Lekcja ->

Komentarze

Komentarze zamknięte. Zapraszamy do grupy na Facebooku
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?

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.

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ę;)

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.