Polymorphismus: Gibt es einen faktischen Unterschied zwischen Überschreiben und Verdecken?

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Polymorphismus: Gibt es einen faktischen Unterschied zwischen Überschreiben und Verdecken?
Hallo zusammen,

gibt es einen Unterschied zwischen “Überschreiben” und “Verdecken” oder ist das nur ein Unterschied in der Begrifflichkeit je nachdem ob es sich um eine Instanz- oder Klassenmethode handelt?

Liebe Grüße
Speedy


Hiding ist keine Polymorphie und macht kein virtual dispatch.

1 „Gefällt mir“

Vie viele exemplare von “foo” gibt es wenn ich es überschreibe, und wie viele wenn ich es überdecke?
Guck dir vllt hier mal das verhalten an, wenn du ein A a = new B hast und du auf ein verdecktes feld a.foo zugreifen möchtest, und das gleiche bei etwas übrschriebenem


Siehe dazu auch Variable and Method Hiding in Java | Baeldung.

1 „Gefällt mir“

@Stef_15 Wie meinst du das? Habe ich wenn ich ein Feld überschreibe dasselbe Feld mit anderem Inhalt, beim Überdecken zwei Felder von denen eines vom anderen verdeckt ist?

@Marcel[Inf] Danke für deinen Link


Ich weiß, dass das jetzt wahrscheinlich zu spät ist (hoffentlich nicht) aber um es nochmal klarzustellen auch für andere, die es vielleicht noch lesen:
Überschreiben und verdecken sind grundlegend verschiedene Dinge, beim Überschreiben wird eine Methode je nach dem ob man ein Objekt der Ober- oder Unterklasse erzeugt durch eine Version der Methode tatsächlich ersetzt, die andere Version / Versionen der Methode sind dann physikalisch nicht vorhanden, VOLLKOMMEN UNABHÄNGIG ZU WAS DAS OBJEKT / DIE VARIABLE GECASTED WIRD!!, die Methode gehört nämlich immer zur tatsächlichen Instanz. Das ist auch der Grund, weshalb Überschreiben nur bei Instanzmethoden überhaupt funktioniert.
Beim Verdecken hingegen existieren immer alle Versionen des Attributs / der Methode jedoch lässt sich immer nur auf eine bestimmte Version zugreifen, was abhängig vom statischen Typ der Variable ist. Hat also z.B. eine Oberklasse ein Attribut x und eine Unterklasse ein Attribut x (mit gleichem Namen), dann hängt es vom statischen Typ der Variable ab, welche der beiden Variablen tatsächlich gelesen / geschrieben wird.
So gesehen ist es auch vollkommen offensichtlich wieso Klassenmethoden nicht überschrieben werden können → sie werden nie einer Instanz zugeordnet.