class MC {
private String name;
void methodA(MC mc){
System.out.println(mc.name);
}
}
为什么我能够在methodA
中访问名称变量?我在这里很困惑,有人可以解释一下吗?
答案 0 :(得分:6)
您可以访问它,因为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
答案 1 :(得分:3)
由于private
不适用于对象,因此它适用于类。如果private
应用于对象,那么您的直觉就是正确的:MC.methodA
可以访问this.name
,但它会不可以访问mc.name
(其中mc
是其他MC
个对象)。
但是,可见性修饰符的一个微妙规则是它们控制对该类中的任何代码的访问权限该同一类的其他对象的成员。因此,MC
类中的所有代码都可以访问name
类型的所有对象的私有MC
字段。这就是为什么MC.methodA
可以访问mc.name
(其他MC
个对象的名称)而不仅仅是自己的名称。
编辑:Java语言规范的相关部分为6.6.1 Determining Accessibility:
否则,如果成员或构造函数声明为
private
,则当且仅当它发生在包含成员声明的顶级类(§7.6)的主体内时才允许访问或构造函数。
答案 2 :(得分:2)
因为您已经从私有的范围访问它。
您的私有实现和数据将在声明它们的范围(例如类)中是私有的(并且可以访问)。