原型式继承本身不直接提供深拷贝能力,它仅通过prototype或Object.create()实现行为复用;深拷贝需额外引入克隆逻辑,解决状态隔离问题,二者目标不同、须配合使用。

原型式继承本身不直接提供深拷贝能力,它只是通过对象的 prototype 或 Object.create() 实现属性和方法的委托复用。真正实现深拷贝,需要在原型继承的基础上额外引入独立的克隆逻辑。
明确原型继承与深拷贝的关系
原型继承解决的是“行为复用”问题——子对象能访问父对象的方法和属性,但所有实例共享同一份引用数据;而深拷贝解决的是“状态隔离”问题——每个新对象拥有完全独立的数据副本。两者目标不同,必须配合使用。
手动重写 clone 方法实现深拷贝
在具体原型类中重写 clone(),对每个引用类型字段递归调用其自身的 clone() 或构造新实例:
- 基本类型字段直接赋值
- 数组用
Arrays.copyOf()或流式复制 - 嵌套对象需确保其也支持克隆(如实现
Cloneable并重写clone) - 避免直接调用
super.clone()(它只做浅拷贝)
用序列化方式实现通用深拷贝
要求对象及其所有成员都实现 Serializable 接口,然后通过字节流完成完整结构复制:
- 创建
ByteArrayOutputStream和ObjectOutputStream - 将原对象写入流,再用
ObjectInputStream读出新对象 - 该方式自动处理任意深度的引用链,无需手动遍历
- 注意:含不可序列化字段(如
Thread、Socket)会失败
借助第三方工具简化操作
Apache Commons Lang 的 SerializationUtils.clone() 或 Jackson 的树模型可绕过接口限制:
-
SerializationUtils.clone(obj)封装了上述序列化逻辑,一行调用即可 - 用 Jackson 先将对象转为
JsonNode,再反序列化为新实例,适用于 POJO 场景 - 这类方案不依赖
Cloneable,但要求字段可被 JSON 序列化


















