【问题标题】:class and private members [duplicate]类和私人成员[重复]
【发布时间】:2011-09-03 06:08:08
【问题描述】:
class MC {

    private String name;

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

}

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

【问题讨论】:

标签: java class private


【解决方案1】:

您可以访问它,因为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

【讨论】:

    【解决方案2】:

    因为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) 的主体内时才允许访问。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我怀疑问题是,为什么“私人”不限制您只能在this 中访问该字段?
      • 我不认为“范围”是用来解释这一点的最佳概念。使用“可见性”更好地解释它,如official documentation
      猜你喜欢
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      • 2015-07-23
      • 2016-09-06
      • 2011-02-24
      • 2022-11-13
      相关资源
      最近更新 更多