对object.clone方法的新认识

原来一直以为子类在重写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();
    }
  }

 

你可能感兴趣的:(object)