Cloneable 接口 是标记接口
clone 是 Object类 中的方法,访问级别为 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方法 使其正常工作 - 所有的数组类型都有一个
public的clone方法,而不是protected,用这个方法可以建立一个包含原数组所有元素的副本