访问子类中的私有实例

时间:2015-04-01 06:12:53

标签: java inheritance

我已经在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());
   }    
}

5 个答案:

答案 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时,该方法应该访问它自己的私有成员而不是任何子类的私有字段。