【问题标题】:Java Instance Variable Accessibility [duplicate]Java 实例变量可访问性 [重复]
【发布时间】:2023-03-17 22:52:01
【问题描述】:

Java中以下变量的可访问性有什么区别?

public class Joe {
    public int a;
    protected int b;
    private int b;
    int c;
}

我最感兴趣的是最后一个在做什么。

【问题讨论】:

    标签: java inheritance variables accessibility


    【解决方案1】:
    • public:任何人都可以读/写
    • protected: 可读写 子类的实例和来自封闭包内
    • private: 类的any实例可读/写 和内部或外部(封闭)实例
    • int c: 包私有,读/写 同一个包内的所有类

    查看JLS了解更多详情

    编辑:添加了受保护的注释,说明从同一个包内授予访问权限,你们是完全正确的。还为private 添加了评论。我现在想起来了... ;-)

    【讨论】:

    • 我相信你对保护的理解是错误的。在 Java 中,protected 意味着包私有。它是 C# 等价于 internal
    • 不,他对子类的受保护和 r/w 绝对是正确。 dhiller 甚至提供了详细解释语言规范的链接。
    • 仔细阅读规范,它表示实例的类型必须是类或子类。它没有记录类型实例是从哪里使用的。
    • javacampjavacamp.org/javavscsharp/access.html有更清晰的解释
    • 其实第三个也不太对:私有实例变量可以被该类的any实例访问。
    【解决方案2】:

    很抱歉对上一个答案进行更正,但我没有足够的声誉直接修改...

    • public - 任何人都可以读/写
    • protected - 读/写 实例子类和所有类 在同一个包裹内
    • int c:包私有, 内部所有类的读/写 同一个包
    • private - 该类本身和内部类(如果有)的任何成员均可读/写

    最好以这种方式对访问修饰符进行排序,从最广泛的访问权限 (public) 到最窄的访问权限 (private),知道从窄到宽时,您不会失去任何可能性。

    这对于“受保护”尤其重要,在这种情况下,经常被误解为同一个包中的类也可以访问一个类的受保护成员(不仅仅是它的子类)。

    【讨论】:

      【解决方案3】:

      我尝试完全避免包级访问(您提到的最后一次访问)。

      我喜欢让课程自成一体。如果另一个类需要访问我的类中的某些东西,它应该是public(它应该是一个方法,而不是一个属性)。否则我觉得你已经破坏了encapsulation,正如Abstraction VS Information Hiding VS Encapsulation 中所解释的那样。

      【讨论】:

      • 有时 package-private 在单元测试中会派上用场。但基本上我认为你是对的。
      • @WMR:对,但可以说单元测试可以使用反射来访问私有数据或测试受保护/私有方法...(如果 SecurityManager 允许)
      • Package-private 应该是顶级类和接口的默认值。在某些罕见的情况下是合适的(在没有朋友的情况下)。
      【解决方案4】:

      所有这些都是编译时保护,它们可以在运行时通过反射轻松覆盖。

      【讨论】:

      • 除非 SecurityManager 另有说明 ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 2011-10-26
      • 1970-01-01
      相关资源
      最近更新 更多