java中clone()默认实现浅拷贝,即基本类型值被复制,引用类型仅复制地址、共享同一实例;验证关键在于检查原始与克隆对象的引用字段是否指向同一内存地址。

Java 中 clone() 方法默认实现的是浅拷贝,即只复制对象本身,其引用类型的成员变量仍指向原对象中的同一内存地址。要校验是否为浅拷贝,关键在于验证原始对象与克隆对象中引用类型字段是否共享同一实例。
理解 clone 的默认行为
Object.clone() 是受保护方法,需类实现 Cloneable 接口并重写该方法。它逐字段复制基本类型值,对引用类型仅复制引用(地址),不创建新对象。因此,修改克隆对象中某个引用字段的内容,可能影响原始对象——这是浅拷贝的典型特征。
编写可验证的测试用例
构造一个含引用类型字段的类(如 List、自定义对象),调用 clone() 后对比原始与克隆对象:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 检查两者是否为不同对象(
!=,但equals()可能为true) - 检查引用字段是否指向同一对象(例如
original.list == cloned.list) - 修改克隆对象的引用字段内容(如
cloned.list.add("new")),再观察原始对象对应字段是否变化
注意 clone 方法的正确重写方式
若未正确重写 clone(),可能抛出 CloneNotSupportedException 或返回错误结果:
- 必须声明
public访问权限(不能是protected) - 需调用
super.clone()获取副本,再手动处理引用字段(如需深拷贝才需额外复制) - 若类含 final 引用字段,
clone()无法直接赋值,需在构造或反射中绕过限制
常见误判点
容易把“两个对象内容相同”等同于“不是浅拷贝”。实际上浅拷贝后内容一致是正常现象;真正判断依据是引用是否共享:
- 使用
System.identityHashCode()比较引用字段的底层地址更可靠 - 避免依赖
equals()或toString()判断,它们反映逻辑相等而非内存独立性 - 数组字段(如
int[])虽是引用类型,但clone()对一维数组会创建新数组(浅层复制),这点易被忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










