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; } }
总结:浅克隆就是没有克隆引用类型的成员变量,深克隆就是克隆了引用类型的成员变量。
浙公网安备 33010602011771号