gpt4 book ai didi

java - 继承和递归

转载 作者:IT老高 更新时间:2023-10-28 11:39:00 28 4
gpt4 key购买 nike

假设我们有以下类:

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 .

最佳答案

这是意料之中的。这就是 B 的实例所发生的情况。

class A {

void recursive(int i) { // <-- 3. this gets called
System.out.println("A.recursive(" + i + ")");
if (i > 0) {
recursive(i - 1); // <-- 4. this calls the overriden "recursive" method in class B, going back to 1.
}
}

}

class B extends A {

void recursive(int i) { // <-- 1. this gets called
System.out.println("B.recursive(" + i + ")");
super.recursive(i + 1); // <-- 2. this calls the "recursive" method of the parent class
}

}

因此,调用在 AB 之间交替。

这不会发生在 A 实例的情况下,因为不会调用被覆盖的方法。

关于java - 继承和递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34531180/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com