一、浅复制
- 将一个对象的引用指向另外一个新的对象,两个对象的引用地址相同
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2e1512f9dc65febb0974ca98750c4b82.png)
二、深复制
- 通过实现Cloneable接口,重写clone()方法,
- 对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。基础类型的拷贝,其中一个对象修改该值,不会影响另外一个(和浅拷贝一样)。
- 对于有多层对象的,每个对象都需要实现 Cloneable并重写 clone() 方法。
public class Student implements Cloneable {
public Student(String name, Sex sex) {
this.name = name;
this.sex = sex;
}
private String name;
private Sex sex;
@Override
protected Student clone() throws CloneNotSupportedException {
Student clone = (Student) super.clone();
clone.sex = (Sex) sex.clone();
return clone;
}
}
- 深复制后的对象和原对象引用地址不一样
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8419c7317fa69d23c2367beee52bb07e.png)
- BeanUtils.copyProperties属于浅复制
参考内容
- https://www.jianshu.com/p/94dbef2de298