gpt4 book ai didi

java - 了解当我们在调用和不调用 super.clone 的情况下重写克隆方法时会发生什么?

转载 作者:行者123 更新时间:2023-12-01 12:59:21 24 4
gpt4 key购买 nike

我正在阅读 Joshua Bloch 所著的《Effective Java》。我必须说这是一本厚重而复杂的书。关于所有对象通用方法的章节(第 3 章)对我来说很难理解,因为我编程的时间还不到 3 年(Java 一年)。我不太理解适当重写克隆方法的概念。我可以获得一个简单易懂的实现克隆的示例,无论是正确的方式还是错误的方式?为什么调用 super.clone 失败会导致问题?会发生什么?

提前谢谢您。

最佳答案

我自己正在读那本书。不确定我在这个例子中是否做的一切都“正确”,但也许它会帮助你理解。

计算机.java

package testclone;

public class Computer implements Cloneable {
String OperatingSystem;

protected Computer Clone() throws CloneNotSupportedException {
Computer newClone = (Computer) super.clone();
newClone.OperatingSystem = this.OperatingSystem;
return newClone;
}

}

多核.java

package testclone;

public class MultiCore extends Computer implements Cloneable {
int NumberOfCores;

@Override
protected MultiCore Clone() throws CloneNotSupportedException {
//********* use 1 of the next 2 lines ***********
//MultiCore newClone = (MultiCore) super.clone();
MultiCore newClone = new MultiCore();
newClone.NumberOfCores = this.NumberOfCores;
return newClone;
}
}

TestClone.java

package testclone;

public class TestClone implements Cloneable {

public static void main(String[] args) throws CloneNotSupportedException {
//Computer myComputer = new Computer();
//myComputer.OperatingSystem = "Windows";

MultiCore myMultiCore = new MultiCore();
myMultiCore.OperatingSystem = "Windows"; //field is in parent class
myMultiCore.NumberOfCores = 4;

MultiCore newMultiCore = myMultiCore.Clone();

System.out.println("orig Operating System = " + myMultiCore.OperatingSystem);
System.out.println("orig Number of Cores = " + myMultiCore.NumberOfCores);
System.out.println("clone Operating System = " + newMultiCore.OperatingSystem);
System.out.println("clone Number of Cores = " + newMultiCore.NumberOfCores);

}

}

输出:

原始操作系统= Windows

原始核心数 = 4

clone Operating System = null * 这行不是您想要的。

克隆核心数 = 4

如果您使用 super.clone() 行,则输出为

原始操作系统= Windows

原始核心数 = 4

克隆操作系统 = Windows * 现在就是您想要的

克隆核心数 = 4

因此,如果您不使用 super.clone(),它不会克隆父级(或祖 parent 、或曾祖 parent 等)中的字段

祝你好运!(抱歉 - 当我输入时,上面的格式看起来正确,但由于某种原因,当它实际显示时看起来很糟糕)

关于java - 了解当我们在调用和不调用 super.clone 的情况下重写克隆方法时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23644431/

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