Aufruf(-Reihenfolge) von überdeckten (virtuellen) Methoden
-
Hallo zusammen!
Also erstmal folgender Java-Code:
public class Oben { public void gg(Oben o) { System.out.print("A "); } public void gg(Mitte m) { System.out.print("B "); } } public class Mitte extends Oben { public void gg(Oben o) { System.out.print("L "); } public void gg(Unten u) { System.out.print("M "); } } public class Unten extends Mitte { public void gg(Oben o) { System.out.print("X "); } public void gg(Mitte m) { System.out.print("Z "); } } public class Prog { public static void test() { Oben oo = new Oben(); Oben ff = new Mitte(); Unten uu = new Unten(); oo.gg(ff); oo.gg(uu); ff.gg(ff); ff.gg(uu); // B uu.gg(ff); uu.gg(uu); } }
Nun zu meiner Frage: Beim Aufruf
ff.gg(uu);
wird ein "B " ausgegeben. Aber warum? Warum sucht der Compiler direkt in der Klasse "Oben" und nicht in "Mitte"? In der vorherigen Zeile müsste er nämlich direkt in Mitte suchen (wie auch erwartet).Schonmal danke für Eure Erklärungen!
-
ff
ist vom TypMitte
, wird jedoch über die Schnittstelle vonOben
angesprochen und kennt daher nur die Methodengg(Oben)
undgg(Mitte)
. Du rufst aufff
eine Methodegg
mit dem Argumentuu
vom TypUnten
auf, für die jedoch keine direkte Überladung vongg
bekannt ist inOben
. Aufgrund der Vererbungshierarchie wird nun aberuu
alsMitte
angesprochen, also die Methodegg(Mitte)
vonOben
aufgerufen, die auch inMitte
nicht überschrieben wurde. Darum ist die Ausgabe "B". Das Verhalten ist korrektBTW, falls dir meine Erklärung schwierig scheint, liegt dies eventuell auch an deinen Bezeichnern^^