java - 克隆派生类

标签 java clone

我正在尝试实现派生类的克隆,但是,我没有得到,我不知道为什么。 为什么我不能克隆 B 类?,我得到一个 CastClassExpcetion。

public class A implements Cloneable {
    private Integer a;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        A clone = new A(); //Why if I do this instance of super.clone() I get an exception?
        A clone = (A) super.clone();
        clone.a = this.a;
        return clone;
    }
      ..

}

public class B extends A implements Cloneable {
    private String b;
..
    @Override
    protected Object clone() throws CloneNotSupportedException {

        B clone = (B) super.clone();
        clone.b = this.b;
        return clone;
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        B b = new B(1, "s");
        B clone = b.clone();                
    }

}

最佳答案

您在 clone() 方法中错误地返回了 ab。这会导致 B.clone() 出现异常,因为您无法将整数转换为 B

要修复此问题,只需确保返回您的clone 变量即可。

<小时/>

另请注意,字段值会自动复制到您的克隆对象。不需要将字段值分配给您的克隆,除非它们是可变的并且您希望防御性地复制它们。在您的克隆方法中,您有这些多余的行:

clone.a = this.a;

clone.b = this.b;

您可以从 B.clone() 方法中删除这两行,因为字符串和整数是不可变的。

关于java - 克隆派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25679759/

相关文章:

java - 从 Java 中的字符串中删除尾随子字符串

java - 无法单击类 div SELENIUM

c# - Bitmap.Clone() 的奇怪行为

.net - 如何克隆动画画笔?

java - 第一次创建复制方法

java - Java中有类似mysql_num_rows的东西吗?

java - Vertx Future 不会等待

java - 覆盖克隆时处理最终字段

java - 如何使用正则表达式替换新行开头的制表符?

java - Object类如何实现clone()方法