java允许子类将object.clone()重写为public,因其遵循“重写时访问权限只能相同或更宽松”的规则;正确做法需同时实现cloneable接口、重写为public、调用super.clone()并处理clonenotsupportedexception异常。

Java 中 Object.clone() 方法是 protected 的,这意味着它只能在本类、同一包内的类或子类中被访问。但子类重写时,**可以将访问权限扩大为 public**,这是 Java 语言明确允许的(符合“重写时访问修饰符不能更严格”的规则)。
为什么能从 protected 改为 public?
Java 规定:子类重写父类方法时,访问权限只能**相同或更宽松**(即 private → protected → public),不能更严格。因为 Object.clone() 是 protected,所以子类中重写为 public 完全合法。
正确重写方式(必须满足的条件)
仅改访问修饰符还不够,还需注意以下几点,否则会编译失败或运行异常:
-
实现 Cloneable 接口:否则调用
super.clone()会抛出CloneNotSupportedException - 调用 super.clone():通常直接委托给父类实现(浅拷贝),也可自定义逻辑
-
声明抛出 CloneNotSupportedException(或捕获处理):因为
Object.clone()声明了该异常 -
返回类型可协变:建议返回当前子类类型(如
MyClass),提升类型安全性
示例代码
假设有一个类 Person:
public class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// ✅ 正确:重写为 public,实现 Cloneable,处理异常,协变返回
@Override
public Person clone() {
try {
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError("Clone not supported", e);
}
}
}
这样外部代码就可以直接调用:Person p2 = p1.clone();
常见错误提醒
以下写法会导致问题:
- 没实现
Cloneable→ 运行时抛CloneNotSupportedException - 把
clone()写成private或protected→ 外部无法调用,失去重写意义 - 忽略异常处理,又不声明抛出 → 编译失败(因为父类方法声明了检查型异常)
- 返回
Object而非具体类型 → 调用方需强制转型,不够安全
只要遵守接口实现、异常处理和访问权限规则,将 clone() 重写为 public 是标准且推荐的做法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











