【JavaSE】public、protected、default、private的区别
解释
访问修饰符 | 访问原则 |
---|---|
private | 同类 |
默认 | 同包 |
protect | 同包 + 子类(?) |
public | 任何地方 |
注意:
- 对于类来说,只有默认和public
- 上面这些都是对于类成员说的。
- 如果不涉及继承,应用上只有三种(private,默认/protect,public)
- 如果是继承访问,那个protect才有用处。
对象访问
修饰符 | 对象访问范围 |
---|---|
private | 同类 |
默认/protect | 同包 |
public | 任何地方 |
也就是:在new一个对象,然后通过这个对象去调用被访问修饰符修饰过的方法的时候。
默认和protect是一样的。
就是同包以内都可以访问到。
这种访问方式,涉及子类,只用看:在不在同一个包?
默认:同包子类(Y)不同包子类(X)
protect:同包子类(Y)不同包子类(X)
在就是按那个来,这种访问方式,这两个是一致的。
继承访问
范围 | private | 默认 | protect | public |
---|---|---|---|---|
同类 | Y | Y | Y | Y |
同包子类 | X | Y | Y | Y |
不同包子类 | X | X | Y | Y |
这种就是,涉及继承。
访问不是new那种,而是直接一个类里面的方法直接调用你被修饰符修饰的方法。
这种情况,默认 和 protect 就不一样。
这个时候,protect 的范围成了:同包 + 所有子类。
它的所有子类可以访问,不是new一个对象,然后通过对象去访问的,而是直接访问的。
能证明这点的就是,不同包的子类。
能用这种方式,访问protect,但是访问不了默认。
这个地方,我发现很多同学其实是模糊的,根本没理解清除。
所以最后结论是:
如果是new对象那种访问,那默认
和protect
是一样的,==都是只能同包访问==。
如果是继承那种直接调方法访问,那默认
还是只能访问同包的,但是protect
可以在同包 + 所有子类访问。
所以,我们什么时候用protect?
答案是:在继承的场景下,只想让一个方法访问,同时不想让这个包以外的访问。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LMC_Blog!