為什麼會有深複制和淺複制這兩個概念呢?首先,我們想一下,對于基本資料類型,jvm采用的值傳遞;對于引用類型,JVM采用的是位址傳遞。我們設想 有這麼一段程式:
Obj a=new Obj();
Obj b=a;
顯然,在這裡,引用變量a和b,都指向了同一個對象,任意改變a或者b,都将會使對方發生相同的改變。那麼如果我們隻想改變a而不想改變b,怎麼辦呢?這裡就需要我們的淺複制和深複制。
如果Obj類裡面隻有基本資料類型的話,我們隻需要進行淺複制,若有引用類型的話,亦需進行深複制。
淺複制和深複制的主要差別就在于,被複制對象的 引用類型對象和複制對象的引用類型對象仍然是同一個對象;而深複制實作了不僅基本類型,而且引用類型都不再是原來的變量或者對象。
那麼如何進行淺複制和深複制?
1.實作clone()的類首先要實作cloneable接口
2.重寫clone()方法
3.在clone()中調用super.clone()方法
4.把淺複制的引用隻想原型對象新的克隆體。
5.完成淺複制後,對對象或者能夠引用類型的屬性也調用clone()方法完成深複制。
demo如下:
import java.util.Date;
//java 中clone方法,深複制與淺複制
public class clone {
public static void main(String args[]) {
Obj a=new Obj();
Obj b=(Obj)a.clone();
System.out.println(a.getName());
a.setName("tom");
System.out.println(b.getName());
int i=1;
int j=i;
i=i+11;
System.out.println(j);
}
}
class Obj implements Cloneable{//實作cloneable
private int age;
private String name;
private Date birth=new Date();
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Object clone() {//重寫clone()
Obj o=null;
try {
o=(Obj)super.clone();//先對基本類型進行淺複制: 調用父類的super(),注意強制轉換,
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
o.birth=(Date)this.getBirth().clone();//然後對非基本類型實作深複制,對每一個對象調用clone()方法
return o;
}
}