浅拷贝仅复制对象本身,引用字段共享;深拷贝递归复制整个对象图。Java原生支持浅拷贝(需实现Cloneable并重写public clone()),深拷贝常用序列化、手动递归或第三方库实现。

Java 中的浅拷贝只复制对象本身,不复制它引用的其他对象;深拷贝则会递归复制整个对象图,确保新旧对象完全独立。关键区别在于对引用类型字段的处理方式。
浅拷贝:用 clone() + 实现 Cloneable
Java 原生支持浅拷贝,前提是类实现 Cloneable 接口并重写 clone() 方法:
- 默认
Object.clone()是浅拷贝 —— 基本类型值被复制,引用类型字段只是复制了地址(指向同一对象) - 必须声明为
public,否则子类调用会因访问权限报错 - 需手动处理 final 字段(不能在 clone 中赋值),或改用构造器/Builder 初始化
示例:
String name;
Address addr;
public Person clone() {
try {
return (Person) super.clone(); // 浅拷贝:addr 引用未变
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}
深拷贝:三种常用方式
没有语言级支持,需手动实现。主流方法有:
立即学习“Java免费学习笔记(深入)”;
-
手动递归 clone():每个引用字段也调用其
clone(),要求所有嵌套类都可克隆且配合良好 —— 灵活但易漏、维护成本高 -
序列化反序列化:将对象写入字节流再读出,天然实现深拷贝(前提是所有字段所属类都实现
Serializable)
优点:通用、不依赖类内部结构;缺点:性能较低、不能序列化 transient 或非 Serializable 字段、反射开销大 -
第三方库(如 Apache Commons Lang / Gson / Jackson):
•SerializationUtils.clone(obj)封装了序列化方式,简洁安全
• JSON 方式(Gson.toJson → fromJson)适合 POJO,但丢失类型信息、不支持循环引用、不可序列化字段会丢失
注意:不可变对象无需深拷贝
如果对象及其所有字段都是 final + 不可变类型(如 String、LocalDate、Integer),那浅拷贝就等价于深拷贝 —— 因为没人能修改它,共享引用是安全的。
选择建议
- 简单、少量字段、无深层引用 → 用
clone()浅拷贝够用 - 需要真正隔离、结构稳定、可序列化 → 优先用
SerializationUtils.clone() - 跨系统传输或已有 JSON 流程 → Gson/Jackson 可顺带完成拷贝(注意类型和 transient 限制)
- 高频调用、性能敏感、结构固定 → 考虑手写拷贝构造器或 Builder,避免反射和 IO 开销


















