clone,克隆,记得以前在看api时第一次看到这个函数时还想呢,这啥玩意,估计又什么高深的玩意。。。。
然而在实际编码时会常常发现一个问题:java在除了基本类型变量赋值时,两个对象之间的赋值,常常其中一个属性改变后,另一个也就同时改变了,这常常不是我们想要的,我们只是想要对象A的全部属性,但是对象A,B成为连体人,还想能各自操作,互不影响,这个时候就要clone了
一个典型的调用clone()方法如下:
class CloneClass implements Cloneable{
public int aInt;
public Object clone(){
CloneClass o = null;
try{
o = (CloneClass)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}
}
注意:
(1)super.close()返回的是Object对象,记得强转一下
(2)记得要实现Cloneable接口,Cloneable接口里面虽然不包含任何方法,但是可以当成一种标志看,然后再重载clone方法否则在调用super.clone()时会抛CloneNotSupportedException异常,
(3)Object里的clone()方法是protected的,重载的clone()要改为public的
(4)什么时候用clone(),主要看是基本类型还是参考类型的,如果是基本类型就不需要
但是Object的clone()方法,仅仅是影子克隆,如果类里面本身有一个对象仍不是基本类型变量,那还会存在上述的问题,那就需要我们的深度克隆出场了,比如上述类中有一个对象时 Date date = new date(), 此时就需要对这个date语句做特殊处理
- public Object clone() throws CloneNotSupportedException
- {
- Cloneclass cloned = (Cloneclass) super.clone();
- cloned.date= (Date) date.clone()
- return cloned;
- }