java深拷贝和浅拷贝介绍

浅拷贝概念

 

 

深拷贝概念

@Data
@Slf4j
public class Sheep implements Cloneable {private String name;private int age;private String color;private Sheep friend;public Sheep(String name, int age, String color) {this.name = name;this.age = age;this.color = color;}@Overrideprotected Object clone(){Sheep sheep = null;try {sheep = (Sheep) super.clone();} catch (Exception e) {log.info("" + e);}return sheep;}
}

@Data
public class DeepPrptoType implements Serializable, Cloneable {private static final long serialVersionUID = 1L;private String name;private DeepCloneableTarget deepCloneableTarget;public DeepPrptoType() {}//深拷贝方式1 使用clone方法@Overrideprotected Object clone() throws CloneNotSupportedException {Object deep = null;//这里对基本数据类型和String对克隆deep = super.clone();DeepPrptoType deepPrptoType = (DeepPrptoType) deep;deepPrptoType.deepCloneableTarget = (DeepCloneableTarget) deepCloneableTarget.clone();return deepPrptoType;}//深拷贝,方式2 通过对象的序列化实现(推荐使用)public static <T extends Serializable> T deepClone(T obj) {T cloneObj = null;try {//写入字节流ByteArrayOutputStream out = new ByteArrayOutputStream();ObjectOutputStream obs = new ObjectOutputStream(out);obs.writeObject(obj);obs.close();//分配内存,写入原始对象,生成新对象ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());ObjectInputStream ois = new ObjectInputStream(ios);//返回生成的新对象cloneObj = (T) ois.readObject();ois.close();} catch (Exception e) {e.printStackTrace();}return cloneObj;}
}

