A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 长沙-小知姐姐 黑马粉丝团   /  2018-12-28 16:05  /  1222 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 长沙-小知姐姐 于 2019-1-3 09:27 编辑




实现克隆的步骤:

(1)实现Cloneable接口,Cloneable没有任何抽象方法,称为标志接口。

(2)覆盖基类 的clone方法,并声明为public

(3)在派生类中重写clone方法,并调用super.clone() 在clone中分为浅拷贝和深拷贝,浅拷贝就是不管参数是基本类型还是引用类型,直接调用super.clone()进行拷贝,结果引用类型还是指向相同的内存;深拷贝就是在调用super.clone()之后,还要调用引用参数的clone()函数,进行拷贝,来达到深拷贝。

浅拷贝:

(1) 基本的数据类型(String)是会拷贝复制一份新的对象


(2)引用对象还是引用同一份对象。
屏幕快照 2018-12-28 下午4.02.25.png
屏幕快照 2018-12-28 下午4.02.56.png

最后的结果是:
屏幕快照 2018-12-28 下午4.03.35.png
person1和person2的基本类型name和age都改变了,但引用类型的idnumber数值没变。

深拷贝:
(1)对存在的引用类型也进行拷贝,浅拷贝与深拷贝的代码还是有不同点的。
屏幕快照 2018-12-28 下午4.04.13.png
屏幕快照 2018-12-28 下午4.04.39.png


最后的结果是:
屏幕快照 2018-12-28 下午4.05.26.png

所有的值都进行了改变。
总结:
需要分析清楚是要拷贝还是克隆: copy:Person p2=p1;此时只是简单的copy了一下引用,p1和p2都指向了内存中的同一个对象,修改p1和p2中任何一个都会影响到对方。当函数的参数是对象时,传递的是引用类型,在对象函数内部的操作会影响到外边对象。

clone:克隆出来的对象,当被修改的时候不影响源对象


什么时候使用shallow Clone(浅拷贝,影子拷贝),什么时候使用deep Clone(深拷贝):主要看具体域对象的性质是什么,如果是基本类型使用shallow Clone,如果是reference variable(引用变量)使用deep Clone。




1 个回复

倒序浏览
看一看。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马