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.
Aufgabe
EinfachLassen 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
- Ein privates Feld für die Marke des Geräts
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 diegetInfo()der Elternklasse mittelssuper.getInfo()aufruft und diese erweitert, um Folgendes zurückzugeben:[parent info], Capacity: [capacity]kg
- Ein privates Feld für
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 vongetInfo()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
}
}
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