Menu
Coddy logo textTech

Methoden überschreiben (@Override)

Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 22 von 87.

Methoden-Überschreiben ermöglicht es einer Unterklasse, eine eigene Implementierung einer Methode bereitzustellen, die bereits in ihrer Basisklasse definiert ist. Auf diese Weise passen Kindklassen vererbtes Verhalten an ihre spezifischen Anforderungen an.

Wenn Sie eine Methode überschreiben, ersetzt die Version der Unterklasse die Version der Elternklasse für Objekte dieser Unterklasse vollständig. Die Methode muss denselben Namen, Rückgabetyp und dieselben Parameter wie die Elternmethode haben:

public class Animal {
    public void makeSound() {
        System.out.println("Some generic sound");
    }
}

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}

public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow!");
    }
}

Die @Override-Annotation teilt dem Compiler mit, dass Sie beabsichtigen, eine Methode der Elternklasse zu überschreiben. Obwohl sie optional ist, wird sie dringend empfohlen, da der Compiler Fehler erkennt, wenn Sie versehentlich den Methodennamen falsch schreiben oder falsche Parameter verwenden:

@Override
public void makeSound() { }  // Richtig - der Compiler überprüft dies

public void makesound() { }  // Tippfehler! Erstellt eine neue Methode, anstatt sie zu überschreiben

Wenn Sie eine überschriebene Methode aufrufen, führt Java die Version aus, die zum tatsächlichen Objekttyp gehört:

Dog dog = new Dog();
dog.makeSound();  // Ausgabe: Woof!

Cat cat = new Cat();
cat.makeSound();  // Ausgabe: Meow!

Erinnern Sie sich aus der vorherigen Lektion daran, dass Sie super.methodName() innerhalb einer überschriebenen Methode verwenden können, wenn Sie das Verhalten der Elternklasse weiterhin zusammen mit Ihrem neuen Code einbeziehen möchten.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Benachrichtigungssystem erstellen, das demonstriert, wie Unterklassen Methoden der Elternklasse überschreiben können, um ihr eigenes spezialisiertes Verhalten bereitzustellen. Sie werden sehen, wie die @Override-Annotation hilft, Fehler zu vermeiden, und wie jede Unterklasse geerbte Methoden anpassen kann.

Sie werden drei Dateien erstellen, um Ihren Code zu organisieren:

  • Notification.java: Erstellen Sie die Elternklasse, die eine generische Benachrichtigung darstellt. Sie sollte Folgendes enthalten:
    • Ein privates Feld für die message (String)
    • Einen Konstruktor, der die Nachricht akzeptiert
    • Eine Methode getMessage(), die die Nachricht zurückgibt
    • Eine Methode send(), die Folgendes ausgibt: Sending notification: [message]
  • EmailNotification.java: Erstellen Sie eine Unterklasse, die Notification erweitert und anpasst, wie Benachrichtigungen per E-Mail gesendet werden:
    • Ein privates Feld für die recipient E-Mail-Adresse (String)
    • Einen Konstruktor, der sowohl die Nachricht als auch den Empfänger entgegennimmt und super(message) für den Teil der Elternklasse verwendet
    • Überschreiben Sie die send()-Methode unter Verwendung der @Override-Annotation, um Folgendes auszugeben: Emailing [recipient]: [message]
  • Main.java: Demonstrieren Sie, wie derselbe Methodenname je nach Objekttyp unterschiedliches Verhalten erzeugt. Sie erhalten zwei Eingaben: eine Nachricht und eine E-Mail-Adresse. Erstellen Sie sowohl eine reguläre Notification als auch eine EmailNotification mit derselben Nachricht und rufen Sie dann send() für beide auf, um die unterschiedlichen Ausgaben zu sehen.

Sie erhalten zwei Eingaben: die Nachricht (String) und die E-Mail-Adresse des Empfängers (String).

Ihre Ausgabe sollte zwei Zeilen zeigen - zuerst von der send()-Methode der Elternklasse, dann von der überschriebenen Version in EmailNotification. Dies demonstriert, wie das Überschreiben von Methoden es Unterklassen ermöglicht, geerbtes Verhalten durch ihre eigene Implementierung zu ersetzen.

Spickzettel

Methoden-Überschreiben (Method Overriding) ermöglicht es einer Unterklasse, eine eigene Implementierung einer Methode bereitzustellen, die bereits in ihrer Elternklasse definiert ist. Die überschriebene Methode muss denselben Namen, Rückgabetyp und dieselben Parameter wie die Elternmethode haben.

public class Animal {
    public void makeSound() {
        System.out.println("Some generic sound");
    }
}

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}

Die @Override-Annotation ist optional, wird aber dringend empfohlen. Sie teilt dem Compiler mit, dass Sie beabsichtigen, eine Elternmethode zu überschreiben, was hilft, Fehler wie falsch geschriebene Methodennamen oder falsche Parameter zu erkennen:

@Override
public void makeSound() { }  // Korrekt - der Compiler überprüft dies

public void makesound() { }  // Tippfehler! Erstellt eine neue Methode, anstatt sie zu überschreiben

Beim Aufruf einer überschriebenen Methode führt Java die Version aus, die zum tatsächlichen Objekttyp gehört:

Dog dog = new Dog();
dog.makeSound();  // Output: Woof!

Cat cat = new Cat();
cat.makeSound();  // Output: Meow!

Sie können super.methodName() innerhalb einer überschriebenen Methode verwenden, um das Verhalten der Elternklasse zusammen mit Ihrem neuen Code einzubeziehen.

Probier es selbst

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Eingaben lesen
        String message = scanner.nextLine();
        String recipient = scanner.nextLine();
        
        // TODO: Erstelle ein Notification-Objekt mit der Nachricht
        
        // TODO: Erstelle ein EmailNotification-Objekt mit der Nachricht und dem Empfänger
        
        // TODO: Rufe send() für das Notification-Objekt auf
        
        // TODO: Rufe send() für das EmailNotification-Objekt auf
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung