java中object.clone()默认实现浅拷贝,需类实现cloneable接口并重写public clone()方法调用super.clone();引用字段仅复制地址,共享对象,修改一方会影响另一方。

Java 中 Object 类的 clone() 方法默认实现的是**浅拷贝**,但要正确使用它,必须满足几个前提条件,否则会抛出 CloneNotSupportedException。它不是开箱即用的方法,需要主动配合实现。
必须实现 Cloneable 接口
Cloneable 是一个标记接口(无方法),作用是告诉 JVM 当前类允许被克隆。如果不实现,调用 clone() 会直接抛出异常。
注意:仅声明 implements Cloneable 还不够,还需重写 clone() 方法并调用 super.clone():
public class Person implements Cloneable {
private String name;
private int age;
private Address address; // 引用类型
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // 调用 Object 的 clone,完成浅拷贝
}
}
浅拷贝的实际效果
调用 super.clone() 后,会创建一个新对象,其基本类型字段(如 int、boolean)值被复制,而引用类型字段(如 Address)只是复制了**引用地址**,新旧对象共享同一个引用对象。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
例如:
- 原
person1.name = "Alice"→ 克隆后person2.name是独立副本(字符串不可变,表现像深拷贝) - 原
person1.address = new Address("Beijing")→person2.address指向同一Address实例 - 修改
person2.address.setCity("Shanghai"),person1.address.getCity()也会变成 "Shanghai"
常见错误与注意事项
-
clone() 是 protected 方法:子类必须重写为
public才能被外部调用 -
不处理受检异常:重写时需声明
throws CloneNotSupportedException或在方法内捕获 - 不调用 super.clone() 就没意义:自己 new 一个对象再赋值,不属于标准 clone 机制,也不具备可继承性
- final 字段不能被 clone 修改:如果字段是 final 且为引用类型,浅拷贝后无法重新赋值,可能引发设计矛盾
想实现深拷贝怎么办?
浅拷贝是 Object.clone() 的默认行为。若需深拷贝,必须在重写的 clone() 方法中手动克隆引用字段:
@Override
public Object clone() throws CloneNotSupportedException {
Person cloned = (Person) super.clone();
if (this.address != null) {
cloned.address = (Address) this.address.clone(); // 假设 Address 也实现了 Cloneable
}
return cloned;
}
或者改用序列化、JSON 工具(如 Jackson)、第三方库(如 Apache Commons Lang 的 SerializationUtils.clone())等更稳妥的深拷贝方式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










