已经研究过多次,过后就又忘记了,今天记录一下
修饰符 | 同类 | 同包 | 同包子类 | 不同包 | 不同包子类 |
---|---|---|---|---|---|
public | 可 | 可 | 可 | 可 | 可 |
protected | 可 | 可 | 可 | 可? | |
friendly | 可 | 可 | |||
private | 可 |
修饰符 | 说明 |
---|---|
public | 共有的,对所有类可见。 |
protected | 受保护的,对同一包内的类和所有子类可见。 |
private | 私有的,在同一类内可见。 |
默认的 | 在同一包内可见。默认不使用任何修饰符。 |
标为红色2个可,含义是不一样的:
同包子类的实现中可以访问父类的protected方法,子类的实例也能访问父类的protected方法(子类和父类在同一个包中)。
不同包子类的实现中,可以访问父类的protedted方法,但是无法通过子类的实例去访问父类的protected方法。(其实这个也好理解,即使你的子类继承了其他包中的父类,而且没改写父类的protected方法,那么这个protected方法还是定义在父类中,在其他包中访问类的protected方法本来就是不允许的。)
friendly可以理解为包权限,只有在同一个包中才能访问。
如果定义了2个class,他们位于同一个文件夹下,且他们都没有定义package,那这2个class可以访问对方的friendly成员吗? 答案是可以的,因为对于没有定义package,且处于同一个文件夹的类都会被归为 默认包。
访问控制和继承
请注意以下方法继承(不了解继承概念的读者可以跳过这里,或者点击 Java继承和多态 预览)的规则:
-
父类中声明为public的方法在子类中也必须为public。
-
父类中声明为protected的方法在子类中要么声明为protected,要么声明为public。不能声明为private。
-
父类中默认修饰符声明的方法,能够在子类中声明为private。
-
父类中声明为private的方法,不能够被继承
public | protected | friendly | private | |
普通类 | 可 | 否 | 可 | 否 |
内部类 | 可 | 可 | 可 | 可 |
接口 |