Klausur-Tricks
Trick 1, is-a vs has-a: Vererbung ist "ist ein". Wenn du eher sagen würdest "hat ein", brauchst du Komposition (Feld vom Typ X), nicht Vererbung.
Hund is-a Tier ✓ → Vererbung
Auto has-a Motor ✓ → Komposition (Auto hat ein Motor-Feld)
Auto is-a Motor ✗ → falsche Modellierung
Trick 2, Override-Regel (Java): Eine Methode in der Subklasse überschreibt nur, wenn:
- gleicher Name
- gleiche Parameter-Liste (sonst ist es eine Überladung, anderes Konzept)
- gleicher oder kovarianter Rückgabetyp
- Sichtbarkeit nicht einschränken (z. B. von
public auf protected ist nicht erlaubt)
- geprüfte Exceptions nicht breiter machen
Trick 3, Konstruktor wird NICHT geerbt. Du musst in der Subklasse einen eigenen Konstruktor schreiben und mit super(...) den Basis-Konstruktor aufrufen.
Trick 4, Polymorphie-Vergleich (nur als Sprachen-Vergleich, falls deine Klausur mehrere Sprachen erwähnt):
- Java: dynamic dispatch für überschreibbare Instanzmethoden, nicht für
static/private/final.
- Python: dynamische Methodensuche über die MRO (Method Resolution Order).
- C++: dynamic dispatch nur bei
virtual-Methoden.
Klausur-Frage: "ist equals() in Java polymorph?" → Ja. Da Object.equals() eine public instance method ist (nicht static/private/final), wird sie polymorph überschrieben, z. B. in String, ArrayList, eigenen Klassen.
Trick 5, Diamant-Problem: Mehrfachvererbung von Klassen ist in Java verboten (nur 1 extends). Mehrere Interfaces sind erlaubt; seit Java 8 können Interfaces default-Methoden mit Body haben, bei Konflikten muss die Klasse eindeutig überschreiben oder auflösen. Python erlaubt Mehrfachvererbung. In Python 3 sind alle Klassen new-style, und die MRO (Method Resolution Order, C3-Linearisierung) löst Konflikte über eine feste Suchreihenfolge der Klassenhierarchie. (Python 2 old-style classes nutzten einfache Tiefensuche, sind aber seit 2020 EOL.)
Trick 6, Java spezifisch: Object ist Vater aller Klassen. Jede Klasse erbt implizit von java.lang.Object, daher hat jedes Objekt toString(), equals(), hashCode().
Trick 7, instanceof: prüft den echten Typ zur Laufzeit:
Tier t = new Hund(...);
t instanceof Hund // true, echter Typ ist Hund
t instanceof Tier // true, Hund ist auch ein Tier (Vererbungskette)
t instanceof Katze // false
Wo brauchst du Vererbung & Polymorphie?
- GUI-Frameworks:
Button extends Widget, TextField extends Widget, alle haben render() polymorph
- Game-Entwicklung:
Enemy extends GameObject, viele Enemy-Subtypes mit eigenem update()
- Servlets / Spring:
MyController extends BaseController mit überschriebenen Endpoints
- Sammlungen:
ArrayList implements List, LinkedList implements List, gleiches Interface, andere Implementierung
- Streams in Java:
FileInputStream extends InputStream, BufferedInputStream extends InputStream
Faustregel: Wenn du in der Klausur sagen sollst, ob Vererbung passt, frag dich "ist X ein Y?" Wenn ja, vererbe. Wenn nein, finde was anderes (Komposition, Interface, etc.).