次のクラスがあるとします。
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);
}
}
次にrecursive
、クラスAを呼び出します。
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)
紛らわしい部分に取り掛かりましょう。ここでrecursive
、クラス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...
これはどのように起こりますか?これが考案された例であることは知っていますが、不思議に思います。
具体的なユースケースに関する古い質問。