cloneable接口

只有实现了cloneable接口的类,其实例对象才能调用 clone() 方法进行复制。

//  实现了cloneable接口的类。
class CloneableClass implements Cloneable{
    public Test test = null;
    public double data1 = 0;
    public String data2 = null;
    public StringBuffer data3 = null;
    
    public CloneableClass(Test test,double data1,String data2,StringBuffer data3){
    this.test = test;
    this.data1 = data1;
    this.data2 = data2;
    this.data3 = data3;
    }

    //重写clone()方法:调用object的 clone() 方法,实现“浅拷贝”
    public object clone() throws CloneNotSupportedException{
        return super.clone();
    }
}

这样,CloneableClass这个类的对象就可以调用clone()进行浅拷贝了。

//clone()的使用方法
class Test{
    public String userData = null;
    public Test(String userData){
        this.userData = userData;
    }
}
Test test = new Test("abc");
StringBuffer sb = new StringBuffer("def");
CloneableClass cc1 = new CloneableClass(test, 1.5, "original", sb);

CloneableClass cc2 = null;
Object temp = cc1.clone();
if(temp instanceof CloneableClass){
    cc2 = (CloneableClass) temp;
}

所谓的浅拷贝:①对于基本数据类型,开辟新的内存,生成新的副本(值与母版相同,但址不同)。

       ②对于引用数据类型,并不生成新的副本,只是复制引用。(前后指向同一个内存)。

注意:①字符串不是基本数据类型,但是cc2.data2 = "new";不会改变母版字符串的值,而是生成一个新的String实例,使cc2.data2指向他,而cc1.data2仍指向之前的字符串。

   ②StringBuffer也不是基本数据类型,所以,cc2.data3=“new”,会使母版的cc1.data3也跟着改变(引用不变,但引用指向的内存中的数据改变)。

   ③“深拷贝”,可在clone()方法的重写中实现(浅拷贝直接调用object的clone,深拷贝需要自定义实现)。

//“深拷贝”:clone()方法的重写
public Object clone() throws CloneNotSupportedException {  
        Test          test = new Test(this.test.userData);    
        double      data1 = this.data1;  
        String        data2 = new String(this.data2);  
        StringBuffer data3 = new StringBuffer(this.data3.toString());  
          
        CloneableClass copy = new CloneableClass(test, data1, data2, data3);  
        return copy;  
}

 

posted @ 2017-08-24 14:25  zhengmengen  阅读(390)  评论(0)    收藏  举报