Java深度克隆需确保新对象及其所有嵌套引用对象完全独立:手动递归克隆要求各层级类实现Cloneable;序列化反序列化通用但需Serializable且注意transient字段;第三方库如SerializationUtils.clone更推荐,需规避循环引用、不可克隆对象及构造副作用。

Java 中实现深度克隆,核心目标是让新对象及其所有嵌套引用对象都完全独立于原对象。不能只靠 super.clone(),因为那只是浅克隆——它复制的是引用地址,不是对象本身。
手动递归克隆(适合结构清晰、可控的类)
在重写的 clone() 方法中,对每个可变的引用字段显式调用其 clone() 方法或构造新实例:
- 要求所有被引用的类也实现
Cloneable并提供public clone() - 基本类型和不可变对象(如
String、Integer)可直接赋值 - 集合类(如
List、Map)需逐个克隆元素,再新建容器装入
例如:Person 包含 Address 和 List<Phone>,就要分别克隆 address 和遍历克隆每个 phone,再放进新的 ArrayList。
序列化反序列化(通用但有约束)
把对象转成字节流再还原,天然实现深克隆,因为整个对象图都会被重建:
立即学习“Java免费学习笔记(深入)”;
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 要求目标类及所有嵌套类都实现
Serializable接口 - 注意
transient字段不会被序列化,需手动处理 - 性能略低,不适合高频调用场景,但代码简洁、不易出错
可封装为工具方法,捕获 IOException 和 ClassNotFoundException 并转为运行时异常。
使用第三方库(生产环境推荐)
Apache Commons Lang 提供了开箱即用的方案:
-
SerializationUtils.clone(obj):基于序列化,要求Serializable - Google Gson 或 Jackson 可将对象转 JSON 再解析回新对象(适用于 POJO,不依赖
Serializable) - 注意:JSON 方式会丢失类型信息、静态字段、方法逻辑,仅适合纯数据对象
避免踩坑的关键细节
深度克隆不是“复制完就结束”,还要考虑:
- 循环引用:若 A 引用 B,B 又引用 A,手动克隆可能栈溢出;序列化方式通常能自动处理
- 单例或不可克隆对象(如
Thread、Socket):应跳过或抛出提示,而非强行克隆 - 构造函数副作用或初始化逻辑:克隆后对象状态应与原对象一致,但不应重复执行初始化代码
不复杂但容易忽略

















