Java Klassen und Veerbung mit nichtnachvollziebarer Methodenaufrufe :(



  • public class Start {
    
    public static void main(String[] args){
    
    	Ober oo = new Ober();
    	Ober ff = new Mitte();
    	Unter uu = new Unter();
    
    	oo.gg(ff);
    	oo.gg(uu);
    	ff.gg(ff);
    	ff.gg(uu);
    	uu.gg(ff);
    	uu.gg(uu);
    
    }
    }
    
    public class Ober {
    
    	public void gg (Ober o){ System.out.println("A");}
    	public void gg (Mitte m){System.out.println("B");}
    	public void gg (Object m){System.out.println("O");}
    }
    
    public class Mitte extends Ober {
    	public void gg (Ober o){ System.out.println("L");}
    	public void gg (Unter u){System.out.println("M");}
    }
    
    public class Unter extends Mitte {
    
    	public void gg (Ober o) {System.out.println("X");}
    	public void gg (Mitte m){System.out.println("Z");}
    
    }
    

    Die Ausgabe ist:

    A
    B
    L
    B
    X
    M

    Ich kann das nicht nachvollziehen. Kann mir jemand die Methodenaufruge detaliert erklären? Diese Aufgabe ist eine Klausuraufgabe und ich muss die Detailiert erklären. Ich komme nicht weiter, weil ich nicht weiß was JAVA hier macht.

    Vielen Dank



  • Dann versuchs doch erstmal selber. Welche Ausgaben würdest Du erwarten und warum?



  • Bei der Initalisierung werden immer zuerst die Konstruktoren der Superklasse ausgeführt.

    Setz doch einfach Breakpoints und schau selber nach, was das Programm macht.



  • hab dein bsp. mal etw. verändert und paar sachen dazugeschriebn hoffe das hilft^^

    public class Test
    {
        public static void main(String[] args)
        {
            /*
             * oo, mm und uu sind alles Referencen vom Typ "Ober".
             * --> Kann nur (überschriebene)Methoden der Klasse "Ober" und "Object" aufrufen.
             *
             * wenn du z.B.
             * 		Object oo = new Ober();
             * 		Object mm = new Mitte();
             * 		Object uu = new Unter();
             * machen würdest musst auf jeden Fall casten,
             * weil der Typ "Object" keine Methode namens "gg" hat.
             */
            Ober oo = new Ober();
            Ober mm = new Mitte();
            Ober uu = new Unter();
    
            /*
             * Übergibst eine Reference vom Typ "Ober".
             * A ausgeben, da kein casting gemacht wird.
             */
            oo.gg(mm); // übergibst also Typ "Ober" und es gibt eine FKT die etw. vom Typ "Ober" erwartet.
            oo.gg(uu);
    
            /*
             * Übergibst eine Reference vom Typ "Ober".
             * L ausgeben, da kein casting gemacht wird.
             * "gg(Ober o)" der Basisklasse hast ja überschrieben.
             */
            mm.gg(mm);
            mm.gg(uu);
    
            /*
             * Übergibst eine Reference vom Typ "Ober".
             * X ausgeben, da kein casting gemacht wird.
             * "gg(Ober o)" der Basisklasse hast ja überschrieben.
             */
            uu.gg(mm);
            uu.gg(uu);
        }
    }
    
    class Ober
    {
        public void gg (Ober o)  {System.out.println("A");}
        public void gg (Mitte m) {System.out.println("B");}
        public void gg (Object m){System.out.println("O");}
    }
    
    class Mitte extends Ober
    {
        public void gg (Ober o) {System.out.println("L");} // Überschreibt die der Basisklasse
        public void gg (Unter u){System.out.println("M");}
    }
    
    class Unter extends Mitte
    {
        public void gg (Ober o) {System.out.println("X");} // Überschreibt die der Basisklasse
        public void gg (Mitte m){System.out.println("Z");} // Überschreibt die der Klasse "Ober"
    }
    


  • Warum postest Du diese Frage in verschiedenen Foren? Hast Du die Antworten in http://www.java-forum.org/allgemeine-java-themen/96353-java-klassen-veerbung-nichtnachvollziebarer-methodenaufrufe.html
    nicht verstanden?


Anmelden zum Antworten