浅拷贝
基本类型
拷贝的就是基本类型的值
引用类型
拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象
如何实现
- 实现 Cloneable 接口,标识这个类对象是可以被拷贝的;
- 重写 clone() 方法,在 clone 方法里捕获异常;
代码示例
public class CopyTest {
public static void main(String[] args) {
Person p1 = new Person("张三", 2, new Car(120));
Person p2;
//浅拷贝
p2 = p1.clone();
}
}
class Person implements Cloneable {
private String name;
private int age;
// 省略对应的构造函数,getter和setter方法
@Override
protected Person clone() {
Person person = null;
try {
person = (Person) (super.clone());
} catch (CloneNotSupportedException e) {
}
return person;
}
}
深拷贝
基本类型
拷贝的就是基本类型的值
引用类型
深拷贝会新建一个对象空间,然后拷贝里面的内容,所以它们指向了不同的内存空间。改变其中一个,不会对另外一个也产生影响。
如何实现
- Apache Commons Lang 3 库中的 SerializationUtils 类;
- Google Guava 库中的 Copier 类;
代码示例
import org.apache.commons.lang3.SerializationUtils;
public class DeepCopyExample {
public static void main(String[] args) {
// 创建要深拷贝的对象
Person person = new Person("张三", 25);
// 执行深拷贝
Person copiedPerson = SerializationUtils.deepCopy(person);
// 更改原始对象的姓名
person.setName("李四");
// 打印原始对象和拷贝对象的姓名
System.out.println("原始对象的姓名:" + person.getName());
System.out.println("拷贝对象的姓名:" + copiedPerson.getName());
}
// 定义 Person 类,包含姓名和年龄两个属性
static class Person {
private String name;
private int age;
// 省略对应的构造函数,getter和setter方法
}
}