Vererbung

canyakan95

Bekanntes Mitglied
Hallo..ich verstehe leider net so ganz wie die Ausgabe : " A B L B X M " entsteht.Habe schwierigkeiten das nachvollzuziehen.
Hoffe ihr könnt mir das vllt erklären.
Mfg
Java:
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);
uu.gg(ff);
uu.gg(uu);
}
}
 
Hallo,
du solltest zunächst wissen das in Java einen Statischen Typen einer Varablen gibt, das ist der Typ der Variablen Deklaration (Links von =), dieser ist schon beim Kompilieren bekannt. Es gibt zudem noch den Dynamischen Typ, das ist der Typ den die Variable eigentlich hat (rechts vom =). Dieser ist beim Kompilieren nicht bekannt sondern erst zur Laufzeit!

Damit kann nun dein Code erklärt werden:

Java:
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/*Statisch*/ oo = new Oben();/*Dynamisch*/
Oben ff = new Mitte();
Unten uu = new Unten();
oo.gg(ff); //A -  Da er beim Kompilieren weiß das ff vom Typ Oben ist
oo.gg(uu); //B - Da es vom Typ Unten ist, Unten erbt von Mitte und hatt somit mehr mit Mitte gemeinsam als mit Oben
ff.gg(ff); //L - Da er beim Kompilieren weiß das ff von Typ oben ist, aber trotzdem während der Laufzeit die ff (oben) Methode von Mitte aufgerufen wird, da ff während der Laufzeit vom typ Mitte ist
ff.gg(uu); // B - Mitte erbt von Oben und hat somit die ff (mitte) zur Verfügung 
uu.gg(ff); // X - Da ff beim Kompilieren wieder vom typ Oben und uu wieder ff (oben) überschreibt
uu.gg(uu); // M - Da unten von Mitte erbst und wieder ff (mitte) zur Verfügung  hat
}
}
 
oo.gg(ff); //A - Da er beim Kompilieren weiß das ff vom Typ Oben ist

z.b das vertehe ich nicht. ich würde zunächst nach oben wegen dem (oo) gucken und danach wegen dem (ff) sagen das das "B" ist, aber nicht A
Habe da verständnis probleme..
 
Also du musst das anders sehen:
Zunächst beim Kompilieren weiß java nur das FF ein Object von Typ Oben ist. Und setzt sozusagen die Referenz für den Aufruf auf die Methode .gg (oben)
Während der Laufzeit kann er die Methoden nur Vertikal wechseln (also durch Überschreiben), da dort die alte Methode ersetzt wird und die Refernz die gleiche ist aber auf eine andere Methode zeigt!
Aber er kann nicht Horizontal wechseln (Also durch überladung), da die Methode eine andere Refernz besitzt und diese nicht gendert werden kann !

Somit musst du erst auf den Statischen Typen und dann auf den Dynamischen Typen acjt geben !
 

Zurück
Oben