java中clone 方法的作用

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;
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章