java 如何克隆
克隆的概念
在Java中,克隆(Clone)指创建一个对象的副本,新对象与原对象具有相同的属性值但内存地址不同。克隆分为浅克隆(Shallow Clone)和深克隆(Deep Clone)。
实现克隆的步骤
1. 实现 Cloneable 接口
类需实现 Cloneable 标记接口(无方法),否则调用 clone() 会抛出 CloneNotSupportedException。
public class MyClass implements Cloneable {
// 类定义
}
2. 重写 Object.clone() 方法
覆盖 clone() 方法并调用 super.clone(),返回类型改为当前类类型。
@Override
public MyClass clone() throws CloneNotSupportedException {
return (MyClass) super.clone();
}
3. 浅克隆与深克隆的选择
- 浅克隆:默认的
clone()仅复制基本类型和对象引用(共享引用对象)。 - 深克隆:需手动复制引用类型的成员变量,例如通过递归调用
clone()或序列化。
深克隆示例

public class DeepCloneExample implements Cloneable {
private List<String> data;
@Override
public DeepCloneExample clone() throws CloneNotSupportedException {
DeepCloneExample cloned = (DeepCloneExample) super.clone();
cloned.data = new ArrayList<>(this.data); // 手动复制引用对象
return cloned;
}
}
注意事项
- 不可变对象:如
String或包装类,无需深克隆。 - 性能与复杂度:深克隆可能涉及递归,需谨慎处理循环引用。
- 序列化替代方案:通过
ObjectOutputStream和ObjectInputStream实现深克隆(需类实现Serializable)。
示例代码(完整流程)
class Person implements Cloneable {
private String name;
private Address address; // 引用类型
@Override
public Person clone() throws CloneNotSupportedException {
Person cloned = (Person) super.clone();
cloned.address = this.address.clone(); // 深克隆Address
return cloned;
}
}
class Address implements Cloneable {
private String city;
@Override
public Address clone() throws CloneNotSupportedException {
return (Address) super.clone();
}
}






