Überschreiben/Überladen Flashcards
Beschreibe das Überschreiben von Methoden
Eine von der Superklasse an die Subklasse vererbte Methode kann von der Subklasse durch eine Methode gleicher Signatur überschrieben werden, diese Subklassen-Methode kann eine komplett neue Implementierung besitzen.
Beim Überschreiben von Methoden ist nur Kovarianz beim Rückgabetyp und Kontravarianz (nicht in Java) bei den Parametertypen mit dem LSP vereinbar. Anders gesagt: Eine überschreibende Methode muss alle Parameter „verkraften“, welche die überschriebene Methode verträgt und sie darf keine Typen zurückliefern, die nicht auch die überschriebene Methode hätte liefern können.
Super: Super m(Supertyp) throws Exception
Sub: Sub m(Supertyp) throws IOException
Wie kann eine Methode der Superklasse aus der überschreibenden Methode aufgerufen werden?
super.m(Parameterliste)
Wie werden Methoden bzw. Attribute gebunden?
Methoden werden dynamisch - d.h. zur Laufzeit des Programms gebunden
Attribute werden statisch gebunden
Wie werden Methodenaufrufe aufgelöst in Java?
Der Vorgang erfolgt in zwei Stufen (most-specific Ansatz)
- Alle sichtbaren Methoden mit passenden Namen und passender Signatur bestimmen
- Streiche die Methoden, zu denen es eine spezieller gibt
Wenn mehr als eine bricht der Compiler ab
Allgemeines Vorgehen: Die Auflösung überladener Methodenaufrufe wird in zwei Schritten vorgenommen. Im ersten Schritt werden alle sichtbaren Methoden mit passendem Namen und passender Signatur bestimmt. Für die Signatur heißt das, dass die Typen der formalen Parameter (mittelbare) Supertypen der deklarierten Typen der Argumente oder — im Falle von Zahltypen — Zahltypen mit mindestens so großem Wertevorrat sein müssen. Wird in diesem Schritt genau eine solche Methode gefunden, dann wird diese aufgerufen; wenn keine solche Methode gefunden wird, wird die Übersetzung mit einem Fehler abgebrochen. Ansonsten wird mit dem zweiten Schritt fortgefahren, dem eigentlichen most-specificAlgorithmus. Dieser streicht aus der im ersten Schritt bestimmten Menge nach und nach solche Methoden, für die es noch eine ”speziellere“ Methode in der Menge gibt, d.h. eine
Methode, deren Parametertypen (mittelbare) Subtypen bzw. Zahltypen mit gleichem oder kleinerem Wertevorrat sind. Bleibt nach diesem zweiten Schritt genau eine Methode übrig, so wird diese Methode aufgerufen. Ansonsten ist der Aufruf mehrdeutig, d.h. es existiert keine im Sinne der Vererbungshierarchie speziellste Methodendeklaration. In diesem Fall kann der Aufruf zur Übersetzungszeit nicht aufgelöst werden und die Übersetzung bricht mit einem Fehler ab.
Wahr oder Falsch
Damit eine Methode eine andere Methode überschreibt, müssen die nicht generischen Parametertypen beider Methoden identisch sein
Wahr
Wahr oder Falsch
Eien abstrakte Methode als private zu deklarieren kann sinnvoll sein
falsch
Wahr oder Falsch
Beim dynamischen Binden prüft der Compiler zur Laufzeit die Typen der Methodenparameter
falsch
Wahr oder Falsch
Für die virtuelle Maschine ist im Bytecode klar ersichtlich, welche Methoden sich überschreiben
wahr
Wahr oder Falsch
Feldzugriffe werden statisch gebunden, es ist dem Compiler also immer bekannt, an welches Feld eine Feldreferenz bindet
wahr
Wahr oder Falsch
Der Compiler löst methoden-Überladung mit einem Most-Specific-Algorithmus auf
wahr
Wahr oder Falsch
Die virtuelle Maschine löst Methoden-Überschreibung mit einem Most-Specific-Algorithmus auf
falsch
Wahr oder Falsch
Bei überschriebenen Methoden kann es passieren, dass zur Laufzeit keine passende Methode gefunden wird, so dass eine Exception geworfen wird
falsch
Wahr oder Falsch
Mit dem Schlüsselwort final kann ein Programmierer verhindern, dass eine Methode überschrieben wird
wahr
Wahr oder Falsch
Mit dem Schlüsselwort final kann ein Programmierer verhindern, dass andere Klassen von einer bestimmten Klasse ableiten
wahr
Welche syntaktischen Voraussetzungen müssen erfüllt sein, wenn in einer Subklasse eine geerbte Methode überschrieben werden soll?
(vgl. Abs. 3.2.2.2) Um eine Methode zu überschreiben, muss in der Subklasse eine Methode gleichen Namens deklariert werden. Weiterhin müssen die Typen von Parametern, Rückgabeparametern und Ausnahmen der überschreibenden Methode zu denen der überschriebenen passen; d.h.: Theoretisch: Kontravarianz bei Parametertypen; Kovarianz bei Rückgabe- und Ausnahmetypen. für Java >= 5: Gleichheit der Parametertypen, Kovarianz bei Rückgabe- und Ausnahmetypen. (Kontravarianz der Parametertypen wird in Java nicht unterstützt, da es andernfalls bei überladenen Methoden zu Konstellationen kommen kann, in denen der Compiler einen Methodenaufruf nicht eindeutig an eine Deklaration binden kann.) für Java < 5: Gleichheit von Parameter- und Rückgabetypen