Java实例变量可访问性

时间:2008-11-06 06:00:26

标签: java inheritance variables accessibility

Java中以下变量的可访问性有何不同?

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

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

4 个答案:

答案 0 :(得分:9)

  • public:可读/写任何人
  • protected:可读/可写 子类的实例和封闭包中的实例
  • private:读取/写入任何类的实例 和内部或外部(封闭)实例
  • int c: package-private,可读/可写 同一个包中的所有类

有关详细信息,请参阅JLS

编辑:添加了对受保护的评论说明从同一个包中授予了访问权限,你们是完全正确的。还添加了私人评论。我现在记得......; - )

答案 1 :(得分:2)

很抱歉回答了之前一个答案的更正,但我没有足够的声誉可以直接修改...

  • 公开 - 任何人都可读/写
  • protected - 可读/可写 实例子类和所有类 在同一个包里面
  • int c:package-private, 内部所有类都可读/写 同一个包
  • private - 对该类本身的任何成员和内部类(如果有)进行读/写

最好以这种方式订购访问修饰符,从最广泛的访问(公共)到最窄的(私有),知道当从窄到宽时,你不会失去任何可能性。

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

答案 2 :(得分:1)

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

我喜欢让课程自成一体。如果另一个类需要访问我的类中的某些东西,它应该是公共的(它应该是一个方法,而不是一个属性)。否则我觉得你已经崩溃encapsulation,如Abstraction VS Information Hiding VS Encapsulation中所述。

答案 3 :(得分:0)

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