JAVA中的protected(详解),以及和clone()方法有关的一些问题

本文详细解析了Java中protected修饰符的作用范围与使用限制。通过多个示例代码演示了子类如何访问基类中的protected成员及方法,尤其是在不同包间的访问规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/ciawow/article/details/8262609

********************************************************

很多的有关介绍JAVA语言的书籍,都对protected介绍的比较的简单,就是被protected修饰的成员或方法,对于本包和其子类可见,这里说的并不是完全的正确。

对于protected的成员或方法,要分子类和超类是否在同一个包中。

与基类不在同一个包中的子类,只能访问自身从基类继承而来的受保护成员,而不能访问基类实例本身的受保护成员。


* Class SubB has access only to the inherited from Base protected elements, i.e. its own elements, but the protecteddata of other Base instances is not accessible from SubB.

下面是借用别人的一些例子,相信你看完了,你也就彻底了解了protected微笑

ex1:

class  MyObject {}
 
public   class  Test {
     public   static   void  main(String[] args) {
       MyObject obj =  new  MyObject();
       obj.clone();  // Compile error.
    }
}
虽然MyObject与Test属于同一个包,但受保护的clone方法来自java.lang.Object类型,而在Test中,其基类Object的受保护方法是不可见的。
ex2:
class  MyObject2 {
     protected  Object clone()  throws  CloneNotSupportedException {
        return   super .clone();
    }
}
 
public   class  Test2 {
     public   static   void  main(String[] args)  throws  CloneNotSupportedException {
       MyObject2 obj =  new  MyObject2();
       obj.clone();  // Compile OK.
    }
}
MyObject与Test在同一个包中,受保护的clone方法来自MyObject本身,所以它对Test而言是可见的。另外在这个示例中,还说明了super关键字对于基类受保护成员的调用是个语言设计之中的“例外”。
ex3:
package  1
class  MyObject3 {
protected  Object clone()  throws  CloneNotSupportedException {
        return   super .clone();
    }
}
 
package  2
public   class  Test3  extends  MyObject3 {
     public   static   void  main(String args[]) {
       MyObject3 obj =  new  MyObject3();
       obj.clone();  // Compile error.
       Test3 tobj =  new  Test3();
       tobj.clone(); // Complie OK.
    }
}
企图跨越不同的包,从子类中调用基类实例的受保护方法。明显不行。
ex4:
class MyObject extends Test{}
public class Test {
  public static void main(String[] args) {
    MyObject obj = new MyObject();
    obj.clone(); // Compile ok.
  }
}

为什么可见呢?因为MyObject的clone方法继承自Test,而Test做为相对于Object的子类,是可以访问继承而来的属于它自己的受保护方法的。
ex5:
package 1
class MyObject extends Test {
}

package 2
public class Test {
  public static void main(String args[]) {
    MyObject obj = new MyObject();
    obj.clone(); // Compile OK
  }
}
虽然处于不同的包,但子类的受保护方法实际上继承自父类,父类的自己的受保护方法对自己可见,其原理同示例4.
ex6:
package 1
class MyObject extends Test {
  protected Object clone() throws CloneNotSupportedException {
    return super.clone();
  }
}

package 2
public class Test {
  public static void main(String args[]) {
    MyObject obj = new MyObject();
    obj.clone(); // Compile error!
  }
}
不同包中子类本身的受保护方法当然不可能对父类可见

ex7:
package a;
class MyObject extends Test {
    public static void main(String[] args) {
    Test test = new Test();
    test.clone(); // Compile error.
  }
}
package a;
public class Test {
  
}
同一个包中,父类实例的clone方法在子类中依然不可见,原理同示例1,就是因为父类的clone方法,实际上来自java.lang.Object。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值