JavaSE:Clonable接口、浅拷贝与深拷贝

1、引言

我们在学习的数组时,就了解到了数组克隆方法,可以通过数组克隆方法来拷贝一个一模一样的数组:

那对于自定义类型中有没有克隆方法呢?答案是有的!

就让这篇文章来帮助大家学习自定义类型的拷贝!

2、自定义类型的拷贝

我们首先自定义一个学生类:

我们已知,所有的类都继承于Object类,我们可以看到Object类中也实现了clone方法:

按理说,作为子类是可以使用继承下来的clone方法的,可是当我们去使用clone方法时却发现写不出来:

那我们该如何去实现自定义类型的拷贝呢?

1. 重写clone方法

为什么要重写clone方法呢?我们先来看Object类中的clone方法:

我们发现父类中方法的权限是protected,那我们就需要利用super关键字来调用父类的clone方法,所以我们重写clone方法:

这时我们发现我们已经可以写出了clone方法:

可是代码仍然报错,那是因为方法的返回值是Object类型:

2. 强制类型转换为子类类型

我们发现仍然报错,那是因为我们没有抛出异常。

3. 抛出异常

我们可以发现,在我们利用Idea快速重写了clone方法后,重写方法抛出了异常:

那我们也需要在main方法抛出异常:

我们这时发现,没有了报错,那我们来运行:

却出现了不支持克隆的异常,因为我们还差最后一步,实现Cloneable接口

4. 实现Clonable接口

当我们点进去查看这个接口时,我们发现什么方法都没有:

这表面,Cloneable是一个空接口

那有人就有疑问了:“什么都没有那空接口是来干嘛来了?”

答:空接口也叫做标记接口,表示当前类是可以被克隆的!!!

总结步骤:

1. 重写clone方法

2. 强制类型转换为子类类型

3. 抛出异常

4. 实现Clonable接口

在完成以上步骤后,我们就可以成功的拷贝出一个对象:

3、浅拷贝

当我们在自定义Student类中再定义一个自定义类的对象后,

我们再次进行拷贝,并修改拷贝的student2对象的moneyNum值,我们会发现,student1的moneyNum也被改变了:

这是因为,原有的student1和拷贝后的student2中的money引用指向的是同一个区域,只要一个改变,另外一个就会跟着改变,我们可以参考下图理解:

我们并没有把Money对象中的moneyNum也拷贝一份,

也就是说,我们只拷贝了Student对象,而没有拷贝Money对象,这样的拷贝称为浅拷贝!!!

那如何做到修改student2的moneyNum值而不影响student1中的moneyNum值呢?

答:那就需要完成深拷贝

4、深拷贝

其实完成深拷贝也是很简单的,我们只需要额外的完成对Money的拷贝就可以了

为了完成对自定义类型Money的拷贝,也需要根据上面讲到的步骤完成(在此不再列出细节):

然后,我们只需在Student类中重写的clone方法上做处理即可:

(我们将浅拷贝得到的tmp中Money对象也完成一份拷贝即可)

这时我们发现,修改student2的moneyNum值便不会影响到student1了,也就是说,我们成功的将Money对象也拷贝了一份,完成了深拷贝!!!

OK~本次博客到这里就结束了,

感谢大家的阅读~欢迎大家在评论区交流问题~

如果博客出现错误可以提在评论区~

创作不易,请大家多多支持~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony开发之MQTT讲解

相信MQTT这个名称大家都不陌生,物联网的开发必然会遇到MQTT相关知识的应用。那么什么是MQTT?它有什么特点?它能解决什么问题?它是如何工作的?OpenAtom OpenHarmony(以下简称“OpenHarmony”)的物…

10最佳iPhone数据恢复软件评论

您还在寻找最好的iPhone数据恢复软件吗? 似乎我们在iPhone上放置了越来越多与日常生活和工作有关的重要事情。照片可以保持珍贵的时刻,联系人可以保持联系,录音,备忘录和日历可以作为提醒,视频和歌曲可以娱乐&#xf…

基于Java的推箱子游戏设计与实现(论文 + 源码)

【免费】关于基于JAVA的推箱子游戏.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89325018 基于Java的推箱子游戏设计与实现 摘 要 社会在进步,人们生活质量也在日益提高。高强度的压力也接踵而来。社会中急需出现新的有效方式来缓解人们的压力。…

NDI入门教程二

一、移植到RK: 编译相关: ndi本身没有什么好移植编译的,本身提供的就是so库。但是ndi依赖其它第三方开源库: avahi; dbus; expat; libcap; libdameon。因为编译这些开源库的服务器也需要安装一些插件所以在自己虚拟机Ubuntu20.04…

notepad++ 批量转所有文件编码格式为UTF-8

1、安装notepad及PythonScript_3.0.18.0插件 建议两者都保持默认路径安装x64版本: 阿里云盘分享https://www.alipan.com/s/xVUDpY8v5QL安装好后如下图: 2、new Script,新建脚本,文件名为ConvertEncoding 3、自动打开脚本&#xff…

Jenkins 动态salve简单配置连接 EKS

