Object.clone()默认浅拷贝,安全使用需实现Cloneable接口并重写public clone()方法;因原方法protected且检查接口实现,否则抛CloneNotSupportedException。

Object 类的 clone() 方法默认是浅拷贝,要安全使用必须满足两个前提:类实现 Cloneable 接口,并重写 clone() 方法。
为什么不能直接调用 clone()?
因为 Object.clone() 是 protected 修饰的,子类无法直接访问;而且它会检查当前类是否实现了 Cloneable 接口,没实现就抛 CloneNotSupportedException 异常。
正确使用 clone() 的三步操作
- 让目标类实现 Cloneable 接口(仅作标记,无方法)
- 重写 public Object clone() 方法,调用 super.clone()
- 如果类中有可变引用类型字段(如 List、Date、自定义对象),需手动深拷贝这些字段
浅拷贝 vs 深拷贝示例
假设有个类包含 int 和 ArrayList 字段:
调用 super.clone() 后,int 值被复制一份,但 ArrayList 引用仍指向原对象——修改副本里的 list,原对象也会变。这就是浅拷贝。
立即学习“Java免费学习笔记(深入)”;
要实现深拷贝,得在 clone 方法里单独 new 一个新 list,并把原 list 中的元素(如果是不可变对象如 String,直接 add;如果是可变对象,也要逐个 clone)复制进去。
替代 clone() 的更推荐方式
实际开发中,多数人倾向用以下方式代替 clone():
- 提供带参构造器,传入另一个对象初始化自身(推荐,语义清晰)
- 使用静态工厂方法,如 Person copyOf(Person p)
- 借助序列化(适用于可序列化类)、或 Lombok 的 @Builder + toBuilder
它们比 clone() 更可控、更易理解,也避开 Cloneable 的“伪接口”设计缺陷。


















