MINT üben

Vererbung

Dreißig Übungen zu Vererbung — von „ist ein“ und extends über super bis zum Überschreiben.

Dein Fortschritt:
0 / 0 Aufgaben
1

Übungsaufgaben

Dreißig Übungen in gemischter Reihenfolge — du klickst, ziehst, ordnest, rechnest und knobelst. Jede Übung gibt dir sofort eine Rückmeldung, und zu jeder Aufgabe gibt es zwei gestufte Tipps: Der erste zeigt die Richtung, der zweite den entscheidenden Schritt. Die Chips zeigen das Anforderungsniveau: AFB I heißt wiedergeben und direkt anwenden, AFB II selbst entscheiden und verknüpfen, AFB III begründen, beurteilen oder eine Falle durchschauen. Aufgaben mit dem Chip Mix verbinden Wissen aus früheren Unterkapiteln, bei Trick steckt eine Falle drin. Fährst du über ein unterstrichenes Arbeitswort, siehst du, was es genau von dir verlangt.

A1
Je …, desto …
AFB II

Erläutere die Zusammenhänge rund um Vererbung, indem du jeden Satz durch Klicken auf die farbigen Wörter richtig einstellst.

Klicke auf die farbig hinterlegten Wörter: Jeder Klick schaltet zur nächsten Möglichkeit weiter. Stelle jeden Satz so ein, dass er stimmt. Tastatur: Tab zum Wort, Enter/Leertaste oder ↑/↓ schaltet um.

Je öffentliche Methoden die Oberklasse hat, desto Methoden kennt ein Objekt der Unterklasse.

In einem Klassenkopf steht die Unterklasse dem Wort extends.

Ein Methoden-Aufruf wirkt : Die Oberklasse kennt Methoden ihrer Unterklasse .

super(…) steht im Konstruktor der Unterklasse .

Alles Öffentliche der Oberklasse kommt zur Unterklasse hinzu. Im Kopf steht erst die Unterklasse, dann extends, dann die Oberklasse. Die Oberklasse kennt nichts von dem, was erst in einer Unterklasse hinzukommt. Und super(…) muss immer die erste Zeile des Konstruktors sein.
Ansatz: Setze kleine Beispiele ein: eine Oberklasse mit drei Methoden, eine Unterklasse mit einer neuen.
Weiter: Beim ersten Satz gibt es zwei richtige Einstellungen — beide Hälften müssen zueinander passen.
A2
Welche Version läuft?
AFB II

Interpretiere jeden Aufruf: Trage ein, aus welcher Klasse die Methode drucke() stammt, die dabei läuft, und womit die Ausgabe endet. Es gilt Drucker d = new Drucker(); und Farbdrucker f = new Farbdrucker();:

public class Drucker {
    public String drucke() { return "schwarz-weiß"; }
    public String test() { return "Test: " + drucke(); }
}

public class Farbdrucker extends Drucker {
    @Override
    public String drucke() { return super.drucke() + ", farbig"; }
}
Setze für jede Zeile die Ausgänge: Klick auf ein Feld schaltet ? → Zustand 1 → Zustand 2 … weiter. Tastatur: Enter/Leertaste schaltet, Pfeiltasten wandern durch die Tabelle.
Aufrufdrucke() ausAusgabe endet mit
d.drucke()
f.drucke()
d.test()
f.test()
Beim Aufruf zählt die Klasse des Objekts. test() steht nur in Drucker, ruft aber drucke() des jeweiligen Objekts auf: Beim Farbdrucker läuft darum auch dort die überschriebene Version. Sie hängt mit super die Ausgabe der Oberklasse vorn an.
Ansatz: Frage zuerst: Mit welcher Klasse wurde das Objekt erzeugt?
Weiter: test() wird nicht überschrieben — aber was ruft es auf?
A3
Stimmt's? — Die Nachrichten-App
AFB I

In einer Messenger-App gilt class Sprachnachricht extends Nachricht. Die Oberklasse hat das private Attribut absender und den öffentlichen Getter getAbsender(). Gib für fünf Aussagen an, ob sie stimmen.

Fünf Aussagen nacheinander. Eine falsche Einschätzung reicht — dann startest du die Serie mit „Neue Runde“ neu.
Aussage 1 von 5

Geerbt wird alles — aber private bleibt privat, auch vor der eigenen Unterklasse. Das Objekt hat also ein Attribut absender, der Code in Sprachnachricht darf es nur nicht direkt anfassen.
Ansatz: Unterscheide: Was hat das Objekt (alles Geerbte) — und was darf der Code der Unterklasse direkt benutzen?
Weiter: @Override ist eine Annotation — ein Hinweis an den Compiler, kein Muss.