2015-04-01 81 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父類,該方法應該訪問它自己的私有成員,而不是任何子類的私有字段。