EMZETT.
Login

super-Keyword

Kurz: Eine Referenz auf die Oberklasse innerhalb einer Unterklasse — ermöglicht Zugriff auf überschriebene Methoden oder Felder der Oberklasse, auch wenn die Unterklasse eigene, gleichnamige Versionen definiert hat.

Genauer: Häufig genutzt in Konstruktoren von Unterklassen, um zuerst den Konstruktor der Oberklasse aufzurufen und deren Initialisierung zu übernehmen, bevor die Unterklasse ihre eigenen zusätzlichen Felder setzt. Ohne super in einer überschriebenen Methode wäre die ursprüngliche Implementierung der Oberklasse aus der Unterklasse heraus nicht mehr erreichbar.

Im Detail

class Tier {
    String name;
    Tier(String name) {
        this.name = name;
    }
    void beschreibe() {
        System.out.println("Ich heiße " + name);
    }
}
 
class Hund extends Tier {
    String rasse;
    Hund(String name, String rasse) {
        super(name);           // ruft den Konstruktor von Tier auf
        this.rasse = rasse;
    }
    void beschreibe() {
        super.beschreibe();     // ruft die ORIGINAL-Methode von Tier auf
        System.out.println("Ich bin ein " + rasse);
    }
}

Zwei Haupteinsatzzwecke von super:

  • super(...) als Konstruktoraufruf: Muss (falls verwendet) die allererste Anweisung im Konstruktor der Unterklasse sein — die Oberklasse muss vollständig initialisiert sein, bevor die Unterklasse mit ihrer eigenen Initialisierung beginnt. Ruft man super(...) nicht explizit auf, fügen viele Sprachen automatisch einen impliziten Aufruf des parameterlosen Oberklassen-Konstruktors ein — existiert dieser nicht (z. B. weil die Oberklasse nur einen Konstruktor MIT Parametern anbietet), ist ein expliziter super(...)-Aufruf zwingend nötig.
  • super.methode() als Methodenaufruf: Ruft gezielt die Version der Oberklasse auf, auch wenn die Unterklasse dieselbe Methode überschrieben hat — nützlich, um das ursprüngliche Verhalten zu ERWEITERN statt komplett zu ersetzen (wie im Beispiel oben: Hund fügt seine eigene Ausgabe zur geerbten Basis-Beschreibung hinzu, statt sie zu ersetzen).

Ohne super.methode() in einer überschriebenen Methode wäre die ursprüngliche Implementierung der Oberklasse aus der Unterklasse heraus faktisch verloren — man müsste ihren gesamten Code duplizieren, statt ihn wiederzuverwenden, was dem Grundgedanken der Vererbung widersprechen würde.

Siehe auch: Inheritance, Constructors, this-Keyword