1. 程式人生 > >java深複製兩種方式

java深複製兩種方式

java深複製兩種方式

1 實現Cloneable介面

class S implements Cloneable
{
	/*
	 * 引用,get和set
	 * 
	 */
	T t;
	
	//雙層克隆
	@Override
	public Object clone() throws CloneNotSupportedException
	{
		//此時還是淺複製 
		S S = (S)super.clone();
		//呼叫被引用物件的克隆方法
		S.setT((T)=S.getT().clone());
		return S;
	}
}
//被引用的類
class T implements
Cloneable { //屬性,get和set //覆寫克隆方法 @Override public Object clone() throws CloneNotSupportedException { //呼叫父類克隆方法 return super.clone(); } }

2 serializable方式實現

public class CloneTest3 {
	public static void main(String[] args) throws Exception
	{
		T T = new T();
		
		S s1 = new S();
		//s1.setT(t);
S s2 = (S)s1.deepCopt(); } } //被S引用的類 class T implements Serializable { // 這個serialVersionUID為了讓該類別Serializable向後相容 // private static final long serialVersionUID = 1L; // private static final long serialVersionUID = 8940196742313994740L; /* * 屬性,get和set */ } class S implements Serializable { //序列化id
private static final long serialVersionUID = 1L; /* * 各 引用(類已經實現序列化介面) */ T t; /* * get和set */ //獲取被深複製的物件 public Object deepCopt()throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); //將當前這個物件寫到一個輸出流當中,,因為這個物件的類實現了Serializable這個介面,若在這個類中 //有一個引用,這個引用如果實現了序列化,那麼這個也會寫到這個輸出流當中 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); //這個就是將流中的東西讀出類,讀到一個物件流當中,這樣就可以返回這兩個物件的東西,實現深複製 } }

參考自:https://blog.csdn.net/qq_28081081/article/details/80455150