[CODE lang="java" title="Y1"]public class Y1{
protected EinUndAusgabe io =
new EinUndAusgabe();
public void test(){
io.ausgeben("1\n");
}
}[/CODE]
[CODE lang="java" title="Y2 extends Y1"]public class Y2 extends Y1{
@Override
public void test(){
io.ausgeben("2\n");
}
public void do1(){
io.ausgeben("y2:do1 ");
test();
}
public void do2(){
io.ausgeben("y2:do2 ");
super.test();
}
public void do3(){
io.ausgeben("y2:do3 ");
do4();
}
public void do4(){
io.ausgeben("3\n");
}
}[/CODE]
[CODE lang="java" title="Y3 extends Y2"]public class Y3 extends Y2{
@Override
public void do1(){
io.ausgeben("y3:do1 ");
test();
}
@Override
public void do2(){
io.ausgeben("y3:do2 ");
super.do3();
}
@Override
public void do3(){
io.ausgeben("y3:do3 ");
super.do2();
}
@Override
public void do4(){
io.ausgeben("y3:do4 ");
do2();
}
}[/CODE]
Guten Tag liebes Java-Forum,
ich kriege ein error für x3.do2() und für x3.do4() doch ich verstehe leider nicht so ganz warum, laut meinem Verständnis müsste für
x3.do2():
"y3:do2 y2:do3 3"
rauskommen und für
x3.do4():
"y3:do4 y3:do2 y2:do3 3"
rauskommen.
Doch stattdessen kriege ich eine Error-Meldung und es wird nichts geprintet...
publicclass Y2 extends Y1 {...publicvoiddo3(){
io.ausgeben("y2:do3 ");do4();// <- ist _auch_ ein dynamisch "dispatchter" Aufruf!}...}
Du hast dort eine Endlosrekursion, weil der Aufruf von this.do4() innerhalb der Methode Y2.do3() eben auf dem Laufzeittyp des aktuellen this-Objektes aufgerufen wird und dieser Laufzeittyp ist ja nach wie vor Y3 und Y3 definiert ebenfalls eine do4() Methode, überschreibt also die von Y2.
Bei nicht-private Instanzmethoden wird also immer die am meisten überschriebene Methode in der Typhierarchie des Empfängerobjektes des Methodenaufrufes ausgeführt. Der Empfänger des Aufrufes do4() ist implizit this...
publicclass Y2 extends Y1 {...publicvoiddo3(){
io.ausgeben("y2:do3 ");do4();// <- ist _auch_ ein dynamisch "dispatchter" Aufruf!}...}
Du hast dort eine Endlosrekursion, weil der Aufruf von this.do4() innerhalb der Methode Y2.do3() eben auf dem Laufzeittyp des aktuellen this-Objektes aufgerufen wird und dieser Laufzeittyp ist ja nach wie vor Y3 und Y3 definiert ebenfalls eine do4() Methode, überschreibt also die von Y2.
Bei nicht-private Instanzmethoden wird also immer die am meisten überschriebene Methode in der Typhierarchie des Empfängerobjektes des Methodenaufrufes ausgeführt. Der Empfänger des Aufrufes do4() ist implizit this und der Laufzeittyp von this in deinen zwei Aufrufen ist jeweils beide Male Y3.
Somit wird die Überschreibung von Y3.do4() aufgerufen und nicht Y2.do4(), was du vermutetest.