0
我正在學習關於對象克隆的Java。我真的很困惑淺層克隆和深層克隆。下面是Java核心Java深層克隆問題
public class Employee implements Cloneable {
private String name;
private Date hireDay;
public Employee(String n,double s)
{
this.name=n;
hireDay=new Date();
}
public void setHireDay(int year,int month,int day)
{
Date newhireDay=new GregorianCalendar(year,month-1,day).getTime();
hireDay.setTime(newhireDay.getTime());
}
public Employee clone() throws CloneNotSupportedException
{
Employee cloned=(Employee) super.clone();
//clone mutable fields
//cloned.hireDay=(Date) hireDay.clone();
return cloned;
}
public String toString()
{
return "Employee[name=]"+ name+" salary= "+salary+" hireday.getTIme() "+hireDay+"]";
}
}
public class cloneTest {
public static void main(String[] args) {
try{
Employee original =new Employee("john");
Employee cloned=original.clone();
original.setHireDay(1993,2,22);
cloned.setHireDay(2000,11,22);
System.out.println("original="+original);
System.out.println("cloned= "+cloned);
}
catch(CloneNotSupportedException e){
e.printStackTrace();
}
}
}
一個示例代碼在這種情況下,原始對象和克隆對象的輸出是same.Since我沒有克隆可變場,在克隆的對象所做的更改將影響原始對象。但是,當我改變方法setHireDay到這一點:
public void setHireDay(int year,int month,int day)
{
hireDay=new GregorianCalendar(year,month-1,day).getTime();
}
我沒有改變場hireDay的價值在克隆的對象,但它不會影響原來的object.I不知道爲什麼
「我真的被淺層克隆和深層克隆困惑了。」是的:)深度複製應該是這樣的,這種變化也不在源代碼中。這就是爲什麼它是一個「深層次」的副本:不僅創建了類的第二個實例,但其中的每個成員都是新創建的副本。 – deviantfan
如果您正在學習有關克隆的知識,那麼您應該瞭解克隆的第一件事:它本質上已經破裂。所以,不要這樣做,除非你絕對必須這樣做。您可能會問,克隆的替代方案是什麼?使用不可變對象。您應該花一些時間閱讀如何在Java中創建不可變類。 – hfontanez