类的克隆问题

  1. object中有默认protected的clone()方法,此方法默认抛出异常

    protected native Object clone() throws CloneNotSupportedException;
    
  2. 因为每个类直接或间接的父类都是Object,因此它们都含有clone()方法,但是因为该方法是protected,所以都不能在类外进行访问。

  3. 克隆方法是浅拷贝,对于一些地址引用的成员属性会复制同一地址,拷贝对象会对源对象造成影响,因此需要用到引用变量时要进行深拷贝。而深拷贝就是让被引用对象也实现clone方法

  4. 实现浅拷贝步骤

    1. 被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常),此接口为标志接口(不含任何方法)
    2. 覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象,(native为本地方法)
      • 这里访问修饰符设置为public目的是当进行深拷贝时,不在同一包下的其他类能引用此方法
    @override
    public Object clone() throws CloneNotSupportedException{
         return super.clone();
     }
    
    //或者避免强转,直接返回被拷贝的类
    @override
    public Student clone() throws CloneNotSupportedException{
         return (Student) super.clone();
    }
    
  5. 深拷贝

    1. 深克隆需要重写(Override)Object类的clone()方法,并且在方法内部调用持有对象的clone方法。

      @Override
          public Object clone() throws CloneNotSupportedException {
              MyFile2 file = (MyFile2) super.clone();
              file.info = (Info) file.info.clone();
              return file;
          }
      
posted @ 2021-03-02 11:05  北辰南风  阅读(91)  评论(0)    收藏  举报