2011-09-03 84 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)。