protected
ref
作用域 - 廖雪峰的官方网站这里把java的作用域的用途逻辑说的很清晰,强烈推荐学习。比画表格的那些好多了!
对本包和所有子类可见,一般就用在方法上,字段上不提倡
实验
https://github.com/BinchaoPeng/JavaLearn/tree/master/src/protectedTest
关于跨包、继承、方法是否重写这三者的实验在这里,后面的总结部分不一定完整,看是实验更好体会
我的理解逻辑
首先,porotected是关于子类继承方面的问题,即子类及子类的子类可以访问父类的protected方法。
其次,跨包是public和default的问题,public允许跨包,default默认是同一包下。
最后,得考虑子类是否overide了父类的protected方法
从写代码的实际操作方面来看,我们会发生以下情况及他们的联合:
- 继承发生在不同包或同一包
- 调用类去生成实例在不同包或同一包(考虑同一包下,在子类中生成子类实例并调用protected方法和在其他类中生成子类实例并调用protected方法)
- 实例的引用可能是父类对象
- 可能overide了父类的protected方法,也可能没有
- 可能在父类包调用,也可能在子类包调用,或者其他包调用
但总体可以看:
一、包层面
跨包了,则不能访问非public方法,因此访问不到protected方法,这与继承无关
二、继承层面
只要在继承这条链路上才考虑protected,具体情况是(同一包的前提下):
在子类中生成子类实例并调用protected方法,可以调用
在其他类中生成子类实例并调用protected方法,不能调用,除非override了(因为override表示他自己写了这个方法)
三、override层面
如果overide了,可以看成子类本身就有这个方法,不用寻找父类
如果没有overide,则要考虑和父类的相对位置,因为要向上访问父类的方法
欢迎大家讨论指正,刚想到的理解思路,可能有纰漏错误之处,一起寻求一种最佳理解方式