Menu
Coddy logo textTech

Das super-Schlüsselwort

Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 21 von 87.

Das Schlüsselwort super bietet eine Möglichkeit für eine Unterklasse, auf ihre Elternklasse zu verweisen. Es ist essenziell, wenn Sie auf Member oder Konstruktoren der Elternklasse aus einer Kindklasse heraus zugreifen müssen.

Die häufigste Verwendung von super ist der Aufruf des Konstruktors der Elternklasse. Dies muss die erste Anweisung im Konstruktor der Unterklasse sein:

public class Vehicle {
    private String brand;
    
    public Vehicle(String brand) {
        this.brand = brand;
    }
    
    public String getBrand() {
        return brand;
    }
}

public class Car extends Vehicle {
    private int doors;
    
    public Car(String brand, int doors) {
        super(brand);  // Muss die erste Zeile sein
        this.doors = doors;
    }
}

Sie können auch super verwenden, um Methoden der Elternklasse aufzurufen, was besonders nützlich ist, wenn die Unterklasse eine Methode mit demselben Namen hat:

public class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

public class Cat extends Animal {
    public void makeSound() {
        super.makeSound();  // Ruft die Version von Animal auf
        System.out.println("Meow!");
    }
}

Betrachten Sie super als das Gegenteil von this. Während sich this auf das aktuelle Objekt bezieht, bezieht sich super auf den Teil der Elternklasse dieses Objekts. Diese Unterscheidung wird entscheidend, wenn Klassenhierarchien erstellt werden, in denen Kindklassen das Verhalten der Elternklasse erweitern und nicht vollständig ersetzen müssen.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Gerätesystem bauen, das demonstriert, wie Kindklassen super verwenden können, um Eltern-Konstruktoren aufzurufen und das Verhalten von Eltern-Methoden zu erweitern.

Sie werden drei Dateien erstellen, um Ihren Code zu organisieren:

  • Appliance.java: Erstellen Sie die Elternklasse, die ein beliebiges Haushaltsgerät repräsentiert. Sie sollte Folgendes enthalten:
    • Ein privates Feld für die Marke des Geräts brand (String)
    • Ein privates Feld für wattage (int)
    • Einen Konstruktor, der beide Werte akzeptiert und sie initialisiert
    • Eine Methode getBrand(), die die Marke zurückgibt
    • Eine Methode getWattage(), die die Wattzahl zurückgibt
    • Eine Methode getInfo(), die Folgendes zurückgibt: [brand] - [wattage]W
  • WashingMachine.java: Erstellen Sie eine Unterklasse, die Appliance erweitert. Eine Waschmaschine hat alles, was ein Gerät hat, plus ihre eigenen speziellen Merkmale:
    • Ein privates Feld für capacity (int), das die Ladekapazität in kg darstellt
    • Einen Konstruktor, der brand, wattage und capacity entgegennimmt - verwenden Sie super(brand, wattage), um den Eltern-Teil zu initialisieren, und setzen Sie dann die Kapazität
    • Eine Methode getCapacity(), die die Kapazität zurückgibt
    • Eine Methode getInfo(), die die getInfo() der Elternklasse mittels super.getInfo() aufruft und diese erweitert, um Folgendes zurückzugeben: [parent info], Capacity: [capacity]kg
  • Main.java: Erstellen Sie eine WashingMachine und zeigen Sie deren vollständige Informationen an. Sie erhalten drei Eingaben: die Marke (String), die Wattzahl (int) und die Kapazität (int). Geben Sie das Ergebnis des Aufrufs von getInfo() für Ihre Waschmaschine aus.

Sie erhalten drei Eingaben: Markenname, Wattzahl und Kapazität.

Beachten Sie, wie super hier zwei Zwecken dient: dem Aufruf des Eltern-Konstruktors zur Initialisierung geerbter Felder und dem Aufruf der Methode der Elternklasse, um auf deren Verhalten aufzubauen, anstatt es vollständig zu ersetzen.

Spickzettel

Das Schlüsselwort super referenziert die Elternklasse aus einer Unterklasse heraus.

Verwenden Sie super(), um den Konstruktor der Elternklasse aufzurufen. Dies muss die erste Anweisung im Konstruktor der Unterklasse sein:

public class Vehicle {
    private String brand;
    
    public Vehicle(String brand) {
        this.brand = brand;
    }
}

public class Car extends Vehicle {
    private int doors;
    
    public Car(String brand, int doors) {
        super(brand);  // Muss die erste Zeile sein
        this.doors = doors;
    }
}

Verwenden Sie super.methodName(), um Methoden der Elternklasse aufzurufen. Dies ist nützlich, wenn die Unterklasse eine Methode überschreibt:

public class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

public class Cat extends Animal {
    public void makeSound() {
        super.makeSound();  // Ruft die Version von Animal auf
        System.out.println("Meow!");
    }
}

super bezieht sich auf den Teil eines Objekts, der zur Elternklasse gehört, während this sich auf das aktuelle Objekt bezieht.

Probier es selbst

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Eingaben lesen
        String brand = scanner.nextLine();
        int wattage = scanner.nextInt();
        int capacity = scanner.nextInt();
        
        // TODO: Erstelle ein WashingMachine-Objekt mit den Eingabewerten
        
        // TODO: Gib das Ergebnis des Aufrufs von getInfo() für die Waschmaschine 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