为什么父类中的这个。或这个。没有效果?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变量。同样值得强调的是,永远不要命名变量,因为它们会像这样隐藏超类变量;在实际项目中避免这种情况:谢谢!所以继承的和未重写的方法通常只能访问父类的变量字段?