java如何clone
Java 中的克隆方法
在 Java 中,克隆对象可以通过实现 Cloneable 接口并重写 clone() 方法来实现。以下是几种常见的克隆方式:
实现 Cloneable 接口
-
浅克隆(Shallow Clone)
浅克隆仅复制对象本身,而不复制其引用的对象。示例代码如下:public class Person implements Cloneable { private String name; private int age; @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } }调用方式:

Person original = new Person(); Person cloned = (Person) original.clone(); -
深克隆(Deep Clone)
深克隆会递归复制对象及其引用的所有对象。示例代码如下:public class Person implements Cloneable { private String name; private Address address; // Address 也需要实现 Cloneable @Override public Object clone() throws CloneNotSupportedException { Person cloned = (Person) super.clone(); cloned.address = (Address) address.clone(); // 递归克隆引用对象 return cloned; } }
使用复制构造函数
另一种克隆方式是定义复制构造函数,直接通过构造函数复制对象:

public class Person {
private String name;
private int age;
public Person(Person other) {
this.name = other.name;
this.age = other.age;
}
}
调用方式:
Person original = new Person();
Person cloned = new Person(original);
使用序列化实现深克隆
通过序列化和反序列化可以实现完全的深克隆,适用于复杂对象:
import java.io.*;
public class SerializationUtils {
public static <T extends Serializable> T clone(T object) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(object);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (T) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
}
调用方式:
Person original = new Person();
Person cloned = SerializationUtils.clone(original);
注意事项
Cloneable接口是标记接口,仅用于标识对象可被克隆,实际克隆逻辑需在clone()方法中实现。- 浅克隆与深克隆的选择需根据业务场景决定,深克隆通常更安全但性能开销较大。
- 序列化方式要求所有涉及的对象实现
Serializable接口。
以上方法可根据具体需求选择使用。






