深度克隆和浅度克隆
克隆的主对象:(实现Cloneable接口,重写clone方法)
注意:在JAVA克隆对象不能简单的使用clone方法,clone方法只是进行浅克隆。
public class TestClonBean implements Cloneable,Serializable{
private String name;
private int age;
private String sex;
@Override
protected TestClonBean clone(){
TestClonBean bean = null;
try {
bean = (TestClonBean) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bean;
}
省略get/set方法……
}
深度克隆的工具类:(深度克隆的原理:把对象序列化输出到内存,然后从内存中把序列化的byte[]取出来,进行反序列化获取对象)
public class DeepCloneBean {
public static Object getObject(Object obj){
Object cloneobj = null;
ByteArrayInputStream bin = null;
ByteArrayOutputStream bout = null;
try {
//把对象对到内存中去
bout = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bout);
oos.writeObject(obj);
oos.close();
//把对象从内存中读出来
ByteArrayInputStream bais = new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
cloneobj = ois.readObject();
ois.close();
return cloneobj;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
总结:
不管是深度克隆还是浅度的克隆其实都是产生了一个新的对象。所以我们在比较克隆对象和源对象的时候返回是false。
深度克隆和浅度的克隆的区别在于:浅度克隆的对象只会克隆普通属性,不会克隆对象属性。而深度克隆就会连对象属性一起克隆。