假设我们有以下类:
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);
}
}
现在让我们在A类中调用recursive
:
public class Demo {
public static void main(String[] args) {
A a = new A();
a.recursive(10);
}
}
输出结果按预期从10开始倒计时。
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)
让我们来到容易混淆的部分。现在我们在类B中调用了递归
。
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)
实际情况:B.recursive(10)
A.recursive(11)
B.recursive(10)
A.recursive(11)
B.recursive(10)
A.recursive(11)
B.recursive(10)
..infinite loop...
这是怎么发生的?我知道这只是一个假设的例子,但这让我想起了一些问题。
旧问题带有具体用例。
A
中的递归调用实际上是动态分派到当前对象的recursive
方法,那么这很简单。如果你正在使用一个A
对象,调用会带你到A.recursive()
,而使用一个B
对象则会带你到B.recursive()
。但是B.recursive()
总是调用A.recursive()
。所以,如果你开始使用一个B
对象,它会来回切换。 - LIProf