2015-04-01 91 views
2

我已经在Stack Overflow上看到了有关我的问题的答案,但我仍然留有一些含糊之处。父类方法可以访问自己的私有实例变量。如果子类继承该类,那么在Child类的实例上调用getA()方法时会发生什么?它是否返回Parent类中的a类或Child类中的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()); 
    }  
} 

回答

3

由于方法getA()是继承的,所以如果您调用此方法,您将始终调用Parent的方法。

当前对象将被视为Parent而不是Child,并且Parent的a将被返回。

即使您有自己的变量a,该变量也不会覆盖Parenta。它们彼此不同,具有不同的地址和不同的值。

如果你想要getA()返回Childa,你需要重写方法来返回你的新变量。

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;  
    } 
} 

这种方法你可以返回Parent总和的和Childa

(只是一个例子)

2

这是一个this SO post的副本。

子类Child中的变量a隐藏了父类Parent中的a

+0

我知道它藏起来了,那不是我想要的 – 2015-04-01 06:19:36

+0

@KishoreKumarKorada那么你想要什么? – immibis 2015-04-01 06:22:02

+2

我知道字段不能被继承,但方法会。所以当我有getA()在子类中不会选择孩子的实例变量? – 2015-04-01 06:23:55

1

字段不能被覆盖。

在代码中,孩子的一个实例(如通过c提到的一个)具有两个不同的领域,它们都被称为a

您不能访问的Child内部的私有变量,句号。这是private的整个点。没有什么*您可以在里面Child写尽了父母的a场等于22.




*从技术上讲,你可以与反思。尽管反思并不重要,因为它的目的本质上是让你打破事情,做一些不可能的事情。

+1

正如我理解的问题,这不是关于将'Parent'的'a'改为22,而是为什么'getA()'将始终返回'父'''a,尽管他有自己的新'a'变量 – Loki 2015-04-01 06:20:58

+0

这里要记住的回家信息是方法**可以被它们的子类覆盖,但变量**不能**覆盖。 – 2015-04-01 06:21:02

+0

@Loki我相信原来的问题在这一点上是错误的。 – 2015-04-01 06:21:40

1

私有变量是类的局部变量,并且在您的代码中,您正在继承父类的属性,因此您可以访问getA(),并且它将返回父类的属性。 你不能访问孩子的变量,除非你有公共的孩子属性的getter方法。

1

坚持基本“私有成员变量将只通过自己的成员函数的类中访问和字段不能被继承”所以基本上,当你访问私有变量A父类,该方法应该访问它自己的私有成员,而不是任何子类的私有字段。