Einfache & mehrstufige Vererbung
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 25 von 87.
Bisher haben wir gesehen, wie Klassen direkt eine Elternklasse erweitern. Aber Vererbung kann verschiedene Strukturen bilden, je nachdem, wie Klassen zueinander in Beziehung stehen. Lassen Sie uns die zwei Hauptmuster untersuchen: Einzelvererbung und mehrstufige Vererbung.
Einfachvererbung ist das, was wir bisher verwendet haben. Eine Klasse erweitert direkt genau eine Elternklasse:
public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }Hier erben sowohl Dog als auch Cat von Animal, aber sie erben nicht voneinander. Jedes Kindelement hat ein direktes Elternelement.
Mehrstufige Vererbung erzeugt eine Kette, in der eine Klasse eine andere Klasse erweitert, die ihrerseits eine weitere Klasse erweitert:
public class Animal {
public void eat() {
System.out.println("Eating");
}
}
public class Mammal extends Animal {
public void breathe() {
System.out.println("Breathing");
}
}
public class Dog extends Mammal {
public void bark() {
System.out.println("Barking");
}
}In dieser Kette erbt Dog von Mammal, welches wiederum von Animal erbt. Ein Dog-Objekt hat Zugriff auf alle Methoden der gesamten Kette:
Dog dog = new Dog();
dog.eat(); // Von Animal
dog.breathe(); // Von Mammal
dog.bark(); // Von DogDenken Sie daran, dass Object an der Spitze jeder Kette steht. So hat unser Dog tatsächlich vier Ebenen: Object -> Animal -> Mammal -> Dog. Die Konstruktor-Verkettung durchläuft all diese Ebenen, wenn ein neues Objekt erstellt wird.
Aufgabe
EinfachLassen Sie uns eine Transporthierarchie aufbauen, die sowohl einfache als auch mehrstufige Vererbungsmuster demonstriert. Sie werden eine Kette von Klassen erstellen, bei der jede Ebene neue Funktionen hinzufügt und zeigt, wie Methoden über mehrere Ebenen hinweg vererbt werden.
Sie werden Ihren Code in vier Dateien organisieren:
Vehicle.java: Erstellen Sie die Basisklasse an der Spitze Ihrer Hierarchie. Jedes Fahrzeug sollte Folgendes haben:- Ein privates Feld für
brand(String) - Einen Konstruktor, der die Marke (brand) akzeptiert
- Eine Methode
getBrand(), die die Marke zurückgibt - Eine Methode
move(), die Folgendes ausgibt:[brand] is moving
- Ein privates Feld für
LandVehicle.java: Erstellen Sie eine Klasse, die Vehicle erweitert und die mittlere Ebene Ihrer mehrstufigen Kette darstellt. Landfahrzeuge fügen bodenspezifisches Verhalten hinzu:- Ein privates Feld für
wheels(int) - Einen Konstruktor, der brand und wheels entgegennimmt und
super(brand)für den Elternteil verwendet - Eine Methode
getWheels(), die die Anzahl der Räder zurückgibt - Eine Methode
honk(), die Folgendes ausgibt:[brand] honks!
- Ein privates Feld für
Car.java: Erstellen Sie eine Klasse, die LandVehicle erweitert und damit Ihre dreistufige Vererbungskette vervollständigt. Autos fügen ihre eigenen spezialisierten Merkmale hinzu:- Ein privates Feld für
model(String) - Einen Konstruktor, der brand, wheels und model entgegennimmt und
super(brand, wheels)verwendet - Eine Methode
getModel(), die das Modell zurückgibt - Eine Methode
displayInfo(), die Folgendes ausgibt:[brand] [model] with [wheels] wheels
- Ein privates Feld für
Main.java: Demonstrieren Sie, wie ein Car-Objekt Zugriff auf Methoden aus allen drei Ebenen der Hierarchie hat. Sie erhalten drei Eingaben: brand (String), wheels (int) und model (String). Erstellen Sie ein Car-Objekt und rufen Sie diese Methoden in der folgenden Reihenfolge auf:move()- geerbt von Vehicle (Großelternteil)honk()- geerbt von LandVehicle (Elternteil)displayInfo()- in Car selbst definiert
Sie erhalten drei Eingaben: den Markennamen (brand), die Anzahl der Räder (wheels) und den Modellnamen (model).
Ihre Ausgabe sollte drei Zeilen zeigen, die demonstrieren, wie das Car-Objekt Methoden von jeder Ebene seiner Vererbungskette nutzen kann - vom übergeordneten Vehicle bis hinunter zu seiner eigenen Klasse!
Spickzettel
Java unterstützt verschiedene Vererbungsstrukturen. Die zwei Hauptmuster sind die Einfachvererbung und die mehrstufige Vererbung.
Einfachvererbung tritt auf, wenn eine Klasse direkt von genau einer Elternklasse erbt:
public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }Sowohl Dog als auch Cat erben von Animal, aber nicht voneinander.
Mehrstufige Vererbung erzeugt eine Kette, in der eine Klasse eine andere Klasse erweitert, welche wiederum eine andere Klasse erweitert:
public class Animal {
public void eat() {
System.out.println("Eating");
}
}
public class Mammal extends Animal {
public void breathe() {
System.out.println("Breathing");
}
}
public class Dog extends Mammal {
public void bark() {
System.out.println("Barking");
}
}Bei der mehrstufigen Vererbung hat eine Kindklasse Zugriff auf alle Methoden der gesamten Vererbungskette:
Dog dog = new Dog();
dog.eat(); // From Animal
dog.breathe(); // From Mammal
dog.bark(); // From DogJede Klassenhierarchie hat Object an der Spitze. Die Konstruktorenverkettung durchläuft alle Ebenen, wenn ein neues Objekt erstellt wird.
Probier es selbst
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Eingaben lesen
String brand = scanner.nextLine();
int wheels = scanner.nextInt();
scanner.nextLine(); // Zeilenumbruch konsumieren
String model = scanner.nextLine();
// TODO: Erstelle ein Car-Objekt mit den Eingabewerten
// TODO: Rufe move() auf - geerbt von Vehicle (Großelternklasse)
// TODO: Rufe honk() auf - geerbt von LandVehicle (Elternklasse)
// TODO: Rufe displayInfo() auf - definiert in Car 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
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