Szkolenia programowania we Wrocławiu
Kurs Java Podstawy - rozszerzony

Rozwiązanie 2.4

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

Komentarze

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