权限
| private | 默认访问权限 | protected | public | |
|---|---|---|---|---|
| 类本身 | 是 | 是 | 是 | 是 |
| 相同包子类 | 否 | 是 | 是 | 是 |
| 相同包非子类 | 否 | 是 | 是 | 是 |
| 不同包子类 | 否 | 否 | 是 | 是 |
| 不同包非子类 | 否 | 否 | 否 | 是 |
总结:
- 子类继承父类总是可以访问父类protected和public的属性和方法,如果相同包,会更进一步获取默认访问权限的属性以及方法的访问权限.
- 非子类不同包只能访问public的属性和方法,如果相同包,能访问非private修饰的属性和方法.
- 从内存上看,子类继承父类是将子类与父类合并生成新类,子类拥有父类所有的属性和方法,只是不能访问父类私有的,可能还有默认访问权限的.
继承(注解)
子类是否可以继承父类中的注解,不同情况如下:
| 无@Inherited | 有@Inherited | |
|---|---|---|
| 类上的注解 | 否 | 能 |
| 抽象方法上的注解(子类已实现) | 否 | 否 |
| 普通方法上的注解(子类能继承的) | 能 | 能 |
| 子类覆写父类的方法 | 否 | 否 |
总结:
- @Inherited 只能决定类上的注解是否可以继承
- 方法或者属性是否继承到注解只决定于该方法或属性本身(如果子类已覆写则看子类,否则看父类)