目录
额外方法:BeanUtils.copyProperties(orig, dest)
图形化介绍什么是深浅拷贝
- 浅拷贝:拷贝对象和引用对象指向同一个内存地址即,修改拷贝对象,原对象会受到影响
Cloneable接口
Cloneable就是一个标记接口,本身并没有定义什么方法类似于序列化接口,clone方法是定义在object中的,
如果类没有实现cloneale接口,直接调用object中的clone方法,会抛出异常; CloneNotSupportedException
Object提供的clone方法是浅拷贝。
如何实现深拷贝
方法1:重写clone方法
- 效率低
方法2: clone多嵌套
方法3:通过序列化的方式去实现深拷贝
-
必须保证当前类以及当前类的属性都是可序列化的
@Override
public Main clone() throws CloneNotSupportedException {
//序列化进行深拷贝
Main main = 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);
main = (Main)ois.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return main;
}
额外方法:BeanUtils.copyProperties(orig, dest)
- 对象拷贝的是属性值的引用,如果是基础数据类型还好,如果是一个对象类型,拷贝完成后,orig里面的对象类型属性值发生变化,dest里面相应的属性值会发生变化。会有一定的风险