java对象复制_Java对象的复制三种方式

Java对象的复制三种方式

概述

在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。例如下面程序展示的情况:

bd48740b69ba7d84783d11a72cd1016e.png

结果:

831c28763299a93e6a9416eef4f85b3e.png

为什么改变学生2的学号,学生1的学号也发生了变化呢?

原因出在(stu2 = stu1) 这一句。该语句的作用是将stu1的引用赋值给stu2,

这样,stu1和stu2指向内存堆中同一个对象。如图:

2017e977b6a97856e51c66f1d9cbed76.png

那么,怎么能干干净净清清楚楚地复制一个对象呢。在 Java语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求有很多途径,

(1)将A对象的值分别通过set方法加入B对象中;

(2)通过重写java.lang.Object类中的方法clone();

(3)通过org.apache.commons中的工具类BeanUtils和PropertyUtils进行对象复制;

(4)通过序列化实现对象的复制。

2.将A对象的值分别通过set方法加入B对象中

对属性逐个赋值,本实例为了演示简单就设置了一个属性:

5662878de832c2998daf0bbd1db970e0.png

我们发现,属性少对属性逐个赋值还挺方便,但是属性多时,就需要一直get、set了,非常麻烦。

3.重写java.lang.Object类中的方法clone()

先介绍一下两种不同的克隆方法,浅克隆(ShallowClone)和深克隆(DeepClone)。

在Java语言中,数据类型分为值类型(基本数据类型)和引用类型,值类型包括int、double、byte、boolean、char等简单数据类型,引用类型包括类、接口、数组等复杂类型。浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制,下面将对两者进行详细介绍。

3.1浅克隆

一般步骤:

1.被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常), 该接口为标记接口(不含任何方法)

2.覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象。(native为本地方法)

ec261c5c475e6247c0a84e641869b05e.png

ede1b4b1ed63c41f8735fe00e8d476de.png

在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。

简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。

f06f2279a27f0c07fe1583d1d562b603.png

在Java语言中,通过覆盖Object类的clone()方法可以实现浅克隆

3.2深克隆

f7d7365fccedc0178f2cd57b3c79f994.png

4d757a10137decfe3d836842bcded1d8.png

e410a69c75a82c17b4e9870611730318.png

怎么两个学生的地址都改变了?

原因是浅复制只是复制了addr变量的引用,并没有真正的开辟另一块空间,将值复制后再将引用返回给新对象。

为了达到真正的复制对象,而不是纯粹引用复制。我们需要将Address类可复制化,并且修改clone方法,完整代码如下:

0ec4a01b26234411cd94c333c23b1f8b.png

9449c1a238c7cd42c66eea7fcdf681c5.png

1ecd3230f2f429e74d8ece89362273f3.png在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。

简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制。

d7200d03eb6e1fc50a10e8e94ea5c04a.png

在Java语言中,如果需要实现深克隆,可以通过覆盖Object类的clone()方法实现,也可以通过序列化(Serialization)等方式来实现。

(如果引用类型里面还包含很多引用类型,或者内层引用类型的类里面又包含引用类型,使用clone方法就会很麻烦。这时我们可以用序列化的方式来实现对象的深克隆。)

4.工具类BeanUtils和PropertyUtils进行对象复制

701b782f8bbdb033a73661ea034dceda.png

这种写法无论多少种属性都只需要一行代码搞定,很方便吧!除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与BeanUtils的同名方法十分相似,主要的区别在于BeanUtils提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而PropertyUtils不支持这个功能,但是速度会更快一些。在实际开发中,BeanUtils使用更普遍一点,犯错的风险更低一点。

5.通过序列化实现对象的复制

序列化就是将对象写到流的过程,写到流中的对象是原有对象的一个拷贝,而原对象仍然存在于内存中。通过序列化实现的拷贝不仅可以复制对象本身,而且可以复制其引用的成员对象,因此通过序列化将对象写到一个流中,再从流里将其读出来,可以实现深克隆。需要注意的是能够实现序列化的对象其类必须实现Serializable接口,否则无法实现序列化操作。

