解释

访问修饰符 访问原则
private 同类
默认 同包
protect 同包 + 子类(?)
public 任何地方

注意:

  1. 对于类来说,只有默认和public
  2. 上面这些都是对于类成员说的。
  3. 如果不涉及继承,应用上只有三种(private,默认/protect,public)
  4. 如果是继承访问,那个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?

答案是:在继承的场景下,只想让一个方法访问,同时不想让这个包以外的访问。