我有一个父类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());
提前致谢!如果我的帖子重复,请告诉我。
答案 0 :(得分:0)
实施1永远不会返回任何空的Person
实现2最终将调用Object.clone()
,它试图创建当前实例的实际副本。现在该实例是学生,因此它会尝试复制该学生并将其返回。