Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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 - Fatal编程技术网

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是的,这正是我想知道的