java方法重写中的奇怪无限循环
在尝试方法重写的不同排列和组合时,我遇到了一个奇怪的无限循环。当从超类中的mutator方法调用超类的重写方法时,程序进入无限循环。我使用的代码如下:java方法重写中的奇怪无限循环,java,inheritance,overriding,Java,Inheritance,Overriding,在尝试方法重写的不同排列和组合时,我遇到了一个奇怪的无限循环。当从超类中的mutator方法调用超类的重写方法时,程序进入无限循环。我使用的代码如下: A类{ 私人整数x=10; 公开展览({ System.out.println(“在A的显示私人X的节目中:+X”); } 公共无效更改(int num){ x=num; //show();第1行 this.show();//第2行 //第1行和第2行交替使用仍然会产生相同的无限循环。 } } B类扩展了A类{ 公开展览({ System.out
A类{
私人整数x=10;
公开展览({
System.out.println(“在A的显示私人X的节目中:+X”);
}
公共无效更改(int num){
x=num;
//show();第1行
this.show();//第2行
//第1行和第2行交替使用仍然会产生相同的无限循环。
}
}
B类扩展了A类{
公开展览({
System.out.println(“在B的节目中不能显示私人X:”;
//更改(8);第3行
super.change(8);//第4行
//第3行和第4行交替使用仍然会产生相同的无限循环。
}
}
公共班机
{
公共静态void main(字符串[]args){
B=新的B();
b、 show();
}
}
输出为:
Inside B's show cant show private X:
Inside B's show cant show private X:
Inside B's show cant show private X:
Inside B's show cant show private X:
Inside B's show cant show private X:
Inside B's show cant show private X:
Inside B's show cant show private X:
... lots of times and then
at A.change(Main.java:9)
at B.show(Main.java:17)
at A.change(Main.java:9)
at B.show(Main.java:17)
at A.change(Main.java:9)
at B.show(Main.java:17)
at A.change(Main.java:9)
at B.show(Main.java:17)
at A.change(Main.java:9)
at B.show(Main.java:17)
... lots of times
是什么导致这个程序进入这个无限循环以及如何避免它呢?在
A
类中,您调用:this.show()
,正如this
的意思是“this object”,它将调用“this object的show()实现”,并且假设“this object”实际上是B的一个实例,“show()的实现”)'是在B.java
中定义的,因此导致无限循环。注意show()
只是this.show()的语法糖代码>-难怪这两行会做相同的事情-这两行都意味着相同的事情
听起来您的意图不是调用这个对象的show()方法的实现,而是:这个文件中定义的show()方法
在java中无法做到这一点。
你没有什么可以写的(不是this
,也不是super
,也没有别的)可以说:我想要这个显式的实现
当然,您可以解决这个问题:
public class A {
public void show() {
showImpl();
}
private static void showImpl() {
// this method is static.
// that means it has opted out, entirely, of inheritance.
System.out.println("Inside A's show showing private X: " + x);
}
public void change(int num) {
this.x = num;
showImpl();
}
}
现在你已经解决了这个问题。对showImpl的调用将转到同一文件中的showImpl的确切实现,每次都有保证,因为静态方法不会“执行”方法的动态查找。this.show()
将调用B
show()
调用change()
和change()的重写show()方法
调用show()
。。。这就是它在这里所做的。哦,好的@Arnaud,那么我应该改变什么来使用类A的show()方法呢?您必须从子类调用super.show()
。请参见:A.show()
被B.show()
覆盖,因此它永远不会被B
对象调用。