你是否真正理解了protected的作用范围呢?

你是否真正理解了protected 的作用范围呢?


一提到访问控制符protected ,即使是初学者一般都会很自信的认为自己在这方面的理解没有问题。那好,我们提一个问题出来看看.....

问题提出:

请看下面两端代码,其中包B中的猫和鼠都继承了动物类。

Java代码 
  1. /代码1:包A中有一个动物类
  2. package testa;
  3. public class Animal{
  4.  protected void crowl(Stringc){
  5. System.out.println(c);
  6. }
  7. }
Java代码
  1. //代码2:包B中有两个类——猫类和鼠类
  2. package testb;
  3. import testa.Animal;
  4. class Cat extends Animal{
  5. }
  6. class Rat extends Animal{
  7.  public void crowl(){
  8. crowl( "zhizhi" ); //没有问题,继承了Animal中的protected 方法——crowl(String)
  9. Catcat= new Cat();
  10. cat.crowl( "miaomiao" ); //wrong,Themethodcrowl(String)fromthetypeAnimalisnotvisible
  11. }
  12. }

既然,猫和鼠都继承了动物类,那么在鼠类的作用范围内,看不到猫所继承的crowl()方法呢?

症结所在:

protected 受访问保护规则是很微妙的。虽然protected 域对所有子类都可见。但是有一点很重要,子类只能在自己的作用范围内访问自己继承的那个父类protected 域,而无法到访问别的子类(同父类的亲兄弟)所继承的protected 域。 说白了就是:老鼠只能叫"zhi,zhi"。即使他能看见猫(可以在自己的作用域内创建一个cat对象),也永远无法学会猫叫。

也就是说,cat所继承的crowl方法在cat类作用范围内可见。但在rat类作用范围内不可见,即使rat,cat是亲兄弟也不行。

附: 这就是为什么我们在用clone方法的时候不能简单的直接将对象aObject.clone()出来的原因了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值