Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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_Subclass - Fatal编程技术网

为什么父类中的这个。或这个。没有效果?JAVA

为什么父类中的这个。或这个。没有效果?JAVA,java,inheritance,subclass,Java,Inheritance,Subclass,我想知道为什么。。。。在这种情况下没有效果。以下是我考试的一项任务: class PARENT { public int x; public PARENT(int a) {this.x = a;} public int getX() {return this.x;} public int getY() {return this.getX();} } class CHILD1 extends PARENT { public int x;

我想知道为什么。。。。在这种情况下没有效果。以下是我考试的一项任务:

class PARENT {
    public int x;
    public PARENT(int a)    {this.x = a;}

    public int getX()   {return this.x;}
    public int getY()   {return this.getX();}
}

class CHILD1 extends PARENT {
    public int x;
    public CHILD1(int b) {super(b); this.x = 2 * b;}
}

class CHILD2 extends PARENT {
    public CHILD2(int c)    {super(c);}

    public int getX()   {return 5;}
}

public class ThisTestMain {
    public static void main(String[] args)  {
        PARENT PP = new PARENT(10);
        PARENT PC1 = new CHILD1(100);
        PARENT PC2 = new CHILD2(1000);
        System.out.println(PP.getY());
        System.out.println(PC1.getY());
        System.out.println(PC2.getY());

        CHILD1 CC = new CHILD1(10);
        System.out.println(CC.getY());
    }
}
输出为:

10
100
5
10
我现在的问题是为什么在System.out.printlnPC1;输出不是200。因为当我调试IntelliJ中的代码时,我可以看到它具有引用 CHILD1@799对象可以看到值x和PARENT.x

在这一点上,为什么getX选择PARENT.x而不是CHILD1.x

通过重写方法,这也没有效果。在这种情况下,例如System.out.printlnPC2;在CHILD2中始终使用getX,无论是否在getY方法中写入,都返回this.getX;或者返回getX

有人能总结一下背后的系统吗?也许也会考虑超级?谢谢

CHILD1定义一个名为x的新字段,该字段在父字段中对字段x进行阴影处理。删除该字段。像

class CHILD1 extends PARENT {
    // public int x;
    public CHILD1(int b) {super(b); this.x = 2 * b;}
}

在CHILD1中,没有重写的方法

因此,当您调用getY时,它会从父级调用getX。来自父类的方法不知道其子类中的变量


您必须重写CHILD1中的getX方法才能访问变量CHILD1.x。

谢谢,但我想知道为什么CHILD1中的int x没有在PARENT中隐藏int x。特别是当我使用this.xBecause从CHILD1获取自引用时,实例变量不会像方法那样被重写。CHILD1方法将访问CHILD1的x,但PARENT方法将访问PARENT的x-有关更多详细信息,请参阅。对于父int x,您可以使用super.x,但最好不要对字段进行阴影处理,这会破坏继承。感谢@racraman的链接,现在我了解了这种情况@Elliott Frisch我仍然不明白你的意思,因为显然你不能从PARENT.getX访问CHILD1.x,因为这个方法只看到他自己类中的变量。您只能通过重写CHILD1中的方法来访问它,因此super.x是多余的。这个.x方法也只能看到他自己类中的变量。-不完全是。方法可以在自己的类中查看变量,也可以在超类中查看受保护/公共变量。这意味着CHILD1方法可以访问PARENT1变量,但只是在这种情况下,PARENT1变量被同名的CHILD1变量所隐藏-因此CHILD1方法可以使用super.x语法访问PARENT1变量。同样值得强调的是,永远不要命名变量,因为它们会像这样隐藏超类变量;在实际项目中避免这种情况:谢谢!所以继承的和未重写的方法通常只能访问父类的变量字段?