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 Typ Mitte , wird jedoch über die Schnittstelle von Oben angesprochen und kennt daher nur die Methoden gg(Oben) und gg(Mitte) . Du rufst auf ff eine Methode gg mit dem Argument uu vom Typ Unten auf, für die jedoch keine direkte Überladung von gg bekannt ist in Oben . Aufgrund der Vererbungshierarchie wird nun aber uu als Mitte angesprochen, also die Methode gg(Mitte) von Oben aufgerufen, die auch in Mitte nicht ü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^^


Anmelden zum Antworten