b85b515656b31ac99a826f0366771e7a.png

926d96356b3a6d778d7514ed51157c93.png

b51d6e04e34d3fd7c30f95d886ce62d1.png

调用ByteArrayOutputStream或ByteArrayInputStream对象的close方法没有任何意义。这两个基于内存的流只要垃圾收集器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放。

dc6cc21d54522beb05c38d826c1fc488.png

修改克隆的Person对象person1关联的汽车对象的品牌属性,原来的Person对象person关联的汽车不会受到任何影响,因为在克隆Person对象时其关联的汽车对象也被克隆了。

基于序列化和反序列化实现的克隆不仅仅时深度克隆,更重要的是通过范型限定,可以检查出要克隆的对象是否支持序列化,这项检查是编译期完成的,不是在运行时抛出异常,这种方案明显优于使用Object类的clone方法克隆对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新年快乐

同时两个朋友发来的,打开了还挺有意思。在新年到来的最后一天,收到这个小小的礼物还是很高兴,说明人家还记得你,常说君子之交淡如水,水其实我们不缺,我们往往缺的就是一句小小的问候,并且在一个…

看徐坤的话剧《性情男女》

昨晚应邀去看了徐坤的话剧《性情男女》,说实在话好的超乎了我的想象。这几年话剧多被国外经典剧目或者历史剧或者老剧目统治,现实题材的话剧少之又少,而我想看的更几乎为零。所以这个剧确实应该让我拍手。我们这些饱经沧桑的人、老油条或者麻…

java 字符串子串_java实现字符串匹配求两个字符串的最大公共子串

本文实例讲述了java实现求两个字符串最大公共子串的方法。分享给大家供大家参考,具体如下:最近在项目工作中有一个关于文本对比的需求,经过这段时间的学习,总结了这篇博客内容:求两个字符串的最大公共子串。算法思想&a…

读《伤心至死》兼谈恐怖悬疑小说的写作问题

收到鬼古女寄来的最新小说《伤心至死万劫》,这是他第三部长篇,上海人民出版社2005年10月出版,也是他《伤心至死》悬疑系列的第一部。我和鬼古女只在网上有过交流,据说这是一对旅居美国的神秘夫妇的笔名。我喜欢他的小说&#xff0…

java继承的举例_java继承实例

实例需求:实现一个名为Person的类和它的子类Employee,Manager是Employee的子类,设计一 个类Add()用于涨工资,普通员工一次能涨10%,经理能涨20%。具体要求如下:(1)Person类中的属性有:姓名name String(类型)…

与狼共舞的女钢琴家

刚看了法国传奇女钢琴家埃莱娜格里莫的自传《野变奏》(上海教育出版社出版),很精彩。我有幸收藏到她几张原版的唱片,经常会拿出来听听。她是我喜欢的哈斯基尔、阿格里奇和皮雷斯等女钢琴家之后,我所知道的最年轻的女钢…

究竟谁在买书??

今天和孩子去美术馆附近的百花美术商店买绘画用品&#xff0c;顺便到了三联奋图书中心。<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />几年来&#xff0c;我对去书店是非常矛盾的。读点书的人&#xff0c;不去书店淘书显然有愧…

java 使用string_java中string怎么使用

展开全部以下是关于string的七种用法&#xff0c;注意哦&#xff0c;记得要时常去查看java的API文档&#xff0c;那个里面也有很详细32313133353236313431303231363533e78988e69d8331333363393033的介绍1>获取1.1&#xff1a;字符串中包含的字符数&#xff0c;也就是字符串的…

情人节的第一道小点心

情人节“蕉叶”泰国餐厅的第一道小点心&#xff0c;用芭蕉叶包的西米露甜点&#xff0c;乍看像两个蜡烛&#xff0c;一黄一白&#xff0c;细看又似两个人的皮肤&#xff0c;一深一淡。绵软、清凉&#xff0c;入口即融&#xff0c;妙不必言。

