复制算法本质是决定新对象及其字段的内存分配与原始数据关联方式;基本类型值拷贝、独立栈空间,引用类型浅拷贝仅复制地址、深拷贝重建堆内存并递归复制内容。

复制算法在对象拷贝中,本质是决定新对象及其字段如何分配内存、如何关联原始数据。关键不在“算法”本身有多复杂,而在于它如何处理不同字段类型的内存地址映射关系——这直接决定了拷贝后两个对象是否真正独立。
基本类型字段:值拷贝,地址无关
整数、布尔、字符等基本类型字段,在浅拷贝或深拷贝中都直接复制数值本身。它们不涉及内存地址引用,因此新对象拥有完全独立的栈空间副本,修改互不影响。
引用类型字段:浅拷贝只复制地址,深拷贝重建地址
当字段是对象(如 Address、List、自定义类实例)时,内存地址映射方式出现分水岭:
- 浅拷贝仅把原字段存储的堆内存地址复制一份给新对象——两个对象的该字段指向同一块堆内存
- 深拷贝则为每个嵌套引用类型字段重新在堆中分配内存,并递归拷贝其内容,生成全新的地址映射链
- 例如:person1.address 和 person2.address 在浅拷贝后 == 比较结果为 true;深拷贝后为 false
clone() 方法默认走浅拷贝路径
Object.clone() 是 Java 提供的内置拷贝机制,但它只做表层复制:
- 调用前需实现 Cloneable 接口(否则抛 CloneNotSupportedException)
- 它不检查字段类型,统一按位复制:基本类型赋值、引用类型复制地址
- 若要深拷贝,必须在重写的 clone() 方法中手动 new 子对象并逐个赋值,或借助序列化/JSON 工具间接实现
避免意外共享的关键是切断引用链
所谓“独立对象”,不是看有没有 new 出来,而是看所有引用字段是否脱离了原始对象的堆内存控制:
- 直接赋值(User u2 = u1)连新对象都没有,纯引用共享
- 浅拷贝创建了新对象头,但内部仍挂着旧地址
- 只有深拷贝(或手动构造+深复制逻辑)才能让整个对象图拥有全新且隔离的内存地址映射

















