java - 在 Java 中实现可克隆

标签 java clone final cloneable

在什么情况下应该使用这种方式:

public A clone() throws CloneNotSupportedException {
    A clone = (A)super.clone();
    clone.x= this.x;
    return clone;
}

在什么情况下我应该使用这种方式:

public ShiftedStack clone() throws CloneNotSupportedException {
    return new A(this.x);
}

x是final,我想用第一种方式怎么办?

关于第一种方式,我是这样理解的:我们clone父类(super class)向上转型,导致一些成员未初始化。在此之后初始化这些成员。我的理解正确吗?

谢谢。

最佳答案

两件事:

1)第一种形式,不需要浅拷贝数据成员(clone.x=this.x)。 Object.clone() 为您完成。

2) 使用第二种形式时要小心:它总是创建一个具体类型 A 的实例,因此如果您用 B 扩展 A,那么 B.clone() 将无法再使用其父类(super class)的克隆方法。

--编辑--

关于您的问题,如果方法 clone() 在类 X 的层次结构中被正确实现,那么在类 X 的实现中调用 super.clone() 将返回类型为 X 的实例.从 Object 继承的默认 clone() 是一个“魔术方法”,因为它创建了调用它的具体类的实例。它还执行所有数据成员的浅拷贝。通常,在 clone() 的实现中,您会执行一些深度复制,以避免在源和克隆之间共享可变对象的引用。

关于java - 在 Java 中实现可克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2710269/

相关文章:

java - JAVA中计算所有小于或等于N的数字的乘法表的程序

java - 是否可以制作一个JTextField变量的字符串

mercurial - 无法通过 http 克隆 mercurial (hg) 存储库

java - 如果最终确定,公共(public) getter 和 setter 是否适用于 Android? Java 中的最终正确性与 C++ 中的常量正确性一样重要吗?

java - 如何为 Spring Boot 应用程序配置嵌入式 Tomcat 虚拟主机?

java - 什么是好的 Java 压缩库?

c++ - "invalid initialization of non-const reference of type..."clone()函数出错

javascript - jQuery clone() 函数弄乱了原始元素的属性

java - 有什么好方法可以让不可变对象(immutable对象)链循环起来吗?

java - 如何在 Java 中仅初始化一次局部变量