java如何克隆
克隆的概念
在Java中,克隆(Clone)指创建对象的副本,分为浅拷贝和深拷贝两种方式。浅拷贝复制对象的基本字段(值类型)和引用地址(引用类型),深拷贝会递归复制引用类型指向的实际对象。

实现Cloneable接口
Java中实现克隆需要满足两个条件:

- 类实现
Cloneable标记接口(无方法定义)。 - 重写
Object类的clone()方法,并调用super.clone()。
示例代码:
class Person implements Cloneable {
private String name;
private int age;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone(); // 默认浅拷贝
}
}
浅拷贝与深拷贝的区别
- 浅拷贝:仅复制引用类型字段的地址,副本和原对象共享引用类型数据。
- 深拷贝:递归复制引用类型字段的实际对象,副本和原对象完全独立。
深拷贝示例:
class Address implements Cloneable {
private String city;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Person implements Cloneable {
private Address address;
@Override
public Object clone() throws CloneNotSupportedException {
Person cloned = (Person) super.clone();
cloned.address = (Address) address.clone(); // 手动深拷贝引用类型
return cloned;
}
}
其他克隆方式
- 构造方法复制:通过构造方法或工厂方法创建新对象并赋值。
Person copy = new Person(original.getName(), original.getAge()); - 序列化实现深拷贝:通过对象序列化与反序列化实现完全独立的副本。
ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(original); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); Person copied = (Person) ois.readObject();
注意事项
- 未实现
Cloneable接口调用clone()会抛出CloneNotSupportedException。 - 深拷贝需确保所有引用类型字段均支持克隆或序列化。
- 推荐使用不可变对象或工具库(如Apache Commons的
SerializationUtils)简化深拷贝。






