2012-03-20 47 views
2

爲什麼下面的代碼編譯正常?Java訪問誤解

public class MyStack { 

    private static MyStack myStack ; 
    private Stack<MyObject> stackOfMyObjects; 

    private MyStack() { 
     stackOfMyObjects = new Stack<MyObject>() ; 
    } 

    public static void pushToStack(MyObject myObject, MyStack myStack2) { 
     myStack2.stackOfMyObjects.push(myObject) ; 
    } 

} 

這裏,pushToStack方法,怎能myStack2stackOfMyObjects成員,事件雖然stackOfMyObjects已定義的私有?

+2

你問爲什麼類中的函數可以訪問該類的實例的私有成員?如果不是,誰可以? – 2012-03-20 09:20:01

+0

私人課程,而不是對象。所以如果你需要實現'int compareTo(T rhs)',你也可以訪問右側的字段。 – 2012-03-20 09:20:55

+0

@DavidSchwartz我編輯了這個問題。請看一看。 – Babloo 2012-03-20 09:24:57

回答

10

這裏,在pushToStack方法中,如何通過myStack2訪問stackOfMyObjects,事件雖然已經定義了stackOfMyObjects爲private?

因爲它仍然是MyStack。 Java中的訪問控制是關於代碼出現的地方,而不是它是否訪問「不同」對象。

基本上,MyStack內的所有代碼都可以使用在MyStack內聲明的私有成員。

有關更多詳細信息,請參見section 6.6 of the JLS。具體而言,在節6.6.1:

否則,如果成員或構造被聲明私人,那麼訪問是當且僅當頂層類的主體內發生時(第7.6節),其包圍所述允許成員或構造函數的聲明。

這裏,接入確實發生頂層類(MyStack)包圍stackOfMyObjects變量的聲明的主體內,所以訪問被允許。

3

因爲它是相同的類。

Private在類作用域中,而不是對象作用域,所以當在類中時,可以訪問該類的所有私有/受保護成員。

0

我假設myStack2是類型MyStackstackOfMyObjects被定義爲私有,但其仍然在相同的 MyStack。這是一個全局定義的變量,可以從所有對象中訪問,這些對象都是從這個類創建的。