Java中的Clone()表单子类

时间:2018-03-31 21:51:26

标签: java

我有一个父类Person,它实现了Cloneable接口和一个子类Student。我使用两种不同的方法来实现克隆方法。

public class Person implements Cloneable{
    private String name;
    private int age;
    .....

    //implementation 1
    @Override public Person clone() {
        return new Person(name, age);
    }

    //implementation 2
    @Override public Person clone() {
        try {
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

public class Student extends Person{
}

我的问题是:当我使用实现1并运行以下代码时,它返回类Person。但是,如果我使用实现2,它将返回类Student。我知道在克隆方法中使用构造函数不是惯例。但我真的很困惑上述差异的原因是什么。

Student s = new Student();
System.out.println(s.clone().getClass());

提前致谢!如果我的帖子重复,请告诉我。

1 个答案:

答案 0 :(得分:0)

实施1永远不会返回任何空的Person 实现2最终将调用Object.clone(),它试图创建当前实例的实际副本。现在该实例是学生,因此它会尝试复制该学生并将其返回。