Zum Inhalt
wannacode

Überladen

Kurz gesagt: Überladen heißt, mehrere Methoden mit demselben Namen und verschiedenen Parametern zu haben; der Compiler wählt anhand der Anzahl und der Typen der Argumente, welche aufgerufen wird.

Problem

Zwei Artikel, drei Artikel

Die Kasse muss die Preise der Artikel addieren. Manchmal sind es zwei, manchmal drei. Die Methode meint in beiden Fällen dasselbe: „addieren“. Wie schreibst du sie für beide Fälle, ohne Namen wie total2 und total3 zu erfinden?

Ein Hinweis: Du benutzt schon eine Methode, die Verschiedenes nimmt. System.out.println gibt 5, 2.5 und auch Text aus. Wie macht sie das?

Die Idee

Ein Name, verschiedene Parameter

Zwei Methoden dürfen denselben Namen haben, wenn sich ihre Parameter unterscheiden: in der Anzahl, im Typ oder in der Reihenfolge. Das nennt man Überladen (overloading).

static double total(double a, double b) {
return a + b;
}
static double total(double a, double b, double c) {
return a + b + c;
}
System.out.println(total(2.5, 4.0));
System.out.println(total(2.5, 4.0, 1.5));
Ausgabe
6.5
8.0

Bei jedem Aufruf schaut der Compiler auf die Argumente und wählt die Methode, die passt. Zwei Argumente: die erste Methode. Drei: die zweite. Deshalb funktioniert println auch mit allem: Es sind viele Methoden mit einem Namen.

static double total(double a, double b) {
return a + b;
}
static double total(double a, double b, double c) {
return a + b + c;
}
System.out.println(total(2.5, 4.0));
System.out.println(total(2.5, 4.0, 1.5));
Schritt für Schritt, in Worten
  1. Ein Aufruf mit zwei Argumenten: total(2.5, 4.0).
  2. Es gibt zwei Methoden mit einem Namen. Der Compiler zählt die Argumente: zwei. Die Methode mit zwei Parametern passt.
  3. Die Argumente kommen in a und b. Die Methode gibt 6.5 zurück.
  4. Jetzt sind es drei Argumente.
  5. Die andere Methode passt, die mit drei Parametern. Sie gibt 8.0 zurück.
  6. Ein Name, zwei Methoden. Die Argumente entscheiden, welche aufgerufen wird.

Probier es aus

Welche Methode?

Was gibt das Programm aus?

static void describe(int x) {
System.out.println("ganz: " + x);
}
static void describe(double x) {
System.out.println("dezimal: " + x);
}
describe(5);
describe(5.0);
describe(7 / 2);
Antwort

Probier es aus

Finde den Fehler

Das Programm lässt sich nicht kompilieren. In welcher Zeile liegt das Problem?

Wähle die Zeile mit dem Fehler.

Die Idee

Beliebig viele Argumente

Und wenn es fünf Artikel sind? Zwanzig? Du schreibst nicht für jede Anzahl eine Methode. Du sagst, dass die Methode beliebig viele Argumente eines Typs nimmt:

static double total(double... prices) {
double sum = 0;
for (double p : prices) {
sum += p;
}
return sum;
}
System.out.println(total(1.5, 2.0, 3.5, 4.0));
System.out.println(total(9.99));
System.out.println(total());
Ausgabe
11.0
9.99
0.0

Die drei Punkte nach dem Typ (double... prices) bedeuten: „Übergib so viele Zahlen, wie du willst.“ In der Methode kommen sie als Array an, das auch leer sein kann.

Genauer, für Neugierige
  • Es kann nur einen solchen Parameter geben, und er muss der letzte sein: print(String title, double... prices).
  • Gibt es eine Methode mit genau zwei Parametern und auch eine mit beliebig vielen, geht ein Aufruf mit zwei Argumenten an die erste. Die genaue Übereinstimmung gewinnt.

Probier es aus

Was fehlt?

static double total(double prices) {
    double sum = 0;
    for (double p : prices) {
        sum += p;
    }
    return sum;
}

Übung

Ein Name, mehrere Methoden

1. Die größte. Schreib drei Methoden mit einem Namen, max: für zwei ganze Zahlen, für drei ganze Zahlen (sie ruft die erste zweimal auf) und für zwei Dezimalzahlen.

Aufrufe
max(3, 8)
max(4, 9, 2)
max(2.5, 1.5)
Ausgabe
8
9
2.5

2. Notendurchschnitt. Die Methode average(int... grades) gibt den Durchschnitt beliebig vieler Noten zurück, und ohne Noten gibt sie 0 zurück.

Aufrufe
average(5, 6, 4)
average(6, 5)
average()
Ausgabe
5.0
5.5
0.0

3. Eine Zeile auf dem Bon. printLine(String item, int qty) gibt „Kaffee x 2“ aus. Füge printLine(String item) für einen einzelnen Artikel hinzu. Sie wiederholt den Code nicht: Sie ruft die erste Methode mit 1 auf.

Ausgabe
Kaffee x 2
Croissant x 1

Test

Teste dich

1. Wann dürfen zwei Methoden in einer Klasse denselben Namen haben?
2. Wie wählt der Compiler, welche der überladenen Methoden er aufruft?
3. Was ist double... prices in der Methode?
4. Was davon lässt sich NICHT kompilieren?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·