1. 程式人生 > >java中clone 方法的作用

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