【发布时间】:2011-11-26 15:39:24
【问题描述】:
我不明白克隆自定义对象的机制。例如:
public class Main{
public static void main(String [] args) {
Person person = new Person();
person.setFname("Bill");
person.setLname("Hook");
Person cloned = (Person)person.clone();
System.out.println(cloned.getFname() + " " + cloned.getLname());
}
}
class Person implements Cloneable{
private String fname;
private String lname;
public Object clone() {
Person person = new Person();
person.setFname(this.fname);
person.setLname(this.lname);
return person;
}
public void setFname(String fname) {
this.fname = fname;
}
public void setLname(String lname){
this.lname = lname;
}
public String getFname(){
return fname;
}
public String getLname() {
return lname;
}
}
这是一个示例,显示了书中所写的正确克隆方法。但是我可以在类名定义中删除实现 Cloneable 并且得到相同的结果。
所以我不明白 Cloneable 的提议以及为什么在 Object 类中定义 clone() 方法?
【问题讨论】:
-
来自 javadoc:在未实现 Cloneable 接口的实例上调用 Object 的 clone 方法会导致引发异常 CloneNotSupportedException。但是,如果我只是从 Object 类中重写此方法,则没有任何异常???
-
@Dmytro Zelinskyi :由于克隆方法应该以调用
super.clone()开始,因此超类可能会显式抛出CloneNotSupportedException。另见我的回答。