原来一直以为子类在重写Object.clone()方法时,需要额外把子类的新增属性也赋值给克隆对象,如下面的代码,other.setAddition(this.addition);我以前写clone 方法时都是加上这一句的。事实上这是不必要的,可以把这一句代码去掉。
要实现这种效果是有前提条件的:在Test类的父类链上,所有的父类必须提供clone方法,并且返回由调用super.clone方法获得的对象。如果任何一个父类的clone方法返回由构造函数创建的对象,这就会产生一个错误的类。当我们重写了clone方法,必须返回super.clone方法获得的对象。
如果遵循了以上规则,Object.clone方法会保证创建Test的实例。这一点看上去挺神奇的。
@Override
public Test clone(){
Test other = null;
try{
other = (Test) super.clone();
//other.setAddition(this.addition);//事实上这句话可以不要的。
return other;
}catch(CloneNotSupportedException e){
throw new AssertionError();
}
}