转换为超类时出现StackOverflow错误

时间:2019-06-15 20:07:50

标签: java stack-overflow

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

 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.StackOverflowError
    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行(在上面的代码中指定)将调用类A中定义的perfom_work()。为什么会产生此错误?以及如何解决?

3 个答案:

答案 0 :(得分:8)

如果您希望perfom_work中的C执行perfom_work中的A,则需要将其更改为:

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

并在B

中进行相同的更改

目前,它是递归地调用自身,因此它永远不会停止。

答案 1 :(得分:1)

C中的perform_work中,this是从CA的类型转换,因此调用了perform_work中的A此方法在C中已被覆盖,因此它返回那里,再次进行类型转换,所有这些再次发生,直到得到StackOverflowError

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

答案 2 :(得分:1)

您在类C中的perform_work()方法中编写的代码基本上与此等效:

public void perform_work() {
    A someA = this;
    someA.perform_work();
}
您可能会知道的

不会更改变量some​​A引用的对象的类型。它仍然是C类型的对象,对其引用调用perform_work()方法将从类C调用实现。

试想一下以下情况:

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

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

很明显,上面的代码将调用哪个方法。