class MC {
private String name;
void methodA(MC mc){
System.out.println(mc.name);
}
}
爲什麼我可以訪問methodA
中的名稱變量?我很困惑,請問有人能解釋一下嗎?班級和私人會員
class MC {
private String name;
void methodA(MC mc){
System.out.println(mc.name);
}
}
爲什麼我可以訪問methodA
中的名稱變量?我很困惑,請問有人能解釋一下嗎?班級和私人會員
您可以訪問它,因爲methodA
是MC
類的一部分。類中的每個方法都可以訪問該類的私有數據成員(在當前實例中以及在任何其他實例中)。只有其他類不能。例如:
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
因爲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)。
我建議閱讀:http://www.ibm.com/developerworks/library/ws-tip-mem-visibility.html。 –