Lädt...

Überladung in Java

Lege in einer Klasse zwei Methoden an, die beide den Namen paint tragen. Ein Kopf ist static void paint(String word). Der andere ist static void paint(int n). Die Körper sind kurz: der erste druckt word, der zweite druckt n. Aus main rufe paint("ok"); und danach paint(3); auf. Der Bildschirm soll zwei Zeilen zeigen: zuerst ok, dann 3. Java behandelt das zweite paint nicht als Konflikt. Es sieht die beiden Köpfe als unterschiedliche Methoden, weil die Parameterlisten sich unterscheiden. Genau dieser gemeinsame Name mit unterschiedlichen Listen ist der Lehrstoff dieser Seite.

Gleicher Name, andere Listen

Bisher bekam jede neue Idee einen frischen Methodennamen: ring, greet, twice. Hier bleibt der Name absichtlich paint. Was sich ändert, steht zwischen den runden Klammern. Eine Liste hält ein String. Eine andere hält ein int. Der Compiler behält beide, weil diese Listen nicht gleich sind.
Lege eine kleine Programmdatei namens Sign.java an. Die public class in der ersten Zeile muss zum Dateinamen passen: public class Sign. Lass keinen älteren Box- oder Tip-Klassennamen in dieser Datei; der Compiler erwartet, dass Klassenname und Dateiname übereinstimmen.
Außerhalb von main, aber noch innerhalb der Klassenklammern, schreibe beide paint-Köpfe. Behalte auf dieser Seite void: jeder Körper druckt, und nichts muss über return zu main zurückkommen. Der erste Körper nutzt System.out.println(word);. Der zweite nutzt System.out.println(n);. Speichere die Datei vor dem Kompilieren. Das vollständige erste Programm steht in der nächsten Box.

Sign.java mit zwei paint-Methoden

Das ist die Version, die du zuerst kompilierst. main hält zwei Aufrufe. Die Klasse hält zwei paint-Methoden mit demselben Namen.

paint String and paint int

java
public class Sign {
    public static void main(String[] args) {
        paint("ok");
        paint(3);
    }

    static void paint(String word) {
        System.out.println(word);
    }

    static void paint(int n) {
        System.out.println(n);
    }
}

Aus dem Ordner, der Sign.java enthält, führe javac Sign.java aus. Wenn runde Klammern, geschweifte Klammern und Semikolons passen, schreibt javac keine eigene Zeile. Dann führe java Sign aus — nicht java Sign.java. Lass die Endung .java beim zweiten Befehl weg. Dieselben zwei Befehle funktionieren unter Windows und macOS. Das Programm soll zwei Zeilen drucken und stoppen: ok dann 3. Es soll dich nicht tippen lassen. Wenn das Terminal auf Tastatureingabe wartet, steckt noch ein nextLine-Aufruf aus einer älteren Übung in der Datei. Lösche diesen Aufruf und behalte die beiden paint-Aufrufe plus die beiden paint-Methoden oben.
Gehe den Lauf einmal der Reihe nach durch. Java startet bei main. Der erste Aufruf ist paint("ok"). Das Argument ist ein String, also führt Java den Körper aus, der String word nimmt, und druckt ok. Der zweite Aufruf ist paint(3). Das Argument ist ein int, also führt Java den Körper aus, der int n nimmt, und druckt 3. Der Name paint ist beide Male gleich. Die Liste in den Klammern wählt den Körper.
Wenn beide Zeilen ok zeigen, hast du vielleicht nur die String-Methode gelassen und für jeden Aufruf ein festes Wort gedruckt. Wenn beide Zeilen 3 zeigen, hast du vielleicht nur die int-Methode gelassen. Behalte beide Köpfe. Wenn javac meldet, dass paint schon definiert ist, prüfe, ob beide Köpfe dieselbe Liste haben — zum Beispiel zwei Kopien von paint(String word). Überladung braucht einen echten Unterschied in der Liste, nicht eine zweite Kopie desselben Kopfes nur mit anderem Parameternamen.

Eine zweite Liste mit zwei Wörtern

Auch die Parameteranzahl kann sich unterscheiden. Füge eine dritte Überladung hinzu, die zwei String-Werte nimmt und sie in einer Zeile mit einem Leerzeichen druckt. Lass die ersten beiden paint-Methoden stehen. Rufe die neue Form aus main nach den früheren Aufrufen auf, oder starte ein frisches main, das sich nur auf diese Form konzentriert, während du sie lernst.

paint two Strings

java
public class Sign {
    public static void main(String[] args) {
        paint("hi", "sam");
    }

    static void paint(String a, String b) {
        System.out.println(a + " " + b);
    }
}

