浅拷贝与深拷贝java(Java中浅拷贝和深拷贝的区别)

问题背景

日常工作中,我们经常使用对象的clone一个对象,那么clone有几种呢?或者说什么是浅拷贝和深拷贝,他们有什么区别?

浅拷贝定义

在拷贝一个对象时,对对象的基本数据类型的成员变量进行拷贝,但对引用类型的成员变量只进行引用的传递,并没有创建一个新的对象,当对引用类型的内容修改会影响被拷贝的对象。简而言之:浅拷贝仅仅复制所拷贝的对象,而不复制它所引用的对象。

浅拷贝Demo
  1. 先定义一个Car类,具有name属性

浅拷贝与深拷贝java(Java中浅拷贝和深拷贝的区别)(1)

  1. 定义一个Boy类,具有name和Car两个属性

浅拷贝与深拷贝java(Java中浅拷贝和深拷贝的区别)(2)

  1. 开始测试

浅拷贝与深拷贝java(Java中浅拷贝和深拷贝的区别)(3)

  1. 测试结果

拷贝得到的新的Boy对象,持有和原来的对象同一个Car对象,即浅拷贝仅仅复制所拷贝的对象,而不复制它所引用的对象。

深拷贝定义

在拷贝一个对象时,除了对基本数据类型的成员变量进行拷贝,对引用类型的成员变量进行拷贝时,创建一个新的对象来保存引用类型的成员变量。简而言之:深拷贝把要复制的对象所引用的对象都复制了一遍。

深拷贝Demo

修改浅拷贝demo中的Boy类的clone方法如下,其他代码保持不变。

浅拷贝与深拷贝java(Java中浅拷贝和深拷贝的区别)(4)

测试结果如下:

浅拷贝与深拷贝java(Java中浅拷贝和深拷贝的区别)(5)

Clone得到Boy对象和他引用的Car对象,都不是原来的对象了。

总结

java中clone方法是一个浅拷贝,引用类型依然在传递引用。我们可以通过继续调用clone()方法,对该对象的引用类型变量再实现一次clone()的方法来实现深克隆。当然,也可以通过序列化该对象,然后反序列化回来,就能得到一个全新的对象的方式来实现深克隆。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页