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;
}
}
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.