首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

深度克隆跟浅度克隆

2012-09-02 
深度克隆和浅度克隆克隆的主对象:(实现Cloneable接口,重写clone方法) 注意:在JAVA克隆对象不能简单的使用c

深度克隆和浅度克隆
克隆的主对象:(实现Cloneable接口,重写clone方法)
注意:在JAVA克隆对象不能简单的使用clone方法,clone方法只是进行浅克隆。

public class TestClonBean implements Cloneable,Serializable{  
    private String name;  
    private int age;  
    private String sex;  
    @Override 
    protected TestClonBean clone(){  
        TestClonBean bean = null;  
        try {  
            bean = (TestClonBean) super.clone();  
        } catch (CloneNotSupportedException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        return bean;  
    }  
    省略get/set方法……  
}


深度克隆的工具类:(深度克隆的原理:把对象序列化输出到内存,然后从内存中把序列化的byte[]取出来,进行反序列化获取对象)

public class DeepCloneBean {  
    public static Object getObject(Object obj){  
        Object cloneobj = null;  
        ByteArrayInputStream bin = null;  
        ByteArrayOutputStream bout = null;  
        try {  
            //把对象对到内存中去  
            bout = new ByteArrayOutputStream();  
            ObjectOutputStream oos = new ObjectOutputStream(bout);  
            oos.writeObject(obj);  
            oos.close();  
            //把对象从内存中读出来            
            ByteArrayInputStream bais = new ByteArrayInputStream(bout.toByteArray());  
            ObjectInputStream ois = new ObjectInputStream(bais);  
            cloneobj = ois.readObject();  
            ois.close();  
            return cloneobj;  
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (ClassNotFoundException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        return null;  
    }  
}

总结:
不管是深度克隆还是浅度的克隆其实都是产生了一个新的对象。所以我们在比较克隆对象和源对象的时候返回是false。
深度克隆和浅度的克隆的区别在于:浅度克隆的对象只会克隆普通属性,不会克隆对象属性。而深度克隆就会连对象属性一起克隆。

热点排行