天天看點

Java:關于深複制與淺複制

為什麼會有深複制和淺複制這兩個概念呢?首先,我們想一下,對于基本資料類型,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;
	}
	
}