java中对象的clone方法默认实现浅拷贝,需实现cloneable接口、重写public clone()方法并处理clonenotsupportedexception;浅拷贝仅复制基本类型和引用地址,引用类型对象仍共享,需手动实现深拷贝。

Java 中对象的 clone 方法默认实现的是浅拷贝,但要正确使用它,需要满足几个前提条件,并手动处理一些细节。
必须实现 Cloneable 接口
Cloneable 是一个标记接口(空接口),不包含任何方法。它的作用是告诉 JVM:这个类允许被克隆。如果不实现它,调用 clone() 会抛出 CloneNotSupportedException。
示例:
public class Person implements Cloneable {
private String name;
private int age;
private Address address; // 假设 Address 是另一个引用类型
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // 调用 Object 的 clone()
}
}
重写 clone() 方法并声明为 public
Object.clone() 是 protected 的,子类需重写并改为 public,否则外部无法调用。
同时建议指定返回具体类型(Java 5+ 支持协变返回类型),提升可读性和类型安全:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 把返回类型从
Object改为当前类类型,比如Person - 捕获或声明抛出
CloneNotSupportedException
浅拷贝的表现和注意事项
浅拷贝只复制对象本身的基本类型字段和引用类型的地址,不会递归复制引用指向的对象。
例如:
-
name(String)和age(int)会被独立复制(String 不可变,实际效果类似深拷贝) -
address字段只是复制了引用,新旧对象的address指向同一个Address实例 - 修改克隆对象的
address.city,原对象也会看到变化
验证是否为浅拷贝
可以通过比较引用字段的地址来确认:
Person p1 = new Person();
p1.setAddress(new Address("Beijing"));
Person p2 = p1.clone();
System.out.println(p1.getAddress() == p2.getAddress()); // true → 浅拷贝
如果希望避免这种共享,就需要手动实现深拷贝——在 clone() 方法中对引用字段也调用其 clone() 或新建对象。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










