我现在正在进行有关继承和深度克隆的操作。
上手操作是关于使用继承思想和使用将图形绘制到画布上的程序进行深度克隆来重写提供给我们的代码。
现在,我已经为超类clone()
和子类point
实现了group
方法,但是我总是通过{{1}获得CloneNotSupportedException
}编译时在我的子类中,我真的不明白为什么。
这是我超类的代码:
clone()
这是我的子类的代码:
public abstract class Point implements Cloneable
{
public Point clone()
{
try {
Point copy = (Point)super.clone();
copy.imgGroup = (ArrayList<Point>)imgGroup.clone();
return copy;
}
catch (CloneNotSupportedException e) {
throw new InternalError();
}
}
}
任务:
构造类public class Group extends Point implements Cloneable
{
public Group clone()
{
try {
Group copy = (Group)super.clone();
copy.group = (ArrayList<Point>)group.clone();
for (int i = 0; i < group.size(); i++) {
copy.group.set(i,group.get(i).clone());
}
return copy;
}
catch (CloneNotSupportedException e) {
throw new InternalError();
}
}
}
。可以将某个Group
对象添加到几个不同的组。您必须确定一个和同一个Figure
对象是否可以同时属于多个组。在本练习中,这不应发生。所有Figure
对象必须专门拥有其项目对象。不能在多个组之间共享对象。
因此,我们首先添加方法:
Group
此后,有一些方法的实现说明和一个public Figure class clone ();
// (define it in the same style as on page 4 in the document below)
// this was what point clone() was in the class Point.
克隆。
因此,在此任务中,我应该使用各种方法以及新的Group
来实现Group
,这就是我现在遇到的问题。
我希望您能帮助我指出正确的方向,只是想知道为什么会这样。谢谢!
答案 0 :(得分:1)
我总是在子类中获得带有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;
}
}
以便子类可以看到在超类签名中引发的异常。
更新
请按照下面的this comment进行详细说明。
更新2
由于用户删除了另一个答案(以上我的评论所指的位置),因此添加了更多详细信息。
您无法实例化一个抽象类-但您仍然可以在其中使用clone()
方法。但是抽象类应该在其clone方法中返回的具体克隆实例是什么?当您在抽象类中说this
或super.clone()
时,它们在运行时都引用相同的子类实例。这意味着您的情况下,浅表副本(Point copy = (Point) super.clone();
)是Group
的实例。您可以在抽象超类的System.out.println(super.clone().getClass())
方法中添加clone
来证明这一点。
因此,您可以在超级抽象类中深度克隆可继承属性-并且-在子类的clone()方法中仅对子类的属性进行深克隆。这样,如果定义了多个子类,则可以避免在所有子类中深度克隆超类属性。