Konstruktor-Verkettung
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 23 von 87.
Constructor Chaining ist der Prozess des Aufrufens eines Konstruktors von einem anderen. Diese Technik hilft dabei, Code-Duplizierung zu vermeiden, wenn eine Klasse mehrere Konstruktoren hat oder wenn mit Vererbungshierarchien gearbeitet wird.
Innerhalb derselben Klasse können Sie Konstruktoren mit this() verketten. Dies ermöglicht es Ihnen, einen „Haupt“-Konstruktor zu haben, der die gesamte Arbeit erledigt, während andere Konstruktoren einfach an diesen delegieren:
public class Rectangle {
private int width;
private int height;
public Rectangle() {
this(1, 1); // Ruft den Konstruktor mit zwei Parametern auf
}
public Rectangle(int size) {
this(size, size); // Erzeugt ein Quadrat
}
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
}Bei der Vererbung erfolgt die Konstruktorverkettung automatisch. Wenn Sie ein Objekt einer Unterklasse erstellen, ruft Java zuerst den Konstruktor der Elternklasse mit super() auf. Wenn Sie super() nicht explizit aufrufen, fügt Java automatisch super() (die argumentlose Version) ein:
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
System.out.println("Animal constructor");
}
}
public class Dog extends Animal {
private String breed;
public Dog(String name, String breed) {
super(name); // Muss die erste Zeile sein
this.breed = breed;
System.out.println("Dog constructor");
}
}Das Erstellen von new Dog("Buddy", "Labrador") gibt zuerst „Animal constructor“ aus, dann „Dog constructor“. Dies stellt sicher, dass Elternklassen immer ordnungsgemäß initialisiert werden, bevor die Kindklasse ihr eigenes Setup hinzufügt.
Aufgabe
EinfachLassen Sie uns ein Produktbestellsystem erstellen, das das Constructor Chaining sowohl innerhalb einer Klasse als auch über eine Vererbungshierarchie hinweg demonstriert. Sie werden sehen, wie this() Konstruktoren in derselben Klasse verkettet, während super() die Verkettung zu Eltern-Konstruktoren herstellt.
Sie werden drei Dateien erstellen, um Ihren Code zu organisieren:
Product.java: Erstellen Sie eine Elternklasse, die ein beliebiges Produkt in einem Geschäft repräsentiert. Sie sollte Folgendes enthalten:- Private Felder für
name(String) undprice(double) - Einen Hauptkonstruktor, der sowohl den Namen als auch den Preis entgegennimmt, die Felder initialisiert und Folgendes ausgibt:
"Product constructor: " + name - Einen zweiten Konstruktor, der nur den Namen entgegennimmt und über
this(name, 0.0)an den Hauptkonstruktor verkettet, um einen Standardpreis von 0.0 festzulegen - Methoden
getName()undgetPrice(), um auf die Felder zuzugreifen
- Private Felder für
Electronics.java: Erstellen Sie eine Unterklasse, die Product erweitert und Garantieinformationen hinzufügt:- Ein privates Feld für
warrantyYears(int) - Einen Hauptkonstruktor, der Name, Preis und warrantyYears entgegennimmt – verwenden Sie
super(name, price), um die Elternklasse zu initialisieren, setzen Sie dann die Garantie und geben Sie aus:"Electronics constructor: " + warrantyYears + " year warranty" - Einen zweiten Konstruktor, der nur Name und Preis entgegennimmt und über
this(name, price, 1)an den Hauptkonstruktor verkettet, um eine standardmäßige 1-jährige Garantie zu gewähren - Einen dritten Konstruktor, der nur den Namen entgegennimmt und über
this(name, 0.0)an den zweiten Konstruktor verkettet - Eine Methode
getDetails(), die Folgendes zurückgibt:getName() + " - $" + String.format("%.2f", getPrice()) + " (" + warrantyYears + " year warranty)"
- Ein privates Feld für
Main.java: Demonstrieren Sie das Constructor Chaining in Aktion. Sie erhalten drei Eingaben: einen Produktnamen (String), einen Preis (double) und die Garantiejahre (int). Erstellen Sie ein Electronics-Objekt unter Verwendung aller drei Parameter und geben Sie dann das Ergebnis vongetDetails()aus.
Sie erhalten drei Eingaben: den Produktnamen, den Preis und die Garantiejahre.
Formatieren Sie den Preis in getDetails() so, dass 2 Dezimalstellen angezeigt werden, indem Sie String.format("%.2f", price) verwenden. Achten Sie genau auf die Ausgabe – Sie werden sehen, wie die Konstruktormeldungen nacheinander erscheinen und zeigen, wie die Kette von der Eltern- zur Kindklasse fließt!
Spickzettel
Constructor Chaining (Konstruktor-Verkettung) ist der Prozess, bei dem ein Konstruktor von einem anderen aufgerufen wird, um Code-Duplizierung zu vermeiden.
Verkettung innerhalb derselben Klasse
Verwenden Sie this(), um einen anderen Konstruktor in derselben Klasse aufzurufen:
public class Rectangle {
private int width;
private int height;
public Rectangle() {
this(1, 1); // Ruft den Konstruktor mit zwei Parametern auf
}
public Rectangle(int size) {
this(size, size); // Erzeugt ein Quadrat
}
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
}Verkettung bei Vererbung
Verwenden Sie super(), um den Konstruktor der Elternklasse aufzurufen. Dies muss die erste Zeile im Konstruktor sein:
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
System.out.println("Animal constructor");
}
}
public class Dog extends Animal {
private String breed;
public Dog(String name, String breed) {
super(name); // Muss die erste Zeile sein
this.breed = breed;
System.out.println("Dog constructor");
}
}Wenn Sie super() nicht explizit aufrufen, fügt Java automatisch super() (die argumentlose Version) ein. Eltern-Konstruktoren werden immer vor den Kind-Konstruktoren aufgerufen, was eine korrekte Initialisierungsreihenfolge gewährleistet.
Probier es selbst
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Eingaben lesen
String name = scanner.nextLine();
double price = scanner.nextDouble();
int warrantyYears = scanner.nextInt();
// TODO: Erstelle ein Electronics-Objekt unter Verwendung aller drei Parameter
// TODO: Gib das Ergebnis von getDetails() aus
}
}
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