当我们使用new关键字创建类的一个实例时,构造函数中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,那么我们可以通过调用它的clone()方法,注意,clone()不会调用任何构造函数。
调用Object.clone()时,当我们在自己的类里覆盖clone()时,对于super.clone()来说是最关键的是:根类中的clone()方法负责建立正确的存储容量,并通过“按位复制”将二进制位从原始对象中复制到新对象的存储空间。也就是说,它并不只是预留存储空间以及复制一个对象——实际需要调查出欲复制之对象的准确大小,然后复制那个对象。由于所有这些工作都是在由根类定义之clone()方法的内部代码中进行的(根类并不知道要从自己这里继承出去什么),所以大家或许已经猜到,这个过程需要用RTTI判断欲克隆的对象的实际大小。采取这种方式,clone()方法便可建立起正确数量的存储空间,并对那个类型进行正确的按位复制。
针对引用类型有时候需要进行深复制如下所示:
class CloneClass implements Cloneable{
private int number;
private Date date=new Date();
public void setNumber(int number){
this.number=number;
}
public int getNumber(){
return number;
}
public void setDate(Date date){
this.date=date;
}
public Date getDate(){
return date;
}
public Object clone(){
CloneClass o = null;
try{
o = (CloneClass)super.clone();
o.date=(Date)this.getDate().clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}
}