转换为超类时出现 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
this
从 C
类型转换为 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);
}
上面的代码会调用哪个方法应该很明显了。
我在网上找到了以下代码。
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
this
从 C
类型转换为 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);
}
上面的代码会调用哪个方法应该很明显了。