2026-10-17 11:52:40
Java中对象克隆的实现方式主要分为浅克隆和深克隆,二者均基于Cloneable接口和Object.clone()方法,但处理对象引用的方式不同。以下是具体实现方式及示例:
一、浅克隆(Shallow Clone)浅克隆创建新对象并复制基本类型值,但引用类型仅复制地址,导致原对象与克隆对象共享引用对象。
实现步骤:
类实现Cloneable接口(标记接口,无方法)。
重写Object.clone()方法,修改访问修饰符为public。
调用super.clone()返回克隆对象。
未实现Cloneable时调用clone()会抛出CloneNotSupportedException。
示例代码:
class Address { String city; Address(String city) { this.city = city; }}class Person implements Cloneable { String name; Address addr; public Person(String name, Address addr) { this.name = name; this.addr = addr; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); }}// 使用示例Address addr = new Address("Beijing");Person p1 = new Person("Alice", addr);Person p2 = (Person) p1.clone();p2.addr.city = "Shanghai";System.out.println(p1.addr.city); // 输出:Shanghai(共享引用对象)适用场景:对象结构简单、无引用类型或无需隔离引用对象时。
深克隆递归复制所有引用对象,确保原对象与克隆对象完全独立。常见实现方式如下:
1. 重写clone()方法并手动克隆引用对象在clone()中递归调用引用对象的clone()方法。
示例代码:
class Address implements Cloneable { String city; Address(String city) { this.city = city; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); }}class Person implements Cloneable { String name; Address addr; public Person(String name, Address addr) { this.name = name; this.addr = addr; } @Override public Object clone() throws CloneNotSupportedException { Person p = (Person) super.clone(); p.addr = (Address) addr.clone(); // 递归克隆引用对象 return p; }}特点:控制精细,但需手动处理所有引用字段,代码繁琐。
通过序列化将对象转为字节流,再反序列化为新对象,自动处理多层嵌套引用。
实现要求:类及其引用类均需实现Serializable接口。
示例代码:
import java.io.*;class Person implements Serializable { String name; Address addr; public Person(String name, Address addr) { this.name = name; this.addr = addr; } public Object 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 ois.readObject(); }}class Address implements Serializable { String city; Address(String city) { this.city = city; }}特点:通用性强,但性能较低,且需处理序列化异常。
通过JSON转换(如Gson、Jackson)或工具库(如Apache Commons Lang)实现深克隆。
Gson示例:
import com.google.gson.Gson;class Person { String name; Address addr; public Person(String name, Address addr) { this.name = name; this.addr = addr; }}class Address { String city; Address(String city) { this.city = city; }}// 使用示例Gson gson = new Gson();Person person = new Person("Alice", new Address("Beijing"));String json = gson.toJson(person);Person cloned = gson.fromJson(json, Person.class);特点:使用方便,但需引入依赖,且可能丢失类型信息或处理特殊对象(如日期)时需额外配置。
手动重写clone():适合引用层级明确且需精细控制的场景。
序列化:通用性强,但性能较差,适合复杂对象图。
JSON/第三方库:开发效率高,适合快速实现或已有依赖的项目。
根据对象复杂度、性能需求和开发便利性选择合适方式。