java中的數據類型分爲:基礎數據類型(int、char、double等),非基礎類型(,map.class等)。
在處理基本數據類型時候,採用按值傳遞的方式(傳遞的是輸入參數的複製),其他類型的處理按引用傳遞(傳遞的是對象的一個引用),另外對象調用時是引用傳遞,在使用“=”賦值時也是引用傳遞。
在對已有對象A的情況下,創建一個與A具有相同狀態的對象B,並且 對B進行操作而不影響A的狀態。這個時候,如果將A賦值給B 是無法達到這樣的效果,因此需要clone()方法對A進行復制。然後對B 操作就不會影響到A 的狀態。
在對A的賦值中,數據類型的不同,導致複製的效果不同。在對基礎數據複製過程中,直接複製了數據變量。但在處理非基礎類型時,在java中,對非基礎類型的數據,類似與指針的指向作用操作。在僅僅是對clone()方法的調用,對非基礎類似數據的操作,仍然指向原先的數據,對A的非基礎類型的數據仍會影響。這個時候,需要使用深度複製,在重寫clone()中對非基礎數據在調用clone()的處理。
package com.dong.demo;
import java.util.Date;
public class CloneDemo{
public static void main(String[] args){
Obj a = new Obj();
Obj b = (Obj) a.clone();
b.changeDate();
System.out.println("a="+a.getBirth());
System.out.println("b="+b.getBirth());
}
}
class Obj implements Cloneable{
private Date birth = new Date();
public Date getBirth(){
return birth;
}
public void setBirth(Date birth){
this.birth = birth;
}
public void changeDate(){
this.birth.setMonth(4);
}
public Object clone(){
Obj o =new Obj();
try{
o= (Obj) super.clone();
}catch(CloneNotSupportedException e ){
e.printStackTrace();
}
if(o != null){
o.birth = (Date) this.getBirth().clone();
}
return o;
}
}