转换为超类时出现 StackOverflow 错误

StackOverflow error when casting to a superclass

我在网上找到了以下代码。

 class A {
        public void perform_work() {
            System.out.println("A");
        }
    }
class B extends A {
    public void perform_work() {
        System.out.println("B");
    }
}

class C extends B {
    public void perform_work() {
        ((A) this).perform_work(); // Line 163
    }

    public static void main(String[] args) {
        C c = new C();
        c.perform_work();
    }
}

这段代码编译得很干净,但是当 运行 它给了我一个错误:

Exception in thread "main" java.lang.WhosebugError
    at com.hamzablm.C.perform_work(Main.java:163)
    at com.hamzablm.C.perform_work(Main.java:163)
    at com.hamzablm.C.perform_work(Main.java:163)
    at com.hamzablm.C.perform_work(Main.java:163)
    at com.hamzablm.C.perform_work(Main.java:163)
    at com.hamzablm.C.perform_work(Main.java:163)
    at com.hamzablm.C.perform_work(Main.java:163)
    at com.hamzablm.C.perform_work(Main.java:163)
    at com.hamzablm.C.perform_work(Main.java:163)
    at com.hamzablm.C.perform_work(Main.java:163)
    at com.hamzablm.C.perform_work(Main.java:163)

................................................ 更多错误像那样

我原以为第 163 行(在上面的代码中指定)会调用 class 中定义的 perfom_work() A. 为什么会产生此错误?以及如何解决?

如果想让perfom_work in C执行perfom_work in A需要改成:

public void perform_work() {
    super.perform_work();
}

并在 B

中进行相同的更改

正如目前所写的那样,它递归地调用自己,所以它永远不会停止。

In C in perform_work thisC 类型转换为 A 所以 perform_work in A 被调用相反,但此方法在 C 中被覆盖,因此它返回到那里,再次完成类型转换,这一切都会再次发生,直到您获得 WhosebugError

如其他答案中所述,您需要使用 super 来解决此问题。

您在 class C 中的方法 perform_work() 中编写的代码本质上等同于:

public void perform_work() {
    A someA = this;
    someA.perform_work();
}

正如您可能知道的那样,它不会更改变量 someA 引用的对象的类型。它仍然是 C 类型的对象,并且在对它的引用上调用 perform_work() 方法将调用 class C 的实现。

想象一下以下场景:

public static void perform_more_work(A someA) {
    someA.perform_work();
}

public void perform_work() {
    perform_more_work(this);
}

上面的代码会调用哪个方法应该很明显了。