Angenommen, wir haben die folgenden Klassen:
class A {
void recursive(int i) {
System.out.println("A.recursive(" + i + ")");
if (i > 0) {
recursive(i - 1);
}
}
}
class B extends A {
void recursive(int i) {
System.out.println("B.recursive(" + i + ")");
super.recursive(i + 1);
}
}
Rufen wir jetzt recursive
Klasse A an:
public class Demo {
public static void main(String[] args) {
A a = new A();
a.recursive(10);
}
}
Die Ausgabe wird erwartungsgemäß von 10 heruntergezählt.
A.recursive(10)
A.recursive(9)
A.recursive(8)
A.recursive(7)
A.recursive(6)
A.recursive(5)
A.recursive(4)
A.recursive(3)
A.recursive(2)
A.recursive(1)
A.recursive(0)
Kommen wir zum verwirrenden Teil. Jetzt rufen wir recursive
Klasse B an.
Erwartet :
B.recursive(10)
A.recursive(11)
A.recursive(10)
A.recursive(9)
A.recursive(8)
A.recursive(7)
A.recursive(6)
A.recursive(5)
A.recursive(4)
A.recursive(3)
A.recursive(2)
A.recursive(1)
A.recursive(0)
Tatsächlich :
B.recursive(10)
A.recursive(11)
B.recursive(10)
A.recursive(11)
B.recursive(10)
A.recursive(11)
B.recursive(10)
..infinite loop...
Wie kommt es dazu? Ich weiß, dass dies ein erfundenes Beispiel ist, aber ich wundere mich darüber.
Ältere Frage mit einem konkreten Anwendungsfall .
A
tatsächlich dynamisch an die recursive
Methode des aktuellen Objekts gesendet wird. Wenn Sie mit einem A
Objekt arbeiten, führt Sie der Aufruf zu A.recursive()
und mit einem B
Objekt zu B.recursive()
. Ruft aber B.recursive()
immer an A.recursive()
. Wenn Sie also ein B
Objekt starten , wechselt es hin und her.