我在互联网上找到了以下代码。
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()
。为什么会产生此错误?以及如何解决?
答案 0 :(得分:8)
如果您希望perfom_work
中的C
执行perfom_work
中的A
,则需要将其更改为:
public void perform_work() {
super.perform_work();
}
并在B
目前,它是递归地调用自身,因此它永远不会停止。
答案 1 :(得分:1)
在C
中的perform_work
中,this
是从C
到A
的类型转换,因此调用了perform_work
中的A
此方法在C
中已被覆盖,因此它返回那里,再次进行类型转换,所有这些再次发生,直到得到StackOverflowError
如另一个答案中所述,您需要使用super
来解决此问题。
答案 2 :(得分:1)
您在类C中的perform_work()方法中编写的代码基本上与此等效:
public void perform_work() {
A someA = this;
someA.perform_work();
}
您可能会知道的不会更改变量someA引用的对象的类型。它仍然是C类型的对象,对其引用调用perform_work()方法将从类C调用实现。
试想一下以下情况:
public static void perform_more_work(A someA) {
someA.perform_work();
}
public void perform_work() {
perform_more_work(this);
}
很明显,上面的代码将调用哪个方法。