以往见过的克隆是采用以下这种方式
Employee original=new Employee("John public",50000);
Employee copy=original;
但以上copy与Employee使用的同一个对象,即copy改变时Employee也会发生改变,这种复制叫做浅拷贝。
下面介绍一下深拷贝,引用上面的代码,
但此时使用clone方法实现克隆:
Employee copy=original.clone();
以下是对此方法的检验。
package clone; import java.util.Date; import java.util.GregorianCalendar; public class Employee implements Cloneable { private String name; private double salary; private Date hireDay; public Employee(String aname,double asalary){ this.name=aname; this.salary=asalary; hireDay=new Date(); } public Employee clone() throws CloneNotSupportedException{ Employee cloned=(Employee)super.clone(); cloned.hireDay=(Date)hireDay.clone(); return cloned; } public void setHireDay(int year,int month,int day){ Date newhireDay=new GregorianCalendar(year,month-1,day).getTime(); hireDay.setTime(newhireDay.getTime()); } public void raiseSalary(double byPercent){ double raise=salary*byPercent/100; salary+=raise; } public String toString(){ return "Employee[name="+name+",salary="+salary+",hireday="+hireDay+"]"; } }
package clone; public class CloneTest { public static void main(String[] args){ try{ Employee original=new Employee("John Q.Public",50000); original.setHireDay(2000,1,1); Employee copy=original.clone(); copy.raiseSalary(10); copy.setHireDay(2002,12,31); System.out.println("original="+original); System.out.println("copy="+copy); } catch(CloneNotSupportedException e){ e.printStackTrace(); } } }