java中浅拷贝仅复制对象本身和基本类型,引用类型仍共享;深拷贝则递归复制所有层级对象以确保完全独立。实现上,浅拷贝可用clone()、拷贝构造或手动赋值;深拷贝推荐嵌套clone()或序列化反序列化,后者要求类实现serializable且无transient非序列化字段。

Java 中实现深拷贝与浅拷贝,核心在于控制“引用类型字段是否被真正复制”。浅拷贝只复制对象本身和基本类型值,引用类型仍共用原对象;深拷贝则递归复制所有层级的对象,确保完全独立。
浅拷贝的实现方式
浅拷贝创建新对象,但不复制引用类型所指向的实际对象。常用方法有三种:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
重写 clone() 方法:类需实现
Cloneable接口,并重写public Object clone(),调用super.clone()即可。这是最标准的浅拷贝方式,但仅对本层对象生效,内部引用字段未被克隆。 - 拷贝构造方法:定义一个以本类对象为参数的构造器,手动赋值各字段。基本类型直接赋值,引用类型仍赋原引用——效果等同于浅拷贝。
- 手动逐字段赋值:通过 new 创建对象后,用 getter/setter 或直接访问字段完成赋值。只要没对引用类型做 new 操作,就仍是浅拷贝。
深拷贝的实现方式
深拷贝必须确保所有嵌套的引用类型也被全新创建。主流方案有两种:
-
嵌套调用 clone():在重写的
clone()方法中,对每个引用类型字段也调用其clone()(前提是该字段类型也支持克隆)。例如this.address = (Address) original.address.clone();。这种方式可控性强,但要求所有嵌套类都实现Cloneable并正确重写clone()。 -
序列化反序列化:将对象写入字节流再读出,天然实现完整深拷贝。适用于实现了
Serializable的类,代码简洁:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(original);
oos.close();
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
T copy = (T) ois.readObject();
注意:所有嵌套类都必须可序列化,且 transient 字段不会被拷贝。
怎么选?关键看业务需求
是否允许副本修改影响原对象,是选择依据:
- 若对象结构简单、无嵌套引用,或明确接受共享(如配置类只读使用),用浅拷贝更轻量。
- 若涉及订单、用户、DTO 转换等需隔离修改的场景,必须用深拷贝,否则可能引发数据污染。
- 避免“伪深拷贝”:只重写了外层
clone()却忽略内部字段,结果仍是浅拷贝——这是线上事故高发点。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










