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。 –