Java中深克隆与浅克隆的简单理解

其实深克隆跟浅克隆没有太大的区别,只是概念和叫法不一样,

相同点:实现Cloneable接口,重写clone方法,注意和重载的区别,可参考JAVA的重载、覆盖和隐藏的区别一文

为什么会有深克隆呢,其实是因为克隆的时候,java虚拟机只clone了基本数据类型和sting类型(注意String类型不是基本数据类型,它也没有实现clone方法),对于引用类型的成员,它没有处理。哪些是引用类型呢?其实就是数组啊,对象啊什么的,所以就造成了clone后的对象只有部分被复制,造成的后果你修改了里面引用类型的成员值,其原始地方的值也被改变了。

把浅克隆改成深克隆的方法也很简单,就是在clone方法中把引用类型的成员变量单独调一次clone方法

举个例子

浅克隆

/**
 * 浅克隆,其中mList为引用类型,所以clone方法并没有克隆到mList
 * @author lcq
 */
public class Thing implements Cloneable {
    private String mStr;
    private ArrayList mList;

    @Override
    public Thing clone() {
        Thing thing = null;
        try {
            thing = (Thing) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return thing;
    }
}

深克隆,就一句话的区别

/**
 * 深克隆,其中mList为引用类型,所以clone方法并没有克隆到mList
 * @author lcq
 */
public class Thing implements Cloneable {
    private String mStr;
    private ArrayList mList;

    @Override
    public Thing clone() {
        Thing thing = null;
        try {
            thing = (Thing) super.clone();
            // 区别就在这里
            thing.mList = (ArrayList)this.mList.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return thing;
    }
}

总结:浅克隆就是没有克隆引用类型的成员变量,深克隆就是克隆了引用类型的成员变量。

posted @ 2013-03-29 13:45  muzhi121  阅读(514)  评论(0)    收藏  举报