2012-03-10 65 views
0

所以我有延伸A.Java中使用了錯誤的類繼承的方法

public class A 
{ 
    private int a = 1; 
    public int getA() 
    { 
    return a; 
    } 
} 

public class B extends A 
{ 
    private int a = 2; 
} 

然而,當B.getA()被調用父類,這裏refered爲A和B類,則返回1個來自A班而不是2個B班。我做錯了什麼?因爲幾個月前我遇到過類似的問題,並且在經過大量的混亂之後奇蹟般地工作。唯一的區別是該方法處理向ArrayList添加對象。

謝謝。

回答

6

私有變量對於子類是私有的。 A.a和B.a是兩個完全不同的領域。如果要更改子類中的數據,請將其設置爲受保護的字段,或者(更好)將可選抽象的getter添加到父類並在子類中覆蓋它。

+0

因此,繼承的方法調用了Aa?所以我應該重寫繼承的方法來調用B.a,對嗎? – 2012-03-11 01:59:02

+0

是的。那是對的。 (但是你不會「呼叫」'B.a' ...你會使用它,你只需要「呼叫」方法。) – 2012-03-11 02:37:53

+0

我正在談論獲取者。 – 2012-03-11 22:52:11

2

的原因是,在一個類中定義的字段是在子類中從未重寫,字段訪問修飾符不論

如果您在使用相同的名稱作爲超字段的子類聲明的字段,你的子類實際上有與該名稱的兩個領域。從超類繼承的字段在子類中是隱藏,但是(如果訪問規則允許)可以在子類中訪問超類版本;例如通過使用類名來限定字段名稱。

(在你的具體的例子中,訪問規則禁止B訪問A宣佈a一種private字段或方法只能從類訪問本身或嵌套類。但即便如此,有兩個領域在任何情況下B實例調用a。)