示例一:
//包a中有一个动物类 package testa; public class animal { protected void crowl(string c){ system.out.println(c); } }
(视频教程推荐:java视频)
示例二:
package testb;import testa.animal; class cat extends animal { } public class rat extends animal{ public void crowl(){ this.crowl("zhi zhi"); //没有问题,继承了animal中的protected方法——crowl(string) animal ani=new animal(); ani.crowl("animail jiaojiao"); //wrong, the method crowl(string) from the type animal is not visible cat cat=new cat(); cat.crowl("miao miao"); //wrong, the method crowl(string) from the type animal is not visible } }
既然,猫和鼠都继承了动物类,那么在鼠类的作用范围内,看不到猫所继承的crowl()方法呢?
问题解答:
protected受访问保护规则是很微妙的。虽然protected域对所有子类都可见。但是有一点很重要,不同包时,子类只能在自己的作用范围内访问自己继承的那个父类protected域,而无法到访问别的子类(同父类的亲兄弟)所继承的protected域和父类对象的protected域ani.crow1()。 说白了就是:老鼠只能叫zhi,zhi。即使他能看见猫(可以在自己的作用域内创建一个cat对象),也永远无法学会猫叫。
也就是说,cat所继承的crowl方法在cat类作用范围内可见。但在rat类作用范围内不可见,即使rat,cat是亲兄弟也不行。
另外: 这就是为什么我们在用clone方法的时候不能简单的直接将对象aobject.clone()出来的原因了。而需要在aobject.bobject=(bobject)this.bobject.clone();
总结:
当b extends a的时候,在子类b的作用范围内,只能调用本子类b定义的对象的protected方法(该方法从父类a中继承而来)。而不能调用其他a类(a 本身和从a继承)对象的protected方法。
推荐教程:java入门程序
以上就是实例详解java中的protected关键字的详细内容。
