object.clone()默认浅克隆,深度克隆需所有引用类实现cloneable并重写clone()方法,显式调用各字段clone();序列化方式要求所有类实现serializable,通过对象流读写实现深拷贝,但忽略static和transient字段。

Object.clone() 默认只做浅克隆,要实现真正独立的深度克隆,必须额外处理所有引用类型字段。序列化方式则绕过手动递归逻辑,天然支持任意嵌套结构的深拷贝——但两者适用场景和限制不同。
用 clone() 实现深度克隆的关键步骤
前提是每个引用类型的成员类都支持克隆:
- 所有涉及的类(包括嵌套的 Address、Date、List 等)都要实现 Cloneable 接口
- 每个类都需重写 public Object clone(),并在方法体内调用 super.clone()
- 在主对象的 clone() 方法中,对每个引用字段显式调用其 clone(),例如:
this.address = (Address) this.address.clone();
this.birth = (Date) this.birth.clone(); - 若引用字段是集合(如 ArrayList),需遍历并逐个克隆元素,再新建集合装入
用序列化实现深度克隆的实用写法
不依赖各成员类是否实现 Cloneable,只要它们都可序列化(即实现 Serializable):
- 目标类及其所有引用类型字段的类,都必须实现 Serializable 接口
- 写一个通用工具方法:将原对象写入 ByteArrayOutputStream → ObjectOutputStream,再从 ByteArrayInputStream ← ObjectInputStream 中读出新对象
- 注意:static 和 transient 字段不会被序列化,因此也不会出现在克隆体中
- 该方式自动处理多层嵌套、循环引用(默认会报错,需自定义 resolveObject)等复杂情况
两种方式的核心区别
clone() 方式可控性强、运行快,但代码侵入高、易漏写某一层的 clone 调用;序列化方式“开箱即用”,适合结构动态或嵌套很深的对象,但有性能开销、要求严格可序列化、且无法克隆不可序列化的资源(如 Socket、Thread、File 等)。










