班级和私人会员

时间:2011-09-03 06:08:09

标签: java class private

class MC {

    private String name;

    void methodA(MC mc){
        System.out.println(mc.name);
    }

}

为什么我能够在methodA中访问名称变量?我在这里很困惑,有人可以解释一下吗?

3 个答案:

答案 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)

因为您已经从私有的范围访问它。

您的私有实现和数据将在声明它们的范围(例如类)中是私有的(并且可以访问)。