Przesłanianie metod

Spis treści

Zadanie

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

Zadanie to miało na celu przetestowanie mechanizmu przeciążania metod, czyli wykorzystywania metod o takiej samej nazwie, ale różnych parametrach. Przykładowe rozwiązanie zadania:

public class Suma{
 	int dodaj(int a, int b){
 		System.out.println("Typ int, parametry int int");
 		return a+b;
 	}
 
 	double dodaj(double a, double b){
 		System.out.println("Typ double, parametry double double");
 		return a+b;
 	}
 
 	int dodaj(int a, int b, int c){
 		System.out.println("Typ int, parametry int int int");
 		return a+b+c;
 	}
 
 	double dodaj(double a, double b, double c){
 		System.out.println("Typ double, parametry double double double");
 		return a+b+c;
 	}
 }

i przykładowa klasa testowa:

public class Test {
 
 	public static void main(String args[]){
 		Suma suma = new Suma();
 		System.out.println(suma.dodaj(10, 20));
 		System.out.println(suma.dodaj(10.0, 20.0));
 		System.out.println(suma.dodaj(10, 20, 30));
 		System.out.println(suma.dodaj(10.0, 20.0, 30.0));
 	}
 }
 

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.

karvis

Mam pytanie zrobilem to zadanie tak : public class Test{ int dodaj(int a,int b){ System.out.println("Zwracany int arg1 int arg2 int"); return a+b; } double dodaj(int a,double b){ System.out.println("Zwracany double arg1 int arg2 double"); return a+b; } double dodaj(double a,double b){ System.out.println("Zwracany double arg1 double arg2 double"); return a+b; } } i druga klase tak : public class Test1{ public static void main(String args[]){ Test liczba = new Test(); System.out.println(liczba.dodaj(10, 20)); System.out.println(liczba.dodaj(10, 20.03)); System.out.println(liczba.dodaj(10.05, 20.6)); } } Dlaczego jako wynik 3 metod wyswietla mi 30.650000000000002 zamiast poprostu 30.65 ? Sory za taki dlugi komentarz ale nie wiem jak to wkleic krocej

Slawek

Zajrzyj tutaj: http://javastart.pl/efektywne-programowanie/javatraps-004/ i powinno być wszystko jasne :)

karvis

Rozumiem :) dzieki za odpowiedz

Greg

moje dwa grosze: public class Dodaj { int dodaj(int a, int b){ return a+b; } double dodaj(double a, double b){ return a+b; } double dodaj(int a, short b){ return a+b; } String dodaj(String a, String b){ return a+b; } void dodaj(String a, int b, String c, int d){ String wynik = a+b+c+d; System.out.println(wynik); } } package cw2_4; public class Test { public static void main(String[] args){ Dodaj suma = new Dodaj(); System.out.println("Typ int(int+int): "+suma.dodaj(2,3)); System.out.println("Typ double(dbl+dbl): "+suma.dodaj(2.0,3.0)); System.out.println("Typ double(int+short): "+suma.dodaj(3, 2)); System.out.println("Typ String(str+str): "+suma.dodaj("xxx", "XXX")); System.out.print("Typ String(str+int+str+int): "); suma.dodaj("ala", 1, "ma", 2); } } ma to sens w przypadku ost przykladu?

Kroot

Dlaczego przeciążanie metod nie działa na metodach o zmiennej liczbie argumentów? Mam dwie takie metody, jedną przyjmującą parametry typu int a drugą typu double. Gdy wywołuję metodę podając parametry typu int, wywala mi błąd że odwołanie pasuje do obu metod. Rozumiem że można przypisywać liczby całkowite jako typy double, ale dlaczego w takim razie nie ma problemu na zwykłych metodach, z ustaloną liczbą parametrów? Oczywiście jak podaję do funkcji liczby zmiennoprzecinkowe to uruchamia odpowiednią metodę i działa.

k2marko

Przy poniższych metodach wyskakuje błąd "nie można skonwertować z int do byte/short" Pytanie dlaczego zmienne są typu int skoro zostały zadeklarowane jako byte/short ? byte dodaj(byte a, byte b){ return a+b; } short dodaj(short a, short b){ return a+b; }

Janosch

k2marko. Sprawa jest tego typu, że Java automatycznie konwertuje zmienne zadeklarowane jako typ: chart, byte, short do typu integer, jeżeli wykryje użycie jakiegoś operatora (np. +, -, *, itp... tutaj masz listę wszystkich). http://www.zie.pg.gda.pl/md/www/materialy/bruski/pierwsza/operatory.html Żeby rozwiązać Twój problem musisz skonwertować wynik, który z automatu jest typu int na taki jaki chcesz by był, w Twoim przypadku będzie to: byte dodaj(byte a, byte b){ return (byte)(a+b); } short dodaj(short a, short b){ return (short)(a+b); }

Stig

Mam pytanko po kompilacji czegoś takiego: package pl.javastart.first; public class test{ public static void main(String[] args){} float suma(float a, float b){ System.out.print("typ float"); return a+b; } int suma(int a, int b){ System.out.print("typ int"); return a+b; } double suma(double a, double b){ System.out.print("typ double"); return a+b; } } package pl.javastart.first; public class testy{ public static void main(String[] args){ test zx = new test(); int zmienna1 = zx.suma(1,2); System.out.println("\n"+zmienna1); double zmienna2 = zx.suma(1.1, 5.14); System.out.println("\n"+zmienna2); float zmienna3 = zx.suma(3, 4); System.out.println("\n"+zmienna3); } } dostaję wynik: typ int 3 typ double 6.24 typ int 7.0 Czy ktoś mógł by mi wytłumaczyć ostatni wynik dlaczego tam stoi int a nie float ?

Lolo

Jest tak ponieważ w linii float zmienna3 = zx.suma(3, 4); wywołujesz tą wersję metody suma: int suma(int a, int b) dzieje się tak, gdyż w argumentach przekazujesz dwie wartości typu int a nie float i dopiero później przypisujesz wynik który Ci zwraca ta metoda(który jest int'em) do zmiennej typu float.