Überschreiben/Überladen Flashcards

1
Q

Beschreibe das Überschreiben von Methoden

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Wie kann eine Methode der Superklasse aus der überschreibenden Methode aufgerufen werden?

A

super.m(Parameterliste)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Wie werden Methoden bzw. Attribute gebunden?

A

Methoden werden dynamisch - d.h. zur Laufzeit des Programms gebunden

Attribute werden statisch gebunden

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Wie werden Methodenaufrufe aufgelöst in Java?

A

Der Vorgang erfolgt in zwei Stufen (most-specific Ansatz)

  1. Alle sichtbaren Methoden mit passenden Namen und passender Signatur bestimmen
  2. 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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Wahr oder Falsch
Damit eine Methode eine andere Methode überschreibt, müssen die nicht generischen Parametertypen beider Methoden identisch sein

A

Wahr

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Wahr oder Falsch

Eien abstrakte Methode als private zu deklarieren kann sinnvoll sein

A

falsch

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Wahr oder Falsch

Beim dynamischen Binden prüft der Compiler zur Laufzeit die Typen der Methodenparameter

A

falsch

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Wahr oder Falsch

Für die virtuelle Maschine ist im Bytecode klar ersichtlich, welche Methoden sich überschreiben

A

wahr

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Wahr oder Falsch

Feldzugriffe werden statisch gebunden, es ist dem Compiler also immer bekannt, an welches Feld eine Feldreferenz bindet

A

wahr

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Wahr oder Falsch

Der Compiler löst methoden-Überladung mit einem Most-Specific-Algorithmus auf

A

wahr

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Wahr oder Falsch

Die virtuelle Maschine löst Methoden-Überschreibung mit einem Most-Specific-Algorithmus auf

A

falsch

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Wahr oder Falsch
Bei überschriebenen Methoden kann es passieren, dass zur Laufzeit keine passende Methode gefunden wird, so dass eine Exception geworfen wird

A

falsch

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Wahr oder Falsch

Mit dem Schlüsselwort final kann ein Programmierer verhindern, dass eine Methode überschrieben wird

A

wahr

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Wahr oder Falsch

Mit dem Schlüsselwort final kann ein Programmierer verhindern, dass andere Klassen von einer bestimmten Klasse ableiten

A

wahr

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Welche syntaktischen Voraussetzungen müssen erfüllt sein, wenn in einer Subklasse eine geerbte Methode überschrieben werden soll?

A

(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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Dynamisches Binden bei Methodenaufrufen bezeichnet den Vorgang, durch den einem im Quellcode stehenden Methodenaufruf die Methode zugeordnet wird, welche dann tatsächlich ausgeführt wird. Dieser Vorgang erfolgt bei Java in zwei Stufen.
Was erfolgt in der ersten Stufe durch den Compiler?

A

Durch den Compiler erfolgt die Auflösung von Überladung nach dem Most-Specific-Algorithmus. Dabei werden nur die Deklarationstypen (statischen Typen) des Empfängers des Methodenaufrufs sowie der Parameter berücksichtigt. Das Ergebnis dieses Vorgangs ist der Aufruf einer bestimmten Methode, der durch den Compiler in den Bytecode geschrieben wird.

17
Q

Dynamisches Binden bei Methodenaufrufen bezeichnet den Vorgang, durch den einem im Quellcode stehenden Methodenaufruf die Methode zugeordnet wird, welche dann tatsächlich ausgeführt wird. Dieser Vorgang erfolgt bei Java in zwei Stufen.
Was geschieht zur Laufzeit?

A
Die Laufzeitumgebung („Virtual Machine“, VM) ermittelt den tatsächlichen Typ (dynamischer Typ) des Objekts, an das sich der Methodenaufruf richtete. Das kann ein beliebiger Subtyp des Deklarationstyps sein und in diesem Typ könnte die betreffende Methode überschrieben worden sein. In der dem dynamischen Typ entsprechenden Klasse sucht die VM dann nach einer Methode, deren Signatur genau dem Methodenaufruf aus dem Bytecode entspricht.
Findet sie diese Methode dort nicht, schaut sie in der Superklasse nach, ggf. in deren Superklasse und so weiter. Dass sich die Methode finden muss, ist klar, sonst hätte der Compiler den entsprechenden Methodenaufruf gar nicht erst zugelassen.
18
Q

Welche Art der Varianz ist bei den Ergebnistypen von Methoden in JAVA ab Version 5 zulässig? Begründen Sie Ihre Antwort.

A

Kovarianz bei den Ergebnistypen.
Die überschreibende Methode msub darf nur Ergebnisse liefern, die auch als Ergebnisse der überschriebenen Methode msuper zulässig sind, d. h. der Ergebnistyp von msub muss ein Subtyp des Ergebnistyps von msuper sein.
Dies ist nötig, wenn das Ergebnis des Methodenaufrufs in einem Ausdruck ausgewertet wird, z. B. bei einer Zuweisung an eine Variable. Im Kontext von msuper wird in einem solchen Fall mindestens dessen Ergebnisstyp erwartet.

19
Q

Welches Java-Schlüsselwort muss wie verwendet werden, wenn Sie aus einer überschreibenden Methode auch auf die Implementierung der überschriebenen Methode zugreifen wollen?

A

Dies ist in Java durch Voranstellen des Schlüsselworts super möglich. Eine Methode m der Superklasse kann mittels super.m() aus dem Rumpf der überschreibenden Methode aufgerufen werden.