Java 访问子类中的私有实例
我已经看到了有关堆栈溢出的问题的答案,但我仍然有一些模棱两可的地方。父类方法可以访问自己的私有实例变量。如果子类继承了该类,那么当对Java 访问子类中的私有实例,java,inheritance,Java,Inheritance,我已经看到了有关堆栈溢出的问题的答案,但我仍然有一些模棱两可的地方。父类方法可以访问自己的私有实例变量。如果子类继承了该类,那么当对子类的实例调用getA()方法时会发生什么?它是从父类返回a,还是从子类返回a class Parent { private int a = 10; public int getA() { return a; } } class Child extends Parent { private int a = 22;
子类的实例调用getA()
方法时会发生什么?它是从父类返回a
,还是从子类返回a
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());
}
}
这是一个复制品
子类Child
中的变量a
隐藏父类parent
字段中的a
在您的代码中,child的实例(如c
)有两个不同的字段,它们都称为a
您无法访问子项中的父项
的私有变量,请使用句号。这就是private
的全部要点。没有什么*您可以在Child
中写入,以使父项的a
字段等于22
*从技术上讲,你可以通过反思来实现。不过,反射并不重要,因为它的目的本质上是允许您中断某些事情,并执行其他不可能的事情。私有变量是类的本地变量,在代码中您继承父类的属性,因此可以访问getA(),它将返回父类的属性。
并且,除非具有子属性的公共getter方法,否则无法访问子变量。由于继承了方法getA()
,如果调用此方法,将始终调用父方法
当前对象将被视为父对象,而不是子对象,并且将返回父对象的a
即使您有自己的变量a
,此变量也不会覆盖父级的a
。它们彼此不同,有不同的地址和不同的值
如果希望getA()
返回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;
}
}
这样,您就可以返回父项
和子项
的总和a
(仅举一个例子)坚持基本原则“私有成员变量只能通过其自身的成员函数在类内访问,字段不能被继承”,因此基本上当您在父类中访问私有变量A时,该方法应该访问它自己的私有成员,而不是任何子类的私有字段 我知道它隐藏了,这不是我想要的actually@KishoreKumarKorada那你想要什么?我知道字段不能被继承,但是方法可以。所以,当我在child类中有getA()时,它不会选择child的一个实例变量吗?@KishoreKumarKorada注意,私有字段是否被继承取决于您如何定义“继承的”,并且没有正式的定义。在某些方面他们是,在某些方面他们不是。(我从我的答案中删除了表示它们不是的部分)根据我对问题的理解,这不是关于将Parent
的a
更改为22,而是为什么getA()
总是返回Parent
的a
,尽管他有自己的新的a
变量这里要记住的重要信息是,方法可以被它们的子类重写,但变量不能被重写。@Loki我相信原来的问题在这一点上是错误的。@Loki是的,这正是我想知道的