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