Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Lassen 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) und price (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() und getPrice(), um auf die Felder zuzugreifen
  • 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)"
  • 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 von getDetails() 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
    }
}
quiz iconTeste dich 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