2015-11-13 80 views
0

我運行一個測試程序,以瞭解更多有關成員變量的知名度,我創建了以下3類:子類成員變量的知名度,另一個子

ParentClass.java

public class ParentClass { 
    protected int mMember; 
} 

ChildClass.java

public class ChildClass extends ParentClass { 
    ChildClass() { 
     mMember = 10; 
    } 
} 

ChildChildClass.java

public class ChildChildClass extends ChildClass { 
    ChildChildClass() { 
     mMember = 5; 
    } 
} 

什麼是ChildChildClassmMember變量的訪問級別?是大衆保護

回答

3

這將不同於C殘留保護++哪裏取決於繼承類型(公共,保護或私有),它仍然是相同的。

C++允許這種繼承的主要原因是它支持多繼承。但是,Java不支持它。因此,它只是通過將訪問級別保持爲超類來簡化它。

2

ChildChildClassmMemberParentClass繼承,能見度不會改變 - 因此它仍然是protected

+0

我在JavaDocs中查了一下,但似乎無法找到任何與之相關的東西。任何證據? –

+0

@JDev - 你可以試試看,並得到你的證明(或相信我:)) –

+1

證明只是因爲你擴展了父類,它並沒有改變定義的變量。 childchild類就像過去的兩個類,它就像寫作: –

2

protected,已經從父類繼承。

mMember父類爲受保護的修飾符聲明。 ChildChildClass延伸ChildClass其中延伸父類訪問修飾符在ChildClass中未被更改,因此受保護的是ChildChildClass中的訪問修飾符,該修飾符已從ParentClass繼承。

看看oracle文章來控制變量的訪問修飾符。

向變量提供限制最多的訪問,除非您需要不受限制的訪問。

編輯:

通過向mMember重新定義減少訪問一旦更改訪問修飾符私人更改ChildClass的代碼如下

private int mMember; 

,ChildChildClass無法訪問mMember這是私人現在。您將收到此錯誤:The filed ChildClass.mMember is not visible

+0

你能詳細說一下嗎? –

+0

更新了答案 –

2

問題不明確。您只能在聲明點上設置可見性。在使用點你可以看到變量或不是。因此,您不能問「訪問變量時的可見性是什麼?」但只有「我可以訪問變量嗎?」。對於您的情況,這意味着:ChildChildClassParentClass的一個(n間接)子女,mMember被宣佈爲protected,因此它在ChildChildClass內可見。欲瞭解更多信息,請參閱the Oracle page about Access Modifiers

+0

我明白你的意思了,但我可以清楚地看到它在整個兒童課程中都是可見的,這不是我的問題目標。另外,這個Oracle文檔在這種情況下並不能滿足我的好奇心。 –

相關問題