【发布时间】:2011-09-03 06:08:08
【问题描述】:
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,但它不能访问@987654327 @(其中mc 是其他MC 对象)。
然而,可见性修饰符的一个微妙规则是它们控制该类中的任何代码对同一类的其他对象的成员的访问。所以MC 类中的所有代码都可以访问MC 类型的所有对象的私有name 字段。这就是为什么MC.methodA 可以访问mc.name(其他一些MC 对象的名称)而不仅仅是它自己的名称。
编辑:Java语言规范的相关部分是6.6.1 Determining Accessibility:
否则,如果成员或构造函数声明为
private,则当且仅当它出现在包含成员或构造函数声明的顶级类 (§7.6) 的主体内时才允许访问。
【讨论】:
因为您已经从它的私有范围访问了它。
您的私有实现和数据将是私有的(并可在其中访问)它们已声明的范围(例如类)。
【讨论】:
this 中访问该字段?