EMZETT.
Login

Overloading

Kurz: Mehrere Methoden mit demselben Namen, aber unterschiedlicher Parameterliste (Anzahl oder Typ) — Java wählt beim Aufruf automatisch die passende Variante.

Genauer: Der Rückgabetyp allein reicht nicht, um zwei Methoden zu unterscheiden — nur Anzahl/Typ der Parameter zählen für Overloading. Nicht zu verwechseln mit Overriding (Methode einer Oberklasse in einer Unterklasse neu implementieren) — das ist ein anderes Konzept aus Inheritance.

int summe(int a, int b) { return a + b; }
double summe(double a, double b) { return a + b; }

Im Detail

class Rechner {
    int summe(int a, int b) { return a + b; }
    double summe(double a, double b) { return a + b; }
    int summe(int a, int b, int c) { return a + b + c; } // unterscheidet sich durch Anzahl
    String summe(String a, String b) { return a + b; }    // unterscheidet sich durch Typ
}
 
Rechner r = new Rechner();
r.summe(1, 2);          // ruft die (int, int)-Variante
r.summe(1.5, 2.5);      // ruft die (double, double)-Variante
r.summe(1, 2, 3);       // ruft die (int, int, int)-Variante
r.summe("A", "B");      // ruft die (String, String)-Variante
 
// int summe(int x, int y) { ... } // würde NICHT kompilieren - nur der Rückgabetyp
// würde sich von der ersten summe(int,int) unterscheiden, das reicht nicht

Der Compiler entscheidet beim Kompilieren (nicht erst zur Laufzeit), welche überladene Variante zu einem konkreten Aufruf passt — basierend allein auf Anzahl und Typ der übergebenen Argumente. Passen die Argumenttypen nicht exakt, aber es gibt eine kompatible implizite Umwandlung (z. B. int zu double), wählt Java die “nächstliegende” passende Überladung. Wichtig: Overloading ist ein reines Compile-Zeit-Konzept, während Overriding (Methode der Oberklasse in einer Unterklasse neu implementieren, siehe Inheritance) erst zur Laufzeit anhand des tatsächlichen Objekttyps entschieden wird — beide klingen ähnlich, lösen aber unterschiedliche Probleme.

Siehe auch: Methods, Parameters, Constructors