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 recursiveKlasse 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 recursiveKlasse 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 .
Atatsächlich dynamisch an die recursiveMethode des aktuellen Objekts gesendet wird. Wenn Sie mit einem AObjekt arbeiten, führt Sie der Aufruf zu A.recursive()und mit einem BObjekt zu B.recursive(). Ruft aber B.recursive()immer an A.recursive(). Wenn Sie also ein BObjekt starten , wechselt es hin und her.