关于继承:Java实例变量可访问性

Java Instance Variable Accessibility

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
public class Joe {
    public int a;
    protected int b;
    private int b;
    int c;
}

我对最后一件事最感兴趣。


  • 公共:任何人都可以读/写
  • 保护:读/写子类实例和封闭包内的实例
  • private:类的任何实例的读/写以及内部或外部(封闭)实例
  • 国际会计准则:包私有,读/写同一包中的所有类

有关更多详细信息,请参见JLS。

编辑:为protected添加了评论,声明从同一个包中授予访问权限,你们完全正确。还为private添加了注释。我现在想起来了…;-)


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

  • 公共-任何人都可以读/写
  • 受保护-读/写实例子类和所有类同一包装内
  • int c:包私有,内部所有类的读/写同一包装
  • private-对该类本身的任何成员和内部类(如果有)进行读/写

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

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


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

我喜欢保持班级独立。如果另一个类需要访问我的类中的某个对象,则它应该是公共的(并且它应该通过一个方法,而不是属性)。否则,我觉得您已经破坏了封装,如抽象、信息隐藏和封装中所述。


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