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;
}
}
Komentarze do artykułu
Wyłączyliśmy możliwość dodawania komentarzy. Poniżej znajdziesz archiwalne wpisy z czasów gdy strona była jeszcze hobbystycznym blogiem. Zapraszamy natomiast do zadawnia pytań i dyskusji na naszej grupe na facebooku.
Jak to zrobić z użyciem BidDecimal?
ok już wiem :)
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;)
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)));
Tak się zastanawiam po co przeciążać metody? jaki ma to cel?
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.
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ę;)
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.
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ń
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; } } ?
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){};
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.
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
Linki "poprzednia lekcja" przenoszą o dwie lekcje do tyłu ;)
Bo to chodzi o lekcję "Argumenty metod" dla tego przenosi tam ( bynajmniej ja tak to rozumiem :) )
Czy w ramach Overloadingu mogę zmieniać również instrukcje (a nie tylko parametry) różnych metod o takiej samej nazwie? Czy jest to dopuszczalne?
Możesz zmieniać instrukcje, JEŚLI zmienisz też parametry.