Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hey,
was genau ist die Signatur einer Methode?
Zum Beispiel bei
Code:
public double kontostand(double gehalt, double abzüge){
return 0:
}
Wäre hier " kontostand(double gehalt, double abzüge)" bereits die Signatur?
"Pro Klasse darf es nur eine Methode mit derselben Signatur geben, sonst meldet der Compiler einen Fehler."
Das stimmt doch nicht so ganz, oder? Der Davorige Satz lautet nämlich:
Der Methodenname und die Parameterliste bestimmen die Signatur einer Methode; der Rückgabetyp gehört nicht dazu.
(Quelle: http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_02_008.htm)
Ich könnte ja die Methode überladen, also in dem fall:
Code:
public int kontostand(double gehalt, double abzüge){
return 0:
}
und es dürfte keinen Compilerfehler geben? Und da der Rückgabetyp nicht dazu gehört, gibt es ja dann 2 Signaturen mit denselben Namen.
Du hast da einen kleinen Denkfehler
Selbst schon richtig wiedergegeben: "Pro Klasse darf es nur eine Methode mit derselben Signatur geben", zur Signatur gehören Methodenname sowie die Parameterliste.
Natürlich wird es bei deinem Beispiel einen Fehler von Compiler geben, da du ja eine doppelte Signatur hast (Name und Parameterliste sind gleich, nur der Rückgabetype ist ein anderer).
Hast du probiert diesen Code schonmal zu kompilieren?
public int kontostand(double gehalt, double abzüge, double irgendwas){
return 0:
}
Für solche Fälle benutzt man dann verschiedene Signaturen, indem man einfach den Namen der Methode ändert und aus der einen Methode möglicherweise die andere aufruft.
Java:
public int kontostandAlsGanzzahl(double gehalt, double abzüge){
return (int)kontostandAlsFließkomma(gehalt, abzüge);
}
Java:
public double kontostandAlsFließkomma(double gehalt, double abzüge){
return 0:
}
@Joose jap, hab ich, und der Compiler zeigt auch einen Fehler an^^ aber da die Theorie besagt, dass der Rückgabewert nicht mitzählt, bin ich davon ausgegangen das es in der Theorie ein Widerspruch ist.
Also bedeutet Überladen einer Methode entweder mehrere oder weniger Paramenter in eine Methode mit demselben Methodennamen zu übergeben, oder den Methodennamen umzuändern mit denselben Parametern?
Okay, mmh nur mal so aus Neugier, mit dem Scanner kann ich ja wenn das Programm läuft zum Beispiel einen/mehrere Wert/e einlesen.
gleich mal ein Beispiel zu dem Code jetzt:
Code:
Main-Methode:
Scanner scan = new Scanner(System.in);
double gehalt= scan.nextDouble();
double abzüge = scan.nextDouble();
//und unten hab ich dann die Methode
public static double konotauszug(double gehalt, double abzüge){
return 0;
}
geht das denn auch mit Datentypen?
Also ob es eine Methode gibt das ich was in den Parameter eingebe, ohne das der Datentyp vorher schon bekannt ist?
Ja, das geht, dann musst du aber eine Fallunterscheidung machen.
Meistens versucht man das aber vorher schon abzufrühstücken.
Deine Methode könnte z.B einfach den Übergabeparameter (Object gehalt) erhalten.
Dann müsstest du allerdings mit if(gehalt instanceof double) usw. prüfen was du genau machen willst.
Falls du den Rückgabewert allerdings auch noch generisch haben willst wird es etwas komplizierter.
okay, ab jetzt wirds für mich etwas unverständlich
Aber kann man rein Theoretisch dann so Methoden auch überladen?
Ich dachte mir hierbei, dass man die variablen nicht umändert, bloß den Datentyp.
Weil ja double gehalt nicht dasselbe ist wie int gehalt
Ja man kann theoretisch für statt konkreten Datentypen einfach Object als Typ wählen -> dann kann man Objekte egal von welchem Typ übergeben und in der Methode selbst mittel instanceOf prüfen.
ACHTUNG: primitive Datentypen kann man aber da nicht übergeben!
Auch gibt es Generic, aber das wäre etwas weit vorgegriffen für dich.
Du musst auch bedenken es macht keinen Sinn jede Methode zu überladen nur weils es möglich wäre, es sollte auch einen Sinn haben
Bei deiner Methode "kontoAuszug" sehen ich nicht viel Sinn, da ein double sowie so ungeeignet ist um einen Betrag abzuspeichern. Und bei einem cast zwischen diesen beiden Datentypen geht die Genauigkeit verloren. Schwupps hat man mehr oder weniger als erwartet am Konto.
Ein gutes Beispiel für Überladung mit unterschiedlichen Datentypen ist die Methode "abs" in der Klasse "Math". Oder aber auch "valueOf" von der Klasse "String".
Also bedeutet Überladen einer Methode entweder mehrere oder weniger Paramenter in eine Methode mit demselben Methodennamen zu übergeben, oder den Methodennamen umzuändern mit denselben Parametern?
Also bevor sich hier jemand vergaloppiert: Das ändern eines Methodennamens hat dann nichts mehr mit Überladen zu tun. Das ist dann schlicht und einfach eine neu, andere, nicht überladene Methode