Überschreiben von Methoden (@Override)
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 22 von 87.
Methodenüberschreibung ermöglicht es einer Unterklasse, ihre eigene Implementierung einer Methode bereitzustellen, die bereits in ihrer übergeordneten Klasse definiert ist. Auf diese Weise können Kindklassen das geerbte Verhalten an ihre spezifischen Anforderungen anpassen.
Wenn du eine Methode überschreibst, ersetzt die Version der Unterklasse die Version der Elternklasse für Objekte dieser Unterklasse vollständig. Die Methode muss denselben Namen und dieselben Parameter wie die Methode der Elternklasse sowie einen Rückgabetyp haben, der mit dem der Elternklasse identisch ist (oder ein Untertyp davon):
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 Annotation @Override teilt dem Compiler mit, dass du beabsichtigst, eine Methode der übergeordneten Klasse zu überschreiben. Obwohl sie optional ist, wird sie dringend empfohlen, da der Compiler Fehler erkennt, wenn du versehentlich den Methodennamen falsch schreibst oder die falschen Parameter verwendest:
@Override
public void makeSound() { } // Korrekt – der Compiler überprüft dies
public void makesound() { } // Tippfehler! Erstellt eine neue Methode, anstatt zu überschreibenWenn du eine überschriebene Methode aufrufst, 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!Denke an die vorherige Lektion zurück: Du kannst super.methodName() innerhalb einer überschriebenen Methode verwenden, wenn du das Verhalten des übergeordneten Elements zusammen mit deinem neuen Code weiterhin einbeziehen möchtest.
Aufgabe
EinfachLass uns ein Benachrichtigungssystem erstellen, das demonstriert, wie Unterklassen Methoden der übergeordneten Klasse überschreiben können, um ihr eigenes spezialisiertes Verhalten bereitzustellen. Du wirst sehen, wie die Annotation @Override dabei hilft, Fehler zu erkennen, und wie jede Unterklasse geerbte Methoden anpassen kann.
Du wirst drei Dateien erstellen, um deinen Code zu organisieren:
Notification.java: Erstelle die übergeordnete Klasse, die eine allgemeine Benachrichtigung darstellt. Sie sollte Folgendes enthalten:- Ein privates Feld für die
message(String) - Einen Konstruktor, der die Nachricht entgegennimmt
- 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: Erstelle eine Unterklasse, die Notification erweitert und anpasst, wie Benachrichtigungen per E-Mail gesendet werden:- Ein privates Feld für die E-Mail-Adresse des
recipient(String) - Einen Konstruktor, der sowohl die Nachricht als auch den Empfänger entgegennimmt und
super(message)für den Teil der übergeordneten Klasse verwendet - Überschreibe die Methode
send()mithilfe der Annotation@Override, sodass Folgendes ausgegeben wird:Emailing [recipient]: [message]
- Ein privates Feld für die E-Mail-Adresse des
Main.java: Demonstriere, wie derselbe Methodenname je nach Objekttyp unterschiedliches Verhalten erzeugt. Du erhältst zwei Eingaben: eine Nachricht und eine E-Mail-Adresse. Erstelle sowohl eine reguläre Notification als auch eine EmailNotification mit derselben Nachricht und rufe anschließend bei beidensend()auf, um die unterschiedlichen Ausgaben zu sehen.
Du erhältst zwei Eingaben: die Nachricht (String) und die E-Mail-Adresse des Empfängers (String).
Deine Ausgabe sollte zwei Zeilen enthalten – zuerst die der Methode send() der übergeordneten Klasse und anschließend die der überschriebenen Version in EmailNotification. Dies demonstriert, wie das Überschreiben von Methoden es Unterklassen ermöglicht, geerbtes Verhalten durch ihre eigene Implementierung zu ersetzen.
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: Create a Notification object with the message
// TODO: Create an EmailNotification object with the message and recipient
// TODO: Call send() on the Notification object
// TODO: Call send() on the EmailNotification object
}
}
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 Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – ZahlungssystemÜbe selbstständig: Online-Java-Compiler