关于最新版本的Java新版13水棋棋牌室13水全套棋牌源码下载超级MAN。,只是为了创建与已知对象相同的对象。在日常编码中,它可能用得不多,但这是面试官经常问的问题,理解深拷贝和浅拷贝的原理将导致对什么是更深入的理解调用Java中的值传递或引用传递。
回到顶峰
创建对象的1, 5种方法。
通过新关键词
这是通过用新的关键字调用类的参数化或非参数构造函数来创建对象的最常见的方法。例如,对象Obj=新对象();
(2)传递类类的NeWistSistar()方法。
默认是通过调用类的无参数方法创建对象。
第三,传递构造函数类的NeWistSee方法。
这是通过与第二种方法类比来实现的。对象是通过Java的NeWistSistar()方法指定构造函数来创建的。兰格。构造函数类。
人P3=(人)人.Cyr.GETFrimultor(){ 0 }。
事实上,第二种方法使用类的NeWistSistar()方法来创建对象,其内部调用是构造函数的NeWist立场()方法。
(4)采用克隆法
克隆是对象类中的一种方法。通过使用对象A.clone()方法,可以创建内容与对象A.Clone克隆的内容相同的对象B,正如名称所示,克隆克隆创建了一个相同的对象。
P4=(人)P3克隆();
反序列化
序列化是Java对象数据在堆内存中的存储,在某种程度上,对象被存储在磁盘文件中或传递到其他网络节点(通过网络传输)。反序列化是将磁盘文件或网络节点中的对象数据恢复到Java对象模型的过程。
如何实现它可以参考我的博客。
回到顶峰
3、克隆方法
在这个博客中,我们通过调用对象类的克隆()方法来讨论Java的深度和浅拷贝。在Objist.C类类中,源代码是:
受保护的本机对象克隆()抛出C克隆NoeToReTestExpTebug;
这是用原生关键字来装饰的一种方式。有一个关于本地关键词的博客。你不懂也没关系。只需知道用原生关键字来装潢的方法是告诉操作系统,我不执行它,让操作系统做它。我们不需要确切地知道如何实现它,我们只需要知道克隆方法是用来复制对象和产生一个新的对象。新对象与原始对象之间的关系是什么
回到顶峰
4。基本类型和引用类型
在这里,我们将推广一个概念,即Java中的基本类型和引用类型之间的区别。
在爪哇中,数据类型可分为两类:基本类型和引用类型。
基本类型,也称为值类型,包括字符类型char、布尔类型和数字类型byte、.、int、long、float、double。
引用类型包括类、接口、数组、枚举等。
Java将内存空间划分为堆和堆栈。基类型将值直接存储在堆栈上,而引用类型在堆栈上存储引用,并且实际存储的值在堆栈上,指向堆栈中的引用存储在堆栈中的数据。
U3000和U3000
上面定义的值a和B是原语类型,直接存储在堆栈上;而C和D是由String声明的,String是引用类型,其引用地址存储在堆栈上,然后指向堆的内存空间。
下面的d=c;该语句指示对C的引用被分配给d,然后C和D指向相同的堆内存空间。
回到顶峰
5。浅拷贝
让我们看看下面的代码:
查看代码
查看代码
这是我们要分配的基本类Person。接下来,我们生成一个Person对象,并调用它的克隆方法来复制一个新对象。
注意:要调用对象的克隆方法,必须使类实现可克隆接口并重写克隆方法。
测试:
查看代码
打印结果为:
U3000和U3000
原始类人实现可克隆接口并重写克隆方法。它还有三个属性,一个由引用类型String定义的pname,一个由引用类型int定义的页面,和一个引用类型Address,它是一个自定义类,还包含两个属性pprovices和CITy。
然后查看测试内容,首先创建一个Person类对象p1,它的pname是Zhangngsan,第21页,地址类Address为湖北省和武汉市两个属性,然后调用clone()方法复制另一个对象P2,然后打印这两个对象的内容。
从第一行和第三行打印结果:
P1:COM.YES.Test.Nave39319F9
P2:COM.YES.Test.Heave258E466
可以看出,这是两个不同的对象。
从打印在第5行和第6行的对象的内容中,原始对象P1和克隆对象P2是相同的。
在代码中,我们刚刚将克隆对象P2的属性Address更改为湖北省荆州市(原始对象P1是湖北省武汉市),但是从第7和第8行的打印结果中,对原始对象P1和克隆对象P2都进行了修改。
也就是说,对象Person的属性Address在克隆之后,实际上只是其引用的副本,它们指向相同的堆内存空间,当修改一个对象的属性Address时,另一个对象将改变。
U3000和U3000
浅拷贝:创建一个新对象,然后将当前对象的非静态字段复制到新对象,如果字段是值类型,则复制字段,如果字段是引用类型,则复制引用而不是引用对象。相同的对象。
回到顶峰
6,深度拷贝
有了清晰的拷贝,深拷贝很容易理解。
深拷贝:创建一个新对象,然后将当前对象的非静态字段复制到新对象,而不管该字段是值类型还是引用类型,然后复制一个单独的副本。当您修改一个对象的任何内容时,它不会影响另一个对象的内容。
U3000和U3000
那么我们如何实现深度复制呢对象类提供的克隆只是一个浅拷贝。
回到顶峰
7,如何实现深度复制
深度复制的原理是原始对象和克隆对象的引用类型属性不指向相同的堆内存。有三种方法可以做到这一点。
让我们重写每个引用类型属性内的克隆()方法。
由于引用类型不能实现深拷贝,所以我们将每个引用类型划分为用于浅拷贝的基本类型。重写地址类内的克隆方法。
Address.class:
查看代码
类的克隆()方法:
查看代码
如前所述,我们将发现P2对象的Address属性已经更改,P1对象的Address属性没有更改。
但是这种方法有一个缺点。这里我们只有一个用于Person类的Address引用类型,而不是用于Address类,因此我们只是重写用于Address类的clone方法,但是如果Address类也有一个引用类型,那么我们将重写它的clone方法,然后重写多个Reference类型,执行多少次我们必须重写它们吗如果有许多引用类型,代码的数量显然很大,因此这种方法是不合适的。
第二,使用序列化。
序列化将对象写入流以便于传输,而反序列化将对象从流中读出。对象,然后通过反序列化得到对象。
注意,需要序列化的每个类都实现Serializable接口,如果属性不需要序列化,则可以将其声明为暂时的,而不将其从克隆属性中排除。
查看代码
因为序列化生成两个完全独立的对象,所以不管嵌套了多少引用类型,序列化都实现深度复制。
原文地址:https://www.cnblogs.com/h5qipaiyuanma/p/9780185.html