浅克隆和深克隆

创建了一个新的对象,但是新对象和源对象的属性共用一个地址

浅克隆 实现Cloneable接口重写clone()方法但没有实现序列化serializable接口

public class User implements Cloneable {
private Address address;
public void setAddress(Address address) {
this.address = address;
}
public Address getAddress() {
return address;
}
@Override
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}

 

深克隆

创建了一个新的对象,切新对象和源对象的属性不共用

注意,实现深克隆,进行序列化的时候要使用一个ByteArrayOutputStream和ByteArrayInputStream来创建一个byte数组将数据写入内存中

public class User implements Cloneable,Serializable {
private Address address;
public void setAddress(Address address) {
this.address = address;
}
public Address getAddress() {
return address;
}
@Override
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
//深拷贝
public Object deepClone(){
try {
//先进行序列化的工作
ByteArrayOutputStream bos = new ByteArrayOutputStream();//写到内存中
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
oos.flush();
oos.close();
//再进行反序列化操作
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

posted @ 2016-01-26 14:11  烧山火的光  阅读(136)  评论(0编辑  收藏  举报