java对象如何克隆
Java对象克隆方法
在Java中,对象克隆可以通过实现Cloneable接口并重写clone()方法来实现。以下是几种常见的克隆方式:
实现Cloneable接口
需要克隆的类必须实现Cloneable接口,并重写Object类的clone()方法。默认情况下,clone()方法是浅拷贝。
class MyClass implements Cloneable {
private int value;
private String name;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
深拷贝与浅拷贝
浅拷贝仅复制对象本身和其基本类型字段,而引用类型字段指向原对象的引用。深拷贝会递归复制所有引用类型字段。
浅拷贝示例:
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // 浅拷贝
}
深拷贝示例:
@Override
protected Object clone() throws CloneNotSupportedException {
MyClass cloned = (MyClass) super.clone();
cloned.referenceField = this.referenceField.clone(); // 手动复制引用类型字段
return cloned;
}
使用复制构造函数
通过定义一个接受原对象为参数的构造函数来实现克隆,这种方式更灵活且不需要处理Cloneable接口。
class MyClass {
private int value;
private String name;
public MyClass(MyClass original) {
this.value = original.value;
this.name = original.name;
}
}
使用序列化实现深拷贝
通过将对象序列化为字节流再反序列化,可以实现完全的深拷贝,但要求所有相关类实现Serializable接口。
import java.io.*;
public class DeepCopyUtil {
public static <T extends Serializable> T deepCopy(T object) {
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos)) {
oos.writeObject(object);
oos.flush();
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (T) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException("Deep copy failed", e);
}
}
}
第三方库工具
Apache Commons Lang和Spring Framework等库提供了便捷的克隆工具。
Apache Commons Lang示例:
MyClass cloned = SerializationUtils.clone(original);
Spring Framework示例:

MyClass cloned = new BeanUtils().instantiateClass(original.getClass());
BeanUtils.copyProperties(original, cloned);
注意事项
- 实现
Cloneable接口的类必须确保clone()方法正确处理所有字段,尤其是可变对象。 - 深拷贝可能带来性能开销,需根据场景权衡。
- 序列化方式要求所有相关类实现
Serializable接口,且可能受瞬态字段(transient)影响。 - 复制构造函数和工具类方法通常更可控,推荐在复杂场景下使用。






