拷贝
类需要实现Cloneable接口否则报错,重写Object的clone方法
浅拷贝
浅拷贝:创建一个新对象,然后将当前对象的非静态字段复制到该新对象,
如果字段是值类型的,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用的对象
Object 类提供的 clone 是只能实现 浅拷贝的
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
深拷贝
深拷贝:创建一个新对象,然后将当前对象的非静态字段复制到该新对象,无论该字段是值类型的还是引用类型,都复制独立的一份。
当你修改其中一个对象的任何内容时,都不会影响另一个对象的内容
方式一:
每个引用类型属性内部都重写clone()
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
此外:
@Override
protected Object clone() throws CloneNotSupportedException {
Person p = (Person) super.clone();
p.car= (Car) car.clone();
return p;
}
方式二:
利用序列化(序列化是将对象写到流中便于传输,而反序列化则是把对象从流中读取出来)
//深度拷贝
public Object deepClone() throws Exception{
// 序列化
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos)
oos.writeObject(this);
// 反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}