Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java方法重写中的奇怪无限循环_Java_Inheritance_Overriding - Fatal编程技术网

java方法重写中的奇怪无限循环

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

在尝试方法重写的不同排列和组合时,我遇到了一个奇怪的无限循环。当从超类中的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.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
对象调用。