在您的情况下,它是可行的,但在某些情况下,它甚至不起作用。 在不调用super.clone 的情况下实现clone 方法会使子类无法克隆。例如,假设我有一个Fruit 类
public class Fruit implements Cloneable {
private String fruitName;
public Fruit(String fruitName) {
this.fruitName = fruitName;
}
public String getFruitName() {
return fruitName;
}
public Fruit clone() {
return new Fruit(fruitName);
}
}
如您所见,我实现了Fruit#clone 方法而不调用super.clone,这看起来很好。但现在我想创建一个扩展Fruit 的类Apple,如下所示:
public class Apple extends Fruit {
private String origin;
public Apple(String fruitName, String origin) {
super(fruitName);
this.origin = origin;
}
public Apple clone() {
// TODO
}
}
现在的问题是,如何实现苹果的clone 方法。我应该在 Apple 的 clone 方法中调用 super.clone 吗?是的,你应该,否则你无法获得fruitName 的值,这是Fruit 内部的一个私有字段。好的,让我们试试这个:
public Apple clone() {
return (Apple) super.clone();
}
但是,它没有用。因为Fruit#clone没有调用super.clone,所以super.clone()在Apple#clone里面的结果返回了Fruit的实例而不是Apple。 Fruit不能转换成Apple,会报错:
Exception in thread "main" java.lang.ClassCastException: Fruit cannot be cast to Apple
at Apple.clone(Apple.java:20)
如您所见,您无法为Apple 提供可行的clone 方法,无论您是否调用super.clone,它都不会起作用。只是因为你没有在Fruit#clone中调用super.clone。
总之,如果您希望子类可克隆,则需要在clone 方法中调用super.clone。