Konstruktorverkettung
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 23 von 87.
Konstruktorverkettung ist der Vorgang, einen Konstruktor von einem anderen aus aufzurufen. Diese Technik hilft, Code-Duplikation 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");
}
}Beim Erstellen von new Dog("Buddy", "Labrador") wird zuerst "Animal constructor" und anschließend "Dog constructor" ausgegeben. Dadurch wird sichergestellt, dass übergeordnete Klassen immer ordnungsgemäß initialisiert werden, bevor die Unterklasse ihre eigene Einrichtung hinzufügt.
Aufgabe
EinfachErstelle ein Bestellsystem für Produkte, das die Konstruktorverkettung sowohl innerhalb einer Klasse als auch über eine Vererbungshierarchie hinweg demonstriert. Du wirst sehen, wie this() Konstruktoren in derselben Klasse verkettet, während super() die Verkettung mit Konstruktoren der übergeordneten Klasse herstellt.
Du erstellst drei Dateien, um deinen Code zu organisieren:
Product.java: Erstelle eine übergeordnete Klasse, 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 name und price entgegennimmt, die Felder initialisiert und Folgendes ausgibt:
Product constructor: [name] - Einen zweiten Konstruktor, der nur den Namen entgegennimmt und mit
this(name, 0.0)den Hauptkonstruktor aufruft, um einen Standardpreis von 0.0 festzulegen - Methoden
getName()undgetPrice(), um auf die Felder zuzugreifen
- Private Felder für
Electronics.java: Erstelle eine Unterklasse, die Product erweitert und Garantieinformationen hinzufügt:- Ein privates Feld für
warrantyYears(int) - Einen Hauptkonstruktor, der name, price und warrantyYears entgegennimmt – verwende
super(name, price), um die übergeordnete Klasse zu initialisieren, setze anschließend die Garantie und gib Folgendes aus:Electronics constructor: [warrantyYears] year warranty - Einen zweiten Konstruktor, der nur name und price entgegennimmt und mit
this(name, price, 1)den Hauptkonstruktor aufruft, um eine standardmäßige Garantie von 1 Jahr bereitzustellen - Einen dritten Konstruktor, der nur den Namen entgegennimmt und mit
this(name, 0.0)den zweiten Konstruktor aufruft - Eine Methode
getDetails(), die Folgendes zurückgibt:[name] - $[price] ([warrantyYears] year warranty)
- Ein privates Feld für
Main.java: Zeige die Konstruktorverkettung in Aktion. Du erhältst drei Eingaben: einen Produktnamen (String), einen Preis (double) und die Anzahl der Garantiejahre (int). Erstelle ein Electronics-Objekt mit allen drei Parametern und gib anschließend das Ergebnis vongetDetails()aus.
Du erhältst drei Eingaben: den Produktnamen, den Preis und die Anzahl der Garantiejahre.
Formatiere den Preis in getDetails() so, dass er mit String.format("%.2f", price) mit 2 Dezimalstellen angezeigt wird. Beobachte die Ausgabe aufmerksam – du wirst sehen, dass die Konstruktormeldungen in der richtigen Reihenfolge erscheinen und zeigen, wie die Verkettung von der übergeordneten Klasse zur Unterklasse verläuft!
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 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