Die Vererbungshierarchie unseres soziales Netzwerk mit Vererbung sieht gerade so aus:
Man sieht, dass die Methode zum Anzeigen eines Beitrags in der Klasse Beitrag
definiert ist und an die Klassen TextBeitrag
und PhotoBeitrag
vererbt wird. Diese Methode weiß nichts über besondere Eigenschaften der Subklassen - Vererbung ist eine Einbahnstrasse. Das führt zum Problem, dass die Ausgabe aller Beiträge etwas so aussehen:
dabei werden die Besonderheiten der Beitragsarten nicht berücksichtigt - der photoBeitrag
hat keine Bilddatei und keine Caption. Eigentlich sollte das nämlich so aussehen:
Die spontane Lösungsidee verschiebt die display
-Methode in die Subklassen, so dass jede Subklasse eine eigene display
-Methode hat, welche dann natürlich entsprechend der spezifischen Eigenschaften implementiert sein könnte:
Dieser Versuch ist zum Scheitern verurteilt:
Newsfeed
benötigt eine display
-Methode in Beitrag.
Es gibt also display
-Methoden in der Superklasse und in den Subklassen (wenn nötig):
Fragen:
display
-Methoden wird denn zur Laufzeit tatsächlich aufgerufen?Keine Vererbung, kein Polymorphismus, kein Problem → die offensichtliche Methode wird ausgeführt:
v1.display()
v1.display()
Bei der Suche nach der Methode wird die Vererbungshierarchie von unten nach oben durchlaufen (beginnend beim dynamischen Typ), bis zum Treffer – diese Methode wird ausgeführt.
Die Methode der Superklasse wird also solange von den Versionen der Subklasse(n) „verdeckt“, solange es in den Subklassen Methoden mit gleicher Signatur gibt.
v1.display()
Bei der Suche nach der auszuführenden Methode wird die Vererbungshierarchie von unten nach oben durchlaufen (beginnend beim dynamischen Typ), bis der erste Treffer gefunden wird – diese Methode wird ausgeführt. Im Beispiel also die Methode, die in photoBeitrag
implementiert ist.
Jede Klasse erbt von Java Object, das kann man beispielsweise erkennen, wenn man einfach mal eine "leere" Klasse erstellt:
class Ball () { }
Man kann diesen Ball instanziieren, obwohl er weder Konstruktor noch weitere Methoden enthält:
Hund ball01 = new Ball();
Er hat sogar schon Methoden, z.B. die Methode toString()
:
ball01.toString();
das Erzeugt eine Ausgabe der folgenden Form:
ball01@af54f432
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html
Filename | Filesize | Last modified |
---|---|---|
auswahl_102.png | 26.4 KiB | 29.11.2021 19:49 |
auswahl_103.png | 41.1 KiB | 29.11.2021 19:49 |
fahrzeuge.drawio.png | 13.3 KiB | 29.11.2021 14:55 |
kap11_polymorphie01.odp | 1.5 MiB | 29.11.2021 19:46 |
kap11_polymorphie01.pdf | 360.2 KiB | 29.11.2021 19:46 |
newssystem.drawio.png | 13.1 KiB | 29.11.2021 15:06 |
newssystem01.drawio.png | 16.9 KiB | 29.11.2021 19:52 |
newssystem02.drawio.png | 18.2 KiB | 29.11.2021 19:56 |
poly01.png | 10.9 KiB | 29.11.2021 19:59 |
poly02.png | 14.6 KiB | 29.11.2021 19:59 |
poly03.png | 15.7 KiB | 29.11.2021 19:59 |