clone接口提供了一个安全的clone方法。
如果不使用克隆:
为一个包含对象引用的变量建立副本,原变量和副本都是同一个对象的引用,任何一个变量改变都会影响另一个变量。
如果copy一个新对象,初始状态与original相同,但是他们是不同对象的引用,使用clone方法。
Object类实现拷贝的过程:(浅拷贝)
逐个字段进行拷贝,如果对象中字段是引用类型,拷贝字段就会得到相同子对象的另一个引用,这样一来,原对象和克隆的对象仍然会共享一些信息。
解决:重新定义clone方法来建立一个深拷贝(deep copy)
方法:实现cloneable接口,重新定义clone方法,并指定public访问修饰符
public class Employee implements Cloneable{
private String name;
private double salary;
private Date hireDay;
public Employee(String name, double salary, Date hireDay) {
this.name = name;
this.salary = salary;
this.hireDay = hireDay;
}
public Employee clone() throws CloneNotSupportedException {
Employee cloned= (Employee) super.clone();
cloned.hireDay= (Date) hireDay.clone();
return cloned;
}
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", salary=" + salary +
", hireDay=" + hireDay +
'}';
}
public static void main(String[] args) throws CloneNotSupportedException {
Employee john = new Employee("john", 5000, new Date());
Employee clone = john.clone();
System.out.println(john);
System.out.println(clone);
}
更多推荐
【java笔记】常用接口:Cloneable接口
发布评论