深拷贝和浅拷贝及实现

什么是浅拷贝和深拷贝

首先需要明白,浅拷贝和深拷贝都是针对一个已有对象的操作。那先来看看浅拷贝和深拷贝的概念。

在 Java 中,除了基本数据类型(元类型)之外,还存在 类的实例对象 这个引用数据类型。而一般使用 『 = 』号做赋值操作的时候。对于基本数据类型,实际上是拷贝的它的值,但是对于对象而言,其实赋值的只是这个对象的引用,将原对象的引用传递过去,他们实际上还是指向的同一个对象。

而浅拷贝和深拷贝就是在这个基础之上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行了引用的传递,而没有真实的创建一个新的对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,则认为是深拷贝。

所以到现在,就应该了解了,所谓的浅拷贝和深拷贝,只是在拷贝对象的时候,对 类的实例对象 这种引用数据类型的不同操作而已。

总结来说:

1、浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。

/clone-qian.png

2、深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。

/clone-深.png

浅拷贝(clone)

先来看看浅拷贝的例子。

扫描二维码关注公众号,回复: 3117243 查看本文章

首先创建一个 class 为 FatherClass ,对其实现 Cloneable 接口,并且重写 clone() 方法。

/clone-father01.png

然后先正常 new 一个 FatherClass 对象,再使用 clone() 方法创建一个新的对象。

/clone-Demo1.png

最后看看输出的 Log :

I/cxmyDev: fatherA == fatherB : false
I/cxmyDev: fatherA hash : 560973324 I/cxmyDev: fatherB hash : 560938740 I/cxmyDev: fatherA name : 张三 I/cxmyDev: fatherB name : 张三

可以看到,使用 clone() 方法,从 == 和 hashCode 的不同可以看出,clone() 方法实则是真的创建了一个新的对象。

但这只是一次浅拷贝的操作。

来验证这一点,继续看下去,在 FatherClass 中,还有一个 ChildClass 的对象 child ,clone() 方法是否也可以正常复制它呢?改写一个上面的 Demo。

/clone-Demo2.png

看到,这里将其内的 child 进行负责,用起来看看输出的 Log 效果。

I/cxmyDev: fatherA == fatherB : false
I/cxmyDev: fatherA hash : 560975188 I/cxmyDev: fatherB hash : 560872384 I/cxmyDev: fatherA name : 张三 I/cxmyDev: fatherB name : 张三 I/cxmyDev: ================== I/cxmyDev: A.child == B.child : true I/cxmyDev: fatherA.child hash : 560891436 I/cxmyDev: fatherB.child hash : 560891436

从最后对 child 的输出可以看到,A 和 B 的 child 对象,实际上还是指向了统一个对象,只对对它的引用进行了传递。

猜你喜欢

转载自www.cnblogs.com/twoheads/p/9620621.html