Cloneable接口

561 阅读1分钟

Cloneable 接口 是标记接口

cloneObject类 中的方法,访问级别为 protected

使用 clone 建立一个原对象的副本 ,不会改变原对象的状态

如果类没有实现 Cloneable 接口,那么它将无法使用clone方法,Object类 的clone方法会抛出 CloneNotSupportedException

Manage manage = new Manage("Tom",18).clone();  // 在内存中会开辟两处空间
manage.work();  // 克隆对象执行方法,不会影响到原对象的状态

浅克隆

  • 没有克隆对象中引用的其他对象
  • 如果需要克隆的对象的类型中引用类型的成员域是不可变的,那么克隆过程就是安全的。

深克隆

  • 实现 Cloneable 接口
  • 重新定义 clone 方法,并制定 public 访问修饰符

即使浅克隆能够满足需求,还是需要实现 Cloneable接口,将 clone 方法 重写定义为 public,再调用 super.clone()

class Student implements Cloneable{
     private Date birthDay = new Date();
    public Student clone() throws CloneNotSupportedException {
        Student student = (Student) super.clone();  // ① 先克隆对象
        student.birthDay = (Date) birthDay.clone(); // ② 然后为克隆的新实例对象 赋予成员域的克隆
        return student;
    }
}
  • 必须当心子类的克隆,不能保证子类的实现者一定会修正 clone方法 使其正常工作
  • 所有的数组类型都有一个 publicclone方法,而不是 protected,用这个方法可以建立一个包含原数组所有元素的副本