Cloneable问题:
首先 Cloneable是javaAPI中几个标记接口之一 ,它里面没有明确clone这个方法,但是一旦继承了这个借口就可以重写clone()方法,在Object类中是继承了这个借口的,但是Object中的clone()方法有一定局限性。有时候使用起来不方便。
在java中,克隆又分为深克隆和浅克隆。所谓软克隆就是当你所要克隆的对象的数据包含有 对象类型的属性 比如说 A类中的属性含有类型为B类的变量,这样当你复制的时候,克隆对象就只会复制B类型变量的引用,这样的话,就造成了一个问题,原对象和克隆对象的属性B类型变量就指向的是同一个实例对象,当你想修改克隆对象中B类型变量的值时候,就会影响原对象。所以这往往达不到效果。而Object就是采用的浅克隆 。
而深克隆说简单点就是将你A类中B类型变量一起复制了。话不好多说上例子。
public class A implments cloneable{ //要想实现对象的克隆就必须继承cloneable接口 并重写clone()方法
public int i=10; //int类型变量
public B b;
A(int j){
this.b=new B(j);//A的构造方法中 初始化b
}
public A clone(){
A a=(A)super.clone();//深克隆
a.b=(B)a.b.clone();
return a;
}
}
class B implments cloneable{
public int i=9;
B(){
}
public B clone(){
return (B)super.clone();//浅克隆
}
}
总之一句话 深克隆的意思就是重写clone()方法的时候对浅克隆时采用引用复制的方式进行了改变 ,不是复制引用而是复制在内存堆中的位置!