2011-02-06 27 views
1

您好我只是想undertand以下行爲.. 我已定義的相同方法 - 在基GG()和派生類具有不同訪問多態性 - 在派生類改變訪問指示符

Class Base 
{ 
// some thing 
**private** Integer gg(){ 
//return something 
} 
} 

Class Derived{ 
// something 
**public** Integer gg(){ 
//return something 
} 
} 

在我初始化變量時的主要方法

Base d = new Derived() 

並試圖調用d.gg()它說Base.gg()是私有的。修改訪問說明符是否會使方法調用返回到Base類方法?當我將基類中的gg()的訪問指定符更改爲public時,它就像多態性應該那樣調用Derived類中的方法。

從我讀到的關於多態性的文章中,可以確定訪問說明符在派生類中的限制性較小,這在這裏就是這種情況。

回答

5

通過引用到基類訪問對象意味着您打算通過基類指定的接口訪問它。如果您已經在基類中聲明瞭方法private,那麼您無法通過引用到基礎來訪問它!

考慮如果情況並非如此,將引發很多荒謬:

Base b; 

if (some condition) { 
    b = new Base(); 
} 
else { 
    b = new Derived(); 
} 

b.ggg(); // Ok, or not? 
+0

我的文章中的對象d存儲對派生類的引用嗎?變量類型是如何決定一個方法的訪問權限,而不是它所指的實際對象? – dasman 2011-02-06 19:47:44

+0

好吧,我現在明白了。謝謝。 – dasman 2011-02-06 19:49:39

2

在Java中一個超類的私有成員在派生類中可見。因爲它是在派生類中不可能的:

  • 參考超類的私有成員 - 他們在那裏,但你就是不能存取權限他們,他們是一個超級的內部細節類別不意味着在派生類中使用,
  • 重寫私有方法

所以在你的例子中Derived.gg()方法並不是重寫Base.gg()方法。 Derived.gg()只是一個與Base類中的方法同名的方法,但它們沒有任何共同之處。也沒有名稱衝突,因爲Derived類不知道Base.gg()方法。