与孩子去航空博物馆

北京航空博物馆草地广场——主题&#xff1a;四面楚歌&#xff0c;草木皆兵&#xff0c;红装小女&#xff0c;信步闲庭。航空博物馆的一个角落——主题&#xff1a;灰色里的一点红&#xff0c;肃杀中的一抹暖意

java 操作序列_JAVA序列化操作详解

一、概述很多时候我们需要将对象的信息以文件的形式存储到硬盘上以便以后可以恢复使用。我们可以按照一定的格式将变量的值依次写到特定格式的文件中。但有时候我们希望只有我们自己可以读懂它并且修改它&#xff0c;这就是序列化的作用。概念&#xff1a;将对象转化为字节序列…

为女儿示范的两张石膏像素描

26年没画了&#xff0c;为了给女儿学习石膏素描&#xff0c;示范一下&#xff0c;斗胆画了两张。材料&#xff1a;复印纸&#xff0c;4B铅笔&#xff0c;用时30分钟。这是一周前画的。材料&#xff1a;普通稿纸&#xff0c;2B铅笔&#xff0c;用时25分钟。用我当时少年宫美术老…

你好,弗朗索瓦丝·萨冈

“世界上只有两种东西最出名&#xff0c;新小说和萨冈。萨冈是个作家&#xff0c;是法国的通俗小说家&#xff0c;世界上所有的国家都翻译了她的作品。”“新小说”派的掌门人罗伯-格里耶如是说。格里耶肯定不喜欢萨冈&#xff0c;但是他所鼓吹的“新小说”绝对没有萨冈有名。一…

java中类与类的关系_Java中类与类的关系

在java中类和类的关系大致分三种&#xff1a;泛化、关联、依赖。1. 泛化(Generalization)"XX是一个XX"关系(is a),通常使用的关键词为 extends、implements继承:继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类&#xff0c;新的类能吸收已有类的数据…

徐坤用话剧震了我们一道

年前&#xff0c;徐坤为人艺小剧场写了个话剧《性情男女》&#xff0c;请几个朋友去看&#xff0c;要求是必须携夫人或者女朋友前往。我开始没明白她的用意&#xff0c;就带女朋友去了。剧场门口&#xff0c;徐坤穿着小红羽绒袄诡秘地迎接我们。 当我走进小剧场时&#xff0c;一…

《命犯桃花》离斯蒂芬·金还很遥远

期待已久的丁天的新书《命犯桃花》&#xff08;北方文艺出版社2006年2月&#xff09;终于出版了。在这之前他的2000年的旧作《脸》也刚刚修订再版。《脸》作为国内恐怖小说的开先河之作&#xff0c;在当时产生了很大的影响&#xff0c;甚至可以说影响了现在的一批恐怖小说作家。…

java spring redis_spring配置redis(xml+java方式)

条件&#xff1a;引用好架包org.springframework.dataspring-data-redis2.1.3.RELEASEredis.clientsjedis2.9.0一、使用xml进行配置1、创建xml文件2、使用&#xff1a;ApplicationContext applicationContext new ClassPathXmlApplicationContext("application.xml"…

我们需要什么样的恐怖小说?

斯蒂芬金漫画像 ——由台湾的两部有影响的恐怖小说谈起 台湾的恐怖悬疑类小说的发展比大陆早若干年&#xff0c;原本以为他们会写的好一些&#xff0c;可看了两本部曾被台湾书界追捧的恐怖小说&#xff0c;感觉非常失望。一本是《网络凶邻》&#xff08;作家出版社2006年2月出版…

男人是消耗品,女人是战利品?

读日本作家村上龙的随笔《所有的男人都是消耗品》&#xff08;上海译文出版社2006年2月出版&#xff09;,感觉颇有意趣。村上龙与另个村上&#xff08;春树&#xff09;几乎同龄&#xff0c;是日本战后经济高速发展时期成名的作家&#xff0c;在文坛并称“W村上”。两人虽是好友…