java克隆

swordhxc 2009-11-25
讨论下:clone()
       何为影子克隆
       何为深度克隆
blue3377 2009-11-25
我对Clone一定都不了解。我都没有用 过。
moze1988 2009-11-30
这个应该是浅复制与深复制的问题:
浅复制只复制对象内容而不复制其引用
深复制就存在一个遍历的过程
Heart.X.Raid 2009-12-29
可以看看这篇文章http://hxraid.iteye.com/blog/428920
uin57 2010-02-07
所谓影子克隆是指 你得到的只是一个对象的引用
深度克隆 是指 你的得到的是一个 对象的副本
好彩哥 2010-03-26
uin57 写道
所谓影子克隆是指 你得到的只是一个对象的引用
深度克隆 是指 你的得到的是一个 对象的副本

精辟!!!
w.bean 2010-04-18

影子clone: 调用Object类中clone()方法是先在内存中开辟一块和原始对象一样的空间,然后原样拷贝原始对象中的内容。对基本数据类型,这样的操作是没有问题的,但对非基本类型变量,我们知道它们保存的仅仅是对象的引用,这也导致clone后的非基本类型变量和原始对象中相应的变量指向的是同一个对象。


深度clone: 例如,有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动(包括基本类型和非基本类型)都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。


实现深度clone,一般来说只要对要clone的对象中的所有非基本类型的对象也实现Cloneable接口,重载clone()方法。
但是,不是所有的类都能实现深度clone的。例如,要clone类中的某个类型变量是StringBuffer类型,StringBuffer没有重载clone()方法,它StringBuffer还是一个final类,这也是说我们也不能用继承的办法间接实现StringBuffer的clone。如果一个类中包含有StringBuffer类型对象或和StringBuffer相似类的对象,只有两种选择:要么只能实现影子clone,要么就在要克隆类的clone()方法中加一句(假设是SringBuffer对象,而且变量名是strBuf:

o.strBuf = new StringBuffer(strBuf.toString()); 

 

另外,除了基本数据类型能自动实现深度clone以外,String对象是一个例外,它clone后的表现好象也实现了深度clone,虽然这只是一个假象。

 

Anddy 2010-05-05
我在楼上的基础上补充一点,

说说clone()这个方法的真正原理:Object对象中的clone()方法是将内存中的对象以二进制的方式进行拷贝,重新分配了一个内存区。由于这个复制方式,导致clone出新的对象过程中并没有执行构造函数。
String没有实现clone方法,主要原因在于“虚拟机中的字符池”的影响。
zcmerjade 2010-06-29
告诉你一个简单的方法,将要类实现序列化,读出来的就是深克隆的了。
mohunter12 2010-07-05
深度克隆得到新的对象。
Global site tag (gtag.js) - Google Analytics