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!

-
ffist vom TypMitte, wird jedoch über die Schnittstelle vonObenangesprochen und kennt daher nur die Methodengg(Oben)undgg(Mitte). Du rufst aufffeine Methodeggmit dem Argumentuuvom TypUntenauf, für die jedoch keine direkte Überladung vonggbekannt ist inOben. Aufgrund der Vererbungshierarchie wird nun aberuualsMitteangesprochen, also die Methodegg(Mitte)vonObenaufgerufen, die auch inMittenicht überschrieben wurde. Darum ist die Ausgabe "B". Das Verhalten ist korrekt
BTW, falls dir meine Erklärung schwierig scheint, liegt dies eventuell auch an deinen Bezeichnern^^