java clone克隆

浅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:

Java代码
o.strBuf = new StringBuffer(strBuf.toString());
o.strBuf = new StringBuffer(strBuf.toString());

另外,除了基本数据类型能自动实现深度clone以外,String对象是一个例外,它clone后的表现好象也实现了深度clone,虽然这只是一个假象。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值