Ausgabe beim Overloading

Hallo zusammen,

ich habe folgenden Code:

Java:
 public static double f(double a, double b) {
            return a + b; 
}


    public static double f(double a, int b) {
        return a * b;
    }
        public static void main(String[] args) {
            System.out.println(f(1, 3));
            System.out.println(f(1, 3f));
            System.out.println(f(0b1001, 3));
        }

Die Ausgabe ist in der Reihenfolge:

3.0
4.0
27.0

Ich suche vergebens nach einer Begründung wieso jeweils die Methoden aufgerufen werden und hoffe, dass mir hierbei jemand weiterhelfen kann.
Vielen Dank.
 
Die beiden Methoden unterscheiden sich nur durch den zweiten Parameter. Der ist einmal ein double und einmal ein int.

Bei den Aufrufen ist der erste Parameter immer ein int. Sowohl 1 ist ein int Literal als auch 0b1001 (Letzteres ist nur eben in binary Schreibweise - 1001 ist 1 + 8 = 9. Ein int kann verlustfrei in ein double umgewandelt werden, daher ist eine automatische Konvertierung möglich.

Der Zweite Parameter ist im ersten Aufruf 3 -> ein int Literal. Daher wird die zweite Methode aufgerufen mit dem int Parameter.

Beim zweiten Aufruf ist 3f ein float Literal. float kann nicht implizit in ein int umgewandelt werden aber es kann implizit in einen double umgewandelt werden. Daher der erste Aufruf.

Beim dritten Aufruf ist es so wie im ersten Aufruf.

Hier kommen also mehrere Punkte zum tragen aus der JLS.
  • man muss die Literale kennen - also den Typ erkennen können.
  • man muss die impliziten Konvertierungen kennen

Ob man das gerade am Anfang in der JLS nachlesen will? Aber diese Dinge wird man bestimmt auch in vielen Tutorials gut erklärt bekommen.
 

Zurück
Oben