一 概念:
以一个对象为原型,对其进行复制(克隆),产生一个和原对象类似的新对象,通过clone()实现。克隆可分为浅克隆和深克隆
1 浅复制(浅克隆)
复制出的新对象所有变量与原来对象有相同的值,而对其他对象的引用,任然指向原对象。Object 提供的clone()方法只是拷贝本对象,引用对象等都不管,还是指向原对象。
2 深复制(深克隆)
复制出的新对象的所有编码都含有与原对象相同的值,除了那些引用其他对象的变量,引用其他对象的变量,将指向被复制过的新对象,不再是原有的引用对象。
二 示例
2.1 浅克隆
人 实体类
医生类,重写clone方法
浅克隆测试方法
可以看到,改变了doctor2(新克隆出来对象)引用的person的名字,原对象doctor引用的person的名字也改变了。说明doctor2引用的person还是doctor 引用的person。
2.2 普通的深度克隆
人 实体类 继承Cloneable接口
医生类,重写clone()方法
可以看到clone()方法内,第一行是浅克隆医生,但此时医生所引用的person并没有被克隆,第二行代码才是克隆了person,
doctor本身和被它引用的对象都被浅克隆了,所以实现了深克隆。
测试方法
可以看到,改变了doctor2(新克隆出来对象)引用的person的名字,原对象doctor引用的person的名字并没有改变。说明doctor2引用的person不是doctor 引用的person。
2.3 使用二进制流序列化 深度克隆
人 实体类,继承序列化接口
使用二进制流序列化,深度克隆
测试方法
可以看到,改变了doctor2(新克隆出来对象)引用的person的名字,原对象doctor引用的person的名字并没有改变。说明doctor2引用的person不是doctor 引用的person。
总结:
普通的深度克隆,其实是多个浅克隆组合在一起,把当前对象浅克隆,把所有被引用的对象也都浅克隆,就实现了深克隆。
而使用二进制流序列化的方式深克隆,就比较彻底,继续了序列化接口的类,都可以被深度克隆。