【发布时间】:2016-04-04 12:37:06
【问题描述】:
假设我们有以下类:
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 类中调用 recursive。
预期:
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...
这是怎么发生的?我知道这是一个精心设计的例子,但它让我感到好奇。
concrete use case 的较早问题。
【问题讨论】:
-
你需要的关键字是静态类型和动态类型!您应该搜索并阅读一些相关信息。
-
为了得到你想要的结果,将递归方法提取到一个新的私有方法中。
-
@Onots 我认为将递归方法设为静态会更简洁。
-
如果您注意到
A中的递归调用实际上是动态分派 到当前对象的recursive方法,这很简单。如果您正在使用A对象,则调用会将您带到A.recursive(),并使用B对象将您带到B.recursive()。但是B.recursive()总是调用A.recursive()。所以,如果你启动一个B对象,它就会来回切换。
标签: java inheritance recursion