欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于Java protected的深入理解

程序员文章站 2023-12-14 16:14:46
一提到访问控制符protected,即使是初学者一般都会很自信的认为自己在这方面的理解没有问题。那好,我们提一个问题出来看看.....请看下面两端代码,其中包b中的猫和鼠都...
一提到访问控制符protected,即使是初学者一般都会很自信的认为自己在这方面的理解没有问题。那好,我们提一个问题出来看看.....

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

//代码1:包a中有一个动物类 
package testa; 
public class animal { 
    protected void crowl(string c){ 
        system.out.println(c); 
    } 

//代码2:包b中有两个类——猫类和鼠类 
package testb; 
import testa.animal; 
class cat extends animal{ 


class rat extends animal{ 
    public void crowl(){ 
                crowl("zhi zhi"); //没有问题,继承了animal中的protected方法——crowl(string) 
            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域。 说白了就是:老鼠只能叫"zhi,zhi"。即使他能看见猫(可以在自己的作用域内创建一个cat对象),也永远无法学会猫叫。
也就是说,cat所继承的crowl方法在cat类作用范围内可见。但在rat类作用范围内不可见,即使rat,cat是亲兄弟也不行。
另外:这就是为什么我们在用clone方法的时候不能简单的直接将对象aobject.clone()出来的原因了。

总之,当b extends a的时候,在子类b的作用范围内,只能调用本子类b定义的对象的protected方法(该方法从父类a中继承而来)。而不能调用其他a类对象的protected 方法

上一篇:

下一篇: