java 如何实现克隆
克隆的实现方式
在Java中,实现克隆主要通过Cloneable接口和Object类的clone()方法完成。以下是两种常见的实现方式。
浅克隆
浅克隆仅复制对象本身及其基本类型字段,引用类型的字段仍指向原对象的引用。实现步骤如下:

- 类实现
Cloneable接口。 - 重写
Object类的clone()方法并调用super.clone()。
public class ShallowCloneExample implements Cloneable {
private int value;
private String[] array;
@Override
public ShallowCloneExample clone() throws CloneNotSupportedException {
return (ShallowCloneExample) super.clone();
}
}
深克隆
深克隆会递归复制所有引用类型的字段,确保新对象与原对象完全独立。实现步骤如下:

- 类实现
Cloneable接口。 - 重写
clone()方法,手动复制所有引用类型字段。
public class DeepCloneExample implements Cloneable {
private int value;
private String[] array;
@Override
public DeepCloneExample clone() throws CloneNotSupportedException {
DeepCloneExample cloned = (DeepCloneExample) super.clone();
cloned.array = array.clone(); // 复制数组
return cloned;
}
}
其他实现方式
序列化实现深克隆
通过序列化和反序列化实现深克隆,适用于复杂对象图。
import java.io.*;
public class SerializationCloneExample implements Serializable {
private int value;
private String[] array;
public SerializationCloneExample deepClone() throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (SerializationCloneExample) ois.readObject();
}
}
使用第三方库
Apache Commons Lang的SerializationUtils或Gson等库可以简化克隆过程。
import org.apache.commons.lang3.SerializationUtils;
public class ThirdPartyCloneExample {
public static <T extends Serializable> T clone(T object) {
return SerializationUtils.clone(object);
}
}
注意事项
- 浅克隆可能导致引用共享问题,修改克隆对象的引用字段会影响原对象。
- 深克隆需确保所有引用类型字段支持克隆或序列化。
clone()方法在Object类中是受保护的,需重写为公共方法以便外部调用。- 实现
Cloneable接口仅是标记接口,不包含任何方法,但未实现时会抛出CloneNotSupportedException。






