java深複製兩種方式
阿新 • • 發佈:2018-12-13
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