1. 理解Java中的clone()方法
在Java开发中,对象复制是一个常见但容易被误解的操作。Object类提供的clone()方法默认实现的是浅拷贝(Shallow Copy),这个行为经常让刚接触Java克隆机制的开发者感到困惑。
浅拷贝意味着什么呢?想象你有一本笔记本,浅拷贝就像是复印了笔记本的封面和目录页,但里面的内容页仍然是原来那本笔记本的。也就是说,对于对象中的基本类型字段,clone()会创建新的副本;但对于引用类型字段,它只会复制引用地址,新旧对象将共享这些引用指向的同一块内存数据。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 浅拷贝的实际表现与问题
让我们通过一个具体的例子来看看浅拷贝的实际表现:
java复制class Employee implements Cloneable {
private String name;
private Date hireDate;
private List<String> skills;
// 构造方法和其他方法省略
@Override
public Employee clone() {
try {
return (Employee) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError(); // 不会发生
}
}
}
在这个例子中,如果我们调用clone()方法创建新Employee对象:
- name字段(String)会被复制新的副本
- hireDate和skills字段(引用类型)只会复制引用,新旧对象共享同一个Date对象和List对象
这会导致什么问题呢?假设我们修改了克隆对象的hireDate:
java复制Employee original = new Employee("张三", new Date(), Arrays.asList("Java", "Python"));
Employee cloned = original.clone();
cloned.getHireDate().setTime(12
