2011-09-03 105 views
1
class MC { 

    private String name; 

    void methodA(MC mc){ 
     System.out.println(mc.name); 
    } 

} 

爲什麼我可以訪問methodA中的名稱變量?我很困惑,請問有人能解釋一下嗎?班級和私人會員

+0

我建議閱讀:http://www.ibm.com/developerworks/library/ws-tip-mem-visibility.html。 –

回答

2

因爲您已經從它的私有範圍訪問它。

您的私人實現和數據將是私有的(和訪問)的範圍(例如類),他們在被宣佈。

+2

我懷疑問題是,爲什麼「私人」不會限制你只在'this'訪問該字段? – Owen

+1

我不認爲「範圍」是最好的概念來解釋這一點。使用「可見性」可以更好地解釋,如[官方文檔](http://download.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html)所示。 – aroth

6

您可以訪問它,因爲methodAMC類的一部分。類中的每個方法都可以訪問該類的私有數據成員(在當前實例中以及在任何其他實例中)。只有其他類不能。例如:

class MC { 
    private String name; 

    void methodA(MC mc){ 
     System.out.println(mc.name); 
    } 
} 

class SomeOtherClass { 
    void printMC(MC mc){ 
     System.out.println(mc.name); //compiler error here 
    } 
} 

下面是關於這一主題的一些官方文檔:http://download.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

3

因爲private並不適用於對象,它適用於的類。如果應用到對象private,那麼你的直覺是正確的:MC.methodA將有機會獲得this.name,但它不訪問mc.name(其中mc一些其他MC對象)。

但是,可見性修飾符的一個微妙的規則是,他們控制在階級同一類的其他對象的成員,任何代碼訪問。因此,MC類中的所有代碼都可以訪問MC類型的所有對象的專用name字段。這就是爲什麼MC.methodA有權訪問mc.name(某個其他MC對象的名稱),而不僅僅是它自己的名稱。

編輯:Java語言規範的相關部分是6.6.1 Determining Accessibility

否則,如果成員或構造被聲明private,則訪問被許可,如果,如果它的主體內只發生包含成員或構造函數聲明的頂級類(§7.6)。