Kompiliere und führe nach dem Speichern erneut aus: javac Sign.java, dann java Sign. Der Bildschirm soll eine Zeile zeigen: hi sam. Der Aufruf hat zwei Argumente. Die Methode hat zwei Parameter. Diese Übereinstimmung reicht, damit Java diesen Körper wählt. Wenn du die früheren paint(String word) und paint(int n) noch in derselben Klasse hast, darfst du sie behalten. Ein Aufruf mit zwei String-Werten wählt nicht die einargumentige String-Methode, weil die Anzahlen sich unterscheiden.
Wenn du alle drei Überladungen zur Übung in einer Datei hast, kann main jede Form in einer eigenen Zeile aufrufen. Ein Aufruf mit einem String geht weiterhin zu paint(String word). Ein Aufruf mit einem int geht weiterhin zu paint(int n). Ein Aufruf mit zwei String-Werten geht zu paint(String a, String b). Der gemeinsame Name löscht diese Unterschiede nicht.

Leere Liste neben einer String-Liste

Eine Methode mit leeren Klammern ist ebenfalls eine andere Liste. Du kannst paint() ohne Parameter neben paint(String word) behalten. Der leere Aufruf paint(); führt den Körper mit leerer Liste aus. Der Aufruf paint("go"); führt den String-Körper aus.

paint empty and paint String

java
public class Sign {
    public static void main(String[] args) {
        paint();
        paint("go");
    }

    static void paint() {
        System.out.println("ready");
    }

    static void paint(String word) {
        System.out.println(word);
    }
}

Nach javac Sign.java und java Sign soll der Bildschirm in der ersten Zeile ready und in der zweiten go zeigen. Der erste Aufruf hat nichts zwischen den Klammern, also passt er zu paint(). Der zweite Aufruf schickt ein String, also passt er zu paint(String word). Eine Umbenennung in paintReady würde auch kompilieren, aber das ist eine andere Fertigkeit. Diese Seite behält den Namen paint und lässt die Listen den Unterschied tragen.

Welcher Aufruf führt welchen Kopf aus

Lies die Aufrufe neben den Köpfen. Die Argumentliste im Aufruf muss zur Parameterliste im Kopf passen. Auf dieser Anfängerform zählen Typ und Anzahl.

📊 call beside matching paint

Aufruf in main Kopf, der läuft Bildschirmzeile
paint("ok"); paint(String word) ok
paint(3); paint(int n) 3
paint("hi", "sam"); paint(String a, String b) hi sam
paint(); paint() ready

Ein häufiger Fehler ist, zwei Methoden zu schreiben, die beide paint(String word) sagen, und zu erwarten, die zweite zähle als Überladung. Nur den Parameternamen zu paint(String label) zu ändern erzeugt für den Compiler keine neue Liste. Hier zählen Typ und Anzahl. Ein anderer Fehler ist paint(true) aufzurufen, obwohl du nie eine boolean-Parameterliste geschrieben hast. Dann findet javac kein passendes paint. Füge einen Kopf hinzu, der den gewünschten Typ nimmt, oder ändere den Aufruf auf einen Typ, den du schon unterstützt.
System.out.println("paint"); in main druckt das Wort paint. Es ruft keine Methode auf. Behalte paint("ok");, wenn du die String-Überladung willst. Ein übrig gebliebenes twice aus einer alten Box-Datei in Sign.java kann den Bildschirm verwirren, wenn main noch twice(7) druckt. Räume main auf die paint-Aufrufe, die du testest, und behalte nur die paint-Überladungen, die du für diesen Lauf brauchst.
Verschachtele keine paint-Methode in den Klammern von main. Methoden sitzen in der Klasse neben main. Zwei Überladungen sind zwei Geschwistermethoden in demselben Klassenkörper.

Vor scope

Du kannst einen Methodennamen und mehrere Parameterlisten in derselben Klasse behalten. Java wählt den Körper anhand der Argumentliste des Aufrufs. Der Bildschirm zeigt die Zeile des passenden Körpers. Zwei Köpfe mit derselben Liste sind keine Überladungen. Die nächste Seite ist scope; dort siehst du, welche Namen innerhalb einer Methode sichtbar sind und welche draußen bleiben.

🧠 Testen Sie Ihr Wissen

Bereit zum Start

Testen Sie Ihr Wissen

Fordern Sie sich mit diesem interaktiven Quiz heraus und sehen Sie, wie gut Sie das Thema verstehen

❓
5
Fragen
🎯
70%
Zum Bestehen
♾️
∞
Zeit
🔄
∞
Versuche

📝 Anweisungen

  • Lesen Sie jede Frage sorgfältig
  • Wählen Sie die beste Antwort für jede Frage
  • Sie können das Quiz so oft wiederholen, wie Sie möchten
  • Ihr Fortschritt wird oben angezeigt