public class Client2 {public static void main(String[] args) throws CloneNotSupportedException {DeepPrptoType p = new DeepPrptoType();p.setName("深拷贝");p.setDeepCloneableTarget(new DeepCloneableTarget("大牛", "哈哈"));//方式一:深拷贝DeepPrptoType p2 = (DeepPrptoType) p.clone();System.out.println(p.getName() + p.getDeepCloneableTarget().hashCode());System.out.println(p2.getName() + p2.getDeepCloneableTarget().hashCode());//通过序列化和反序列化实现深拷贝,说明引用类型所指向的对象也被clone了DeepPrptoType p3 = DeepPrptoType.deepClone(p);System.out.println(p3.getName() + p3.getDeepCloneableTarget().hashCode());}
}

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

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

相关文章

给学Java的大学生们分享一些经验

想来学习Java也有两个年头了&#xff0c;永远不敢说多么精通&#xff0c;但也想谈谈自己的感受&#xff0c;写给软件学院的同仁们&#xff0c;帮助大家在技术的道路上少一点弯路。说得伟大一点是希望大家为软件学院争气&#xff0c;其实最主要的还是大家自身的进步提升—— 1&a…

利用福禄克DSX系列测试仪部署MPTL模块化插头端接链路

在与客户合作时&#xff0c;认识到MPTL&#xff08;模块化插头端接链路&#xff09;比使用传统插座、面板和设备跳线更适合连接设备的地方非常重要。如果您要部署这种&#xff0c;福禄克网络指定经销商—明辰智航的工程师会在测试时介绍给您。 如果您与零售场所、教育场所和酒…

访问数据库_Lua 数据库访问

Lua 数据库访问本文主要为大家介绍 Lua 数据库的操作库&#xff1a;LuaSQL。他是开源的&#xff0c;支持的数据库有&#xff1a;ODBC, ADO, Oracle, MySQL, SQLite 和 PostgreSQL。本文为大家介绍MySQL的数据库连接。LuaSQL 可以使用 LuaRocks 来安装可以根据需要安装你需要的数…

OkHttp 3.x 源码解析之Interceptor 拦截器

拦截器 Java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码&#xff0c;也可以在一个action执行前阻止其执行&#xff0c;同时也提供了一种可以提取action中可重用部分的方式。 在AOP&#xff08;Aspect-Orient…

cwntos新建目录挂载磁盘_详解Linux磁盘挂载、分区、扩容操作的实现方法

概述今天主要分享下关于Linux磁盘挂载、分区、扩容操作的实现方法&#xff0c;先介绍下基本概念1、磁盘在Linux系统中所有的设备都会以文件的形式存储。设备一般保存在/dev目录下面&#xff0c;以sda、sda1、sda2 …,sdb、sdb1…,hda,hdb。现在的设备一般都是sd命名&#xff0c…

【翻译】WF从入门到精通(第六章):加载和卸载实例

上一篇&#xff1a;【翻译】WF从入门到精通&#xff08;第五章&#xff09;&#xff1a;workflow跟踪学习完本章&#xff0c;你将掌握&#xff1a; 1.理解工作流实例为什么要卸载和重新加载及其时机 2.理解工作流实例为什么要持久化及其时机 3.搭建SQL Server 2005&am…

python人脸照片分类_Python OpenCV 人脸识别(一)

前面介绍了Numpy模块&#xff0c;下面再介绍一个OpenCV模块&#xff0c;就基于这两个库看一下当下很火的人工智能是如何实现的&#xff0c;我们介绍几个&#xff1a;人脸识别(当下非常火的)、音视频操作等等。今天先介绍一下静态图片的人脸识别&#xff0c;后面再介绍动态视频以…

JAVA视频教程

http://www.icoolxue.com/album/show/38 因为需要对接接口&#xff0c;所以需要学服务器的语言&#xff0c;java&#xff0c;新的旅程开始转载于:https://www.cnblogs.com/chuangyiyuan/p/7118551.html

万兆以太网测试仪应该具备什么功能

在以太网技术中&#xff0c;100BaseT是一个里程碑&#xff0c;确立了以太网技术在商业用途的统治地位。千兆以太网以及随后出现的万兆以太网标准是两个比较重要的标准&#xff0c;以太网技术通过这两个标准从商业用途的局域网技术延伸到校园网以及城域网的汇聚和骨干。 以太网…

网络技术术语英汉对照

1. ADSL (Asymmetric Digital Subscriber Line) 非对称数字环路 2. ANSI (American National Standard Institute) 美国国家标准协会 3. APIPA (Automatic Private IP Addressing) 自动私有IP寻址 4. AppleTalk 由Apple公司推出的一种多层协议,一种可路由协议组 5. ARP (Addres…

利用photoshop制作gif图片

首先准备你需要的几张素材图片 1.将素材图片根据发生的顺序放置在不同的图层 2.打开窗口下的时间轴 选择帧动画 3.创建第一张帧动画 选项卡右边这个按钮&#xff0c;点击这个选择新建帧 第一张图片显示其他的隐藏 就是图层那儿左边的眼睛 4.创建第二章帧 新建帧--点击第二个图层…

合同相似可逆等价矩阵的关系及性质_线性代数预习自学笔记-11:等价性与相似性...

上一篇&#xff1a;线性代数预习自学笔记-10&#xff1a;线性变换一、相似矩阵根据矩阵表示定理&#xff0c;我们知道任意向量空间上的任意线性变换都可以用一个相应的矩阵表示&#xff1b;但一个棘手的问题是&#xff0c;在应用这个定理时&#xff0c;我们不可避免地需要先知道…

光纤铜缆测试安装的基础知识你都了解了吗?

福禄克经销商—明辰智航走访了多名读者&#xff0c;发现他们都说自己精通测试系统设计、安装和测试&#xff0c;但是很多行业的新标准新要求却是很懵懂。所以&#xff0c;了解当前较新的性能参数&#xff0c;系统必须满足的各种标准和要求以支持新的应用&#xff0c;确保为客户…

我看windows mobile数据同步方案

距离上篇博客似乎又过了一段日子了&#xff0c;这段日子应该算是挣扎着过来的&#xff0c;从寻找同步错误的过程到使用新的解决方案&#xff0c;总共花了近3个星期&#xff0c;我想自己有必要总结下这次的经历。项目是使用C#VS2008开发的&#xff0c;客户端数据存储采用SQL SER…

php获取当前时间戳方法

简介 php获取时间是件很容易的事情,下面小编就过来简单的分享一下个人所学php的一些经验吧; 操作方法 1、获取当前时间方法date() 很简单&#xff0c;这就是获取时间的方法&#xff0c;格式为&#xff1a;date($format, $timestamp)&#xff0c;format为格式、timestamp为时间戳…

不禁网页的浏览器_网页游戏兴衰史:「农场」没有菜,「渣渣辉」不贪玩

本文经授权转载自 | 国家人文历史ID |gjrwls作者 |巴里安200X年某月某日凌晨2点50&#xff0c;小明悄悄打开房门&#xff0c;蹑手蹑脚地走进存放笔记本电脑的房间&#xff0c;将拔下电源的电脑抱紧在怀里&#xff0c;悄悄地回了房间。一进房&#xff0c;小明兴奋地打开电脑&…

Java策略模式demo(打折策略例子)

策略模式&#xff1a;它定义了算法家族&#xff0c;分别封装起来&#xff0c;让它们之间可以相互替换。此模式让算法的改变&#xff0c;不会影响到使用算法的客户端。 它对一系列的算法进行封装&#xff0c;为所有的算法定义一个抽象的接口&#xff0c;并通过继承该抽象算法接…

允許Linux的snmp服務被查詢

一、Linux&#xff08;RedHat&#xff09;的配置打开默认的/etc/snmp/snmpd.conf文件,更改如下配置:1、查找以下字段&#xff1a;[Copy to clipboard] [ - ]CODE:# sec.name source communitycom2sec notConfigUser default public将"comunity&quo…

综合布线中所需要的的带宽和数据速率

术语带宽和数据速率通常可以互换使用&#xff0c;但如果您在布线领域工作&#xff0c;它们实际上是非常不同的。 您的internet提供商可能会公布每秒500兆比特&#xff08;Mbps&#xff09;的带宽。在这种情况下&#xff0c;它们实际上是指数据速率。在布线领域&#xff0c;带宽…