1 回答
TA贡献1829条经验 获得超13个赞
我总是在我的子类中使用 clone() 得到 CloneNotSupportedException
我想你得到的是; Unreachable catch block for CloneNotSupportedException.
那是因为您throws CloneNotSupportedException从超类签名中省略了。但是,在子类中,您希望super.clone()抛出已检查的CloneNotSupportedException. 将您的超类实现更改为;
public abstract class Point implements Cloneable {
public Point clone() throws CloneNotSupportedException {
Point copy = (Point) super.clone();
return copy;
}
}
以便子类可以看到超类签名中抛出的异常。
更新
请遵循下面的评论以获得更好的清晰度。
更新 2
添加更多详细信息,因为用户删除了另一个答案(我上面的评论指的是)。
你不能实例化一个抽象类——但你仍然可以clone()在其中拥有一个方法。但是抽象类应该在其克隆方法中返回的具体克隆实例是什么?当你说this或super.clone()在一个抽象类中时,它们在运行时都指的是同一个子类实例。这意味着浅拷贝 ( Point copy = (Point) super.clone();) 是Group您案例中的一个实例。您可以添加System.out.println(super.clone().getClass())抽象超类的clone方法来见证这一点。
因此,您可以在超级抽象类中深度克隆可继承属性 - 并且 - 仅在子类的 clone() 方法中深度克隆子类的属性。如果您定义了多个子类,这样您就可以避免在所有子类中深度克隆超类属性。
添加回答
举报