安装Jenkins helm repo add jenkins https://charts.jenkins.io helm repo update # 当前版本 jenkins-5.1.18.tgz瘦身后的 values.yaml # grep -Ev ^\s*#|^$ values.yaml nameOverride: fullnameOverride: namespaceOverride: clusterZone: "cluster.local" kubern…

(Oracle)SQL优化基础(三):看懂执行计划顺序

往期内容: (Oracle)SQL优化基础(一):获取执行计划 (Oracle)SQL优化基础(二):统计信息 获取到执行计划后,对于新手朋友来讲可能不知道…

火箭升空AR虚拟三维仿真演示满足客户的多样化场景需求

在航空工业的协同研发领域,航空AR工业装配系统公司凭借前沿的AR增强现实技术,正引领一场革新。通过将虚拟信息无缝融入实际环境中,我们为工程师、设计师和技术专家提供了前所未有的共享和审查三维模型的能力,极大地提升了研发效率…

【华为】BFD与静态路由和RIP联用

【华为】BFD与静态路由和RIP联用 实验需求配置AR1AR2AR3AR4效果抓包查看 实验需求 如上图组网所示,在R1上配置到达R4的Loopback0。 4.4.4.4/32网段的浮动静态路由,正常情况下通过R3访问R4。 当R3故障时,自动选路通过R2访问R4的Loopback0;在R…

企业文件加密软件推荐:迅软DSE加密软件你用了吗?

一、挑选企业文件加密软件需考虑的因素? 1、安全性:软件应采用业界认可的强加密算法,以确保数据的安全性。 迅软特有的256位高强度加密算法,从根本上阻止一切破解的可能性。 2、易用性:软件应该易于部署和管理&…

如何停止 iPad 和 iPhone 之间共享短信,独立接收和发送消息

概括 在当今高度互联的数字世界中,Apple 设备之间的无缝连接性提供了极大的便利,尤其是在消息同步方面。iPhone 和 iPad 用户通常可以享受到设备间短信的自动同步功能,这意味着无论是在哪个设备上,用户都可以接收和回复消息。然而…

游戏联运的挑战与核心关键点

​游戏联运一个看似充满机遇与挑战的行业,吸引了很多创业者的加入。然而,真正踏入这个行业后,许多人会发现,手游代理并非想象中的那么简单。今天,溪谷软件就来和大家聊聊游戏联运是怎么做的,需要注意什么。…

react中的useEffect()的使用

useEffect()是react中的hook函数,作用是用于创建由渲染本身引起的操作,而不是事件的触发,比如Ajax请求,DOM的更改 首先useEffect()是个函数,接受两个参数,第一个参数是一个方法,第二个参数是数…

《计算机体系结构》期末考试复习笔记(一)试卷手写笔记(超重点)

一、MIPS 执行速率执行时间有效CPI【第1题】 二、Amdahl定律 - 性能加速比SP【第2题,第3题,第4题】 (百分比f 倍数r ) 三、哈夫曼编码 2-4扩展码【第5题】 四、互连函数【第9题】 就是每生成一个根节点, 就从小到大重新排…

后量子密码解决方案

什么是后量子密码学 (PQC),为什么准备工作如此重要? 量子计算正在迅速发展;用不了多久,量子网络攻击就会成为可能。量子网络攻击将能够在几分钟内瘫痪大型网络。我们今天赖以保护我们的连接和交易的一切都将受到量子计算机的威胁,危及所有密…

【618狂欢】五款必抢好物!爆款数码好物让你轻松get新潮流!

随着科技的飞速发展,数码产品已经成为我们生活中不可或缺的一部分。它们不仅为我们提供了便捷的生活体验,更成为了我们展示个性和追求潮流的重要载体。而在每年的618购物狂欢节,各大电商平台都会推出众多优惠活动,让我们有机会以更…

Linux——进程信号

目录 一、信号的理解 二、信号的种类 2.1 标准信号 (1-31) 2.2 实时信号 (通常是34及以上) 三、信号的产生 3.1 用户通过终端产生信号 3.1.1 signal 函数 3.1.2 demo 测试 3.1.3 demo 现象 3.2 通过系统函数产生信号 3.2.1 demo 测试 3.3 由软件条件产生信号 3.3.1…

访问列表元素

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中,如果想将列表的内容输出也比较简单,可以直接使用print()函数即可。例如,创建一个名称为untitle的列表…

JAVA开发 基础Jaccard来计算两个字符串之间的重复率

计算两个字符串之间的重复率 Jaccard实现代码基于最长公共子序列来计算两个字符串之间的重复率 Jaccard Jaccard方法,也称为Jaccard相似度或Jaccard相似系数,是一种用于衡量两个集合相似程度的指标。其逻辑基于集合之间的交集与并集的关系来衡量它们的相…

Linux bc命令(bc指令)(基本计算器)(任意精度计算语言:支持浮点数运算、变量赋值和自定义函数等)

文章目录 bc命令文档英文中文 Linux bc 命令详解bc 命令的基本用法启动 bc 环境进行基本计算退出 bc bc 中的数学功能执行高级数学计算平方根和指数函数对数函数 处理精度问题 变量和数组变量赋值和使用数组的使用 创建和使用自定义函数 bc 命令的高级用法在脚本中使用 bc基本脚…