gpt4 book ai didi

java - 为什么在实现克隆方法时我们返回 super.clone() 而不是这个 clone()

转载 作者:搜寻专家 更新时间:2023-11-01 02:21:37 26 4
gpt4 key购买 nike

public abstract class Shape implements Cloneable {

private String id;
protected String type;

abstract void draw();

public String getType(){
return type;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public Object clone() {
Object clone = null;

try {
clone = super.clone();

} catch (CloneNotSupportedException e) {
e.printStackTrace();
}

return clone;
}
}

假设我想获得一个对象的克隆,那么为什么我们总是返回 super.clone() 。如果我想克隆一个对象,那么我想这就是我想要克隆的对象。我是克隆的初学者。

最佳答案

父类(super class)clone方法应该是Object.clone()或者它应该委托(delegate)1(最终)到Object.clone ()。这是一个“神奇”的方法,它知道如何创建当前实例的实际类的新实例。

当然,如果您尝试像这样实现克隆:

public Object clone() {
return clone();
}

您将创建一个递归循环,该循环将很快以 StackOverflowError 结束。


1 - 如果 super.clone() 最终没有委托(delegate)给 Object.clone(),那么它将无法克隆值Shape 及其具体子类型定义的字段。


注意这个特殊的例子,clone() 可以简化为:

public Object clone() {
return super.clone();
}

Shape 类有 Object 作为它的父类(super class),并且 Object.clone() 将抛出 CloneNotSupportedException< 的唯一情况 如果实际类没有实现 Cloneable 接口(interface)。但是 Shape 会自己做。

事实上。 clone() 的所有声明真的是为了增加 clone()protected 版本的可见性> 在 Object API 中。

关于java - 为什么在实现克隆方法时我们返回 super.clone() 而不是这个 clone(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39747488/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com