【发布时间】:2013-12-04 01:17:59
【问题描述】:
我观察到克隆是Object 类的方法,Object 是每个类的超类。在每个类中,我都将克隆作为覆盖方法,假设我创建名称为 A 的类,如果我没有在 class A 覆盖 clone 方法,并为 A 创建了一个对象,但我没有获得访问权限对象中的克隆方法
我在 oop 中缺少什么概念
【问题讨论】:
标签: java class oop object access-specifier
我观察到克隆是Object 类的方法,Object 是每个类的超类。在每个类中,我都将克隆作为覆盖方法,假设我创建名称为 A 的类,如果我没有在 class A 覆盖 clone 方法,并为 A 创建了一个对象,但我没有获得访问权限对象中的克隆方法
我在 oop 中缺少什么概念
【问题讨论】:
标签: java class oop object access-specifier
有两个问题:首先,clone() 是Object 的protected 方法,所以它只能从子类中调用,除非你重写它并使其公开。其次,除非您的类实现了Cloneable,否则调用clone() 将抛出CloneNotSupportedException。典型的做法是:
class A implements Cloneable {
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException("Impossible exception!", e);
}
}
}
(您可以消除 try/catch 块并将您的 clone() 方法声明为 throw CloneNotSupportedException。该方法会更简单,但所有调用代码都必须处理异常。)
由于 Java 允许您在重写方法时缩小返回类型,您可以重新定义 clone() 以返回 A,从而避免调用代码必须强制转换:
class A implements Cloneable {
public A clone() {
try {
return (A) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException("Impossible exception!", e);
}
}
}
【讨论】: