我已经在Stack Overflow上看到了与我相关的问题的答案,但我仍然有些含糊不清。父类方法可以访问自己的私有实例变量。如果子类继承了该类,那么在getA()
类的实例上调用Child
方法时会发生什么?它是从a
班级返回Parent
还是从a
班级返回Child
?
class Parent {
private int a = 10;
public int getA() {
return a;
}
}
class Child extends Parent {
private int a = 22;
}
public class Test {
public static void main(String []args) throws Exception {
Child c = new Child();
System.out.println(c.getA());
}
}
答案 0 :(得分:3)
当继承方法getA()
时,如果你调用此方法,你将始终调用Parent
的方法。
当前对象将被视为Parent
而不是Child
,并且会返回Parent
的。
即使您拥有自己的变量a
,此变量也不会覆盖Parent
的{{1}}。它们彼此不同,具有不同的地址和不同的值。
如果您希望a
返回getA()
的{{1}},则需要覆盖方法以返回新变量。
Child
您也可以“疯狂”并执行以下操作:
a
通过这种方式,您可以返回class Child extends Parent {
private int a = 22;
@Override
public int getA(){
return a;
}
}
和class Child extends Parent {
private int a = 22;
@Override
public int getA(){
int superA = super.getA();
return a+superA;
}
}
的{{1}}之和。
(仅举例)
答案 1 :(得分:2)
这是this SO post的副本。
子类a
中的变量Child
隐藏了父类a
中的Parent
。
答案 2 :(得分:1)
无法覆盖字段。
在您的代码中,子项的实例(如c
所引用的实例)具有两个不同的字段,这两个字段都称为a
。
您无法在Parent
内完全访问Child
个私有变量。这就是private
的全部观点。您无法在Child
内写任何内容,以使父级的a
字段等于22。
*从技术上讲,你可以用反射。反思不算数,因为它的目的主要是让你破坏事物,做其他不可能的事情。
答案 3 :(得分:1)
私有变量是类的本地变量,在您的代码中,您继承父类的属性,因此您可以访问getA()并返回父属性。 除非你有子属性的公共getter方法,否则你无法访问子变量。
答案 4 :(得分:1)
坚持基础"私有成员变量只能通过自己的成员函数在类中访问,并且字段不能被继承"所以基本上当你在父类中访问私有变量A时,该方法应该访问它自己的私有成员而不是任何子类的私有字段。