Java对象-深拷贝两种方式
注意:本篇博客风格(不多比比就是撸代码!!!)
实现对象克隆两种方式:
1). 实现Cloneable接口并重写Object类中的clone()方法;
2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
一、实现Cloneable接口方式
public class Demo implements Cloneable {
private String name;
private String value;
private DemoInternal demoInternal;
/*省略getter和setter方法*/
@Override
public Demo clone() {
Demo demo = null;
try {
demo = (Demo) super.clone(); //浅复制
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
demo.demoInternal = demoInternal.clone(); //深度复制
return demo;
}
}
public class DemoInternal implements Cloneable {
private String internalName;
private String internalValue;
/*省略getter和setter方法*/
@Override
public DemoInternal clone() {
DemoInternal demoInternal = null;
try {
demoInternal = (DemoInternal) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return demoInternal;
}
}
二、实现Serializable接口方式
import java.io.*;
public class Demo2 implements Serializable {
private String name;
private String value;
private DemoInternal2 demoInternal2;
/*省略getter和setter方法*/
// 深度复制
public Demo2 myclone() {
Demo2 demo2 = null;
try {
// 写入字节流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
demo2 = (Demo2) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return demo2;
}
}
import java.io.Serializable;
public class DemoInternal2 implements Serializable {
private String internalName;
private String internalValue;
/*省略getter和setter方法*/
}