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 überschreibenWenn 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.
Aufgabe
EinfachLassen 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]
- Ein privates Feld für die
EmailNotification.java: Erstellen Sie eine Unterklasse, die Notification erweitert und anpasst, wie Benachrichtigungen per E-Mail gesendet werden:- Ein privates Feld für die
recipientE-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]
- Ein privates Feld für die
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 dannsend()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 überschreibenBeim 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
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas this-SchlüsselwortMethodenFelder (Attribute)Konstruktor-MethodeKonstruktor-ÜberladungRückblick – Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (extends)Das super-SchlüsselwortMethoden überschreiben (@Override)Konstruktor-VerkettungDie Object-KlasseEinfache & mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-InterfaceZusammenfassung – Benutzerdefiniertes Sortieren2Zugriffsmodifikatoren & Kapselung
Überblick über ZugriffsebenenGetter- und Setter-MethodenInformation HidingDas final-SchlüsselwortRückblick – Bankkonto-Manager5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenZusammenfassung – Formenrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, geschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Sealed Classes (Java 17+)11Design Patterns Teil 1
Einführung in Design PatternsSingleton-PatternFactory-PatternBuilder-PatternObserver-PatternStrategy-Pattern14Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung3Klasseneigenschaften & Statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Zusammenfassung – Zähler & Utility6Interfaces & Abstrakte Klassen
Einführung in InterfacesInterfaces implementierenImplementierung mehrerer InterfacesDefault- & statische Methoden in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesZusammenfassung - Zahlungssystem