Java 深拷貝、淺拷貝及Cloneable接口


Cloneable接口是一個空接口,僅用於標記對象,Cloneable接口里面是沒有clone()方法,的clone()方法是Object類里面的方法!默認實現是一個Native方法

protected native Object clone() throws CloneNotSupportedException;

如果對象implement Cloneable接口的話,需要覆蓋clone方法(因為Object類的clone方法是protected,需要覆蓋為public)

	public Object clone() throws CloneNotSupportedException{
		return super.clone();
	}

Object類里的clone()方法僅僅用於淺拷貝(拷貝基本成員屬性,對於引用類型僅返回指向改地址的引用)

 

深拷貝需要重新覆蓋Clone方法。

public class testDeepClone implements Cloneable {
	public int num = 0;
	public String str = "default";
	public A a;

	public Object clone() throws CloneNotSupportedException {
		testDeepClone o = (testDeepClone) super.clone();
		o.str = new String(this.str);
		o.a = (A) a.clone();
		return o;
	}
}

// 成員屬性A必須為Cloneable的,否則無法Clone其組合的類
class A implements Cloneable {
	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}

 利用Serializable來實現深層復制

利用Serializable進行深拷貝的時候成員屬性也必須是Serializable的,否則只返回一個引用,具體參考本人的博客:

Java中的Serializable接口transient關鍵字,及對象IO

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM