在java程序语言中,最常用的拷贝操作主要有operator=、拷贝构造函数和clone()方法这三个。今天小编就主要带大家学习一下深拷贝以及浅拷贝相关的认识。浅拷贝与深拷贝都是两个比较通用的概念,尤其是在C++语言中,若弄不明白的话,就会在delete操作的时候出问题,但是我们在这幸好使用的是Java。那么我们现在就进入主题吧。
一、名词解释
首先小编先带大家来看一下,深拷贝(即深复制)以及浅拷贝(即浅复制)这两者的定义吧。
①深拷贝:对象,对象内部的引用都可以进行复制。通俗一点来说,不仅仅拷贝对象的本身,而且还可以拷贝对象包含的引用指向的所有对象。
②浅拷贝:只可以复制一个对象,对象内部存在的指向其他对象数组或者是引用则不复制。正正与深拷贝相反,它在拷贝对象的时候,仅仅只可以拷贝对象本身(也包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。
二、深入理解
好了,为了可以让大家更加深入的理解它们两者之间的区别。小编在这篇教程中,首先先假设有一个名字为A的对象。在这个A对象中,它包含这有两个对象,分别是对象A1以及对象A2。具体的关系图,可以参考下面的图像。如图所示:
①A对象在进行了深拷贝操作以后,在得到B对象的时候,同一时间,我们可以看到A1以及A2连同它们之间的引用也被拷贝过来了。这就是我们所说的深拷贝。如图所示:
②A对象进行了浅拷贝操作以后,在得到B对象的时候,我们可以看到与深拷贝操作有点不同,那就是对象A1以及A2都没有被拷贝过来。如图所示:
三、实现方法
相信经过小编的讲解以后,大家已经对浅拷贝与深拷贝有了一定的理解了吧。接下来,小编就带大家看一看究竟如何实现Java浅拷贝与深拷贝吧。具体的实现方法如下:
其实在java.lang.Object中的clone()方法,默认就是返回一个前拷贝的对象。所以说,假如我们真的要使用这个clone()方法来实现一个深拷贝操作的话,那么我们就一定要给每一个对象的clone()方法进行一个特别的实现。当对象的层次比较复杂的时候,这种做法,不但容易出现错误的现象和浪费时间而且还很困难才可以实现。特别就是在你不但要对这个对象进行浅拷贝操作,同一时间你还需要进行深拷贝操作的时候,那么你就会深刻的理解到编写这个clone()方法真的不是一个较为理想的解决方案。所以大家在写这个方法的时候,一定要慎重考虑哟!
那么有人会问,除了小编所说的clone()方法以外,还有什么好的方法可以实现咯?方法肯定是有的,那就是——序列化。序列化(Serialization)就是把对象的状态信息转换为可以存储或传输的形式的过程。它的实现思路以及步骤很简单,其实就是把要进行拷贝的对象输出成为byte array,然后我们只要再利用一下ObjectInputStream转换出一个新的对象就可以了。具体的代码,可以参考下图,如图所示:
小编结语:
大家通过教程可以看到,小编主要分了三个部分来简单介绍一下JAVA浅拷贝与深拷贝的知识点,那么你学会了吗?了解到它们之间有什么区别了吗?今天的编程语言教程就已经介绍完毕了,如果你还是与犹未尽,可以进入我们的官网课课家教育,了解更多的java入门教程。
¥498.00
¥399.00
¥29.00
¥299.00