Ü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));6.58.0Bei 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
- Ein Aufruf mit zwei Argumenten: total(2.5, 4.0).
- Es gibt zwei Methoden mit einem Namen. Der Compiler zählt die Argumente: zwei. Die Methode mit zwei Parametern passt.
- Die Argumente kommen in a und b. Die Methode gibt 6.5 zurück.
- Jetzt sind es drei Argumente.
- Die andere Methode passt, die mit drei Parametern. Sie gibt 8.0 zurück.
- 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);5 ist ein int, 5.0 ist ein double. Und 7 / 2 teilt zwei ganze Zahlen: Das Ergebnis ist die ganze Zahl 3, also wird die Methode für int aufgerufen.
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 beiden Methoden haben dieselben Parameter (int percent) und unterscheiden sich nur im Typ des Ergebnisses. Beim Aufruf discount(15) kann der Compiler nicht wählen. Der zweite Name muss ein anderer sein, zum Beispiel discountRate.
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());11.09.990.0Die 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;
}double... prices: die drei Punkte nach dem Typ.Ü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.
max(3, 8)max(4, 9, 2)max(2.5, 1.5)892.52. Notendurchschnitt. Die Methode average(int... grades) gibt den Durchschnitt beliebig vieler Noten zurück, und ohne Noten gibt sie 0 zurück.
average(5, 6, 4)average(6, 5)average()5.05.50.03. 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.
Kaffee x 2Croissant x 1Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: Schleifen · Arrays · Methoden · Parameter und return
- Geht weiter in: Konstruktoren und this · OOP-Prinzipien · HashMap und HashSet · Composite
- Aufgaben zum Thema: Methoden