1.protected受访问保护规则是很微妙的。虽然protected域对所有子类都可见。但是有一点很重要,子类只能在自己的作用范围内访问自己继承的那个父类protected域,而无法到访问别的子类(同父类的亲兄弟)所继承的protected域。这就是为什么我们在用clone方法的时候不能简单的直接将对象Object.clone()出来的原因了。(必须实现Cloneable 接口,并重写clone方法,并将访问控制符改为public,这样任何方法中克隆对象。)
2.完整的访问规则:
- 公共属性总能访问
- 同一包的子类,可以任意使用
- 同一个包的正常类,可以直接用他的实例进行访问
- 不同包的正常类,无法访问任何属性和方法
- 不同包的子类,不能使用父类实例的属性和方法
- 不同包的子类,不能使用其它包的子类实例的属性和方法
- 不同包的子类,可以直接使用父类的属性和方法
- 总之,不同包的子类就规规矩矩的在自己的代码里用父类的属性就行了。其它的使用都是不允许的。
3.访问修饰的总结
Here is a summary of the four access modifiers in Java that control visibility:
-
Visible to the world (public).
-
Visible to the package and all subclasses (protected).
-
Visible to the package—the (unfortunate) default. No modifiers are needed.