日常工作中,我们经常使用对象的clone一个对象,那么clone有几种呢?或者说什么是浅拷贝和深拷贝,他们有什么区别?
浅拷贝定义在拷贝一个对象时,对对象的基本数据类型的成员变量进行拷贝,但对引用类型的成员变量只进行引用的传递,并没有创建一个新的对象,当对引用类型的内容修改会影响被拷贝的对象。简而言之:浅拷贝仅仅复制所拷贝的对象,而不复制它所引用的对象。
浅拷贝Demo- 先定义一个Car类,具有name属性
- 定义一个Boy类,具有name和Car两个属性
- 开始测试
- 测试结果
拷贝得到的新的Boy对象,持有和原来的对象同一个Car对象,即浅拷贝仅仅复制所拷贝的对象,而不复制它所引用的对象。
深拷贝定义在拷贝一个对象时,除了对基本数据类型的成员变量进行拷贝,对引用类型的成员变量进行拷贝时,创建一个新的对象来保存引用类型的成员变量。简而言之:深拷贝把要复制的对象所引用的对象都复制了一遍。
深拷贝Demo修改浅拷贝demo中的Boy类的clone方法如下,其他代码保持不变。
测试结果如下:
Clone得到Boy对象和他引用的Car对象,都不是原来的对象了。
总结java中clone方法是一个浅拷贝,引用类型依然在传递引用。我们可以通过继续调用clone()方法,对该对象的引用类型变量再实现一次clone()的方法来实现深克隆。当然,也可以通过序列化该对象,然后反序列化回来,就能得到一个全新的对象的方式来实现深克隆。
,