Bibliothek

Fach wählen

Themen

Vererbung und Polymorphismus

Vererbung – Wiederverwendung von Code

Die Vererbung erlaubt es, neue Klassen auf Basis bestehender Klassen zu definieren. Die abgeleitete Klasse (Unterklasse, Subklasse) erbt alle Attribute und Methoden der Basisklasse (Oberklasse, Superklasse) und kann sie erweitern oder überschreiben. Vererbung modelliert eine Ist-eine-Beziehung: ein Hund ist ein Tier.

Java-Beispiel: Tier → Hund / Katze
public class Tier {
    protected String name;

    public Tier(String name) { this.name = name; }

    public String laut() { return "..."; }   // wird überschrieben

    public String vorstellen() {
        return "Ich bin " + name + " und sage " + laut();
    }
}

public class Hund extends Tier {
    public Hund(String name) { super(name); }

    @Override
    public String laut() { return "Wuff!"; }
}

public class Katze extends Tier {
    public Katze(String name) { super(name); }

    @Override
    public String laut() { return "Miau!"; }
}

Das Schlüsselwort extends drückt die Vererbung aus, super(name) ruft den Oberklassen-Konstruktor auf, @Override markiert das Überschreiben.

Polymorphismus und dynamisches Binden

Unter Polymorphismus versteht man, dass eine Variable vom Typ Tier sowohl ein Hund- als auch ein Katze-Objekt halten kann. Beim Aufruf von laut() wird zur Laufzeit die Methode der tatsächlichen Klasse aufgerufen – das nennt man dynamisches Binden.

Tier[] tiere = { new Hund("Bello"), new Katze("Mimi") };
for (Tier t : tiere) {
    System.out.println(t.vorstellen());
}
// Ich bin Bello und sage Wuff!
// Ich bin Mimi und sage Miau!

In Java sind alle nicht-statischen Methoden standardmäßig virtuell, also überschreibbar. Mit final kann man dies verbieten.

Python-Beispiel
class Tier:
    def __init__(self, name):
        self.name = name

    def laut(self):
        return "..."

    def vorstellen(self):
        return f"Ich bin {self.name} und sage {self.laut()}"

class Hund(Tier):
    def laut(self):
        return "Wuff!"

class Katze(Tier):
    def laut(self):
        return "Miau!"

for t in [Hund("Bello"), Katze("Mimi")]:
    print(t.vorstellen())

In Python ist jede Methode automatisch überschreibbar; super().__init__(...) ruft den Oberklassen-Konstruktor auf.

Eigenschaften und Anwendung

Vererbung ermöglicht Wiederverwendung und Erweiterbarkeit: neue Tierarten lassen sich hinzufügen, ohne bestehenden Code zu ändern. Polymorphismus ist die Grundlage von Frameworks (z. B. Listen, die beliebige Objekttypen enthalten). In großen Projekten reduziert sie Redundanz drastisch.

Häufige Fehler

Falsche Vererbungsrichtung (Hund erbt von Mensch), zu tiefe Hierarchien, vergessenes super(...) im Konstruktor, Überschreiben mit anderer Signatur (in Java würde das eine Überladung statt Überschreibung sein), und Verwechslung von Klassen- und Instanzkontext.

Zusammenfassung: Vererbung gibt einer Subklasse alle Attribute und Methoden der Oberklasse. Polymorphismus erlaubt es, überschriebene Methoden zur Laufzeit dynamisch aufzurufen.

Abitur-Tipp: Bei Polymorphismus-Aufgaben immer eine Tabelle anlegen: statischer Typ – dynamischer Typ – tatsächlich aufgerufene Methode.