如果我重写克隆方法,编译器会创建一个桥接方法 保证正确的多态性(这是经过类别的分解)
class Point
{
Point()
{
}
protected Point clone()
throws CloneNotSupportedException
{
return this; // not good only for example!!!
}
protected volatile Object clone()
throws CloneNotSupportedException
{
return clone();
}
}
因此,当调用clone方法时,将调用bridge方法,并在其中调用正确的clone方法。但是我的问题是当进入bridge方法时调用return clone()
VM如何说它必须调用Point clone()
而不是自己再调用它?
答案 0 :(得分:1)
此代码无法使用java 1.6编译。 Java中的方法签名不包括返回类型...并且您不能拥有重复的方法签名。
答案 1 :(得分:1)
你不能这样做,它不会编译,因为你有两个方法具有相同的名称和相同的参数(在这种情况下没有),如果你调用somePoint.clone()
,则不清楚是哪一个。
你应该做的事情如下:
public Point clone() {
return (Point) super.clone(); // shallow copy
}
编辑:一些更好的点: 你的类应该实现可克隆的接口,否则super.clone()将给出异常。 Object类中的clone()方法返回当前对象的浅表副本(它的运行时类将与调用clone方法的对象相同)。然后,您的工作是对该对象执行任何特定于类的操作(如克隆对其他对象的引用),然后返回它。返回类型可以是您自己的类而不是Object,它仍然会覆盖Object.clone()(或任何其他ParentClass.clone())方法。