Java---Cloneable接口---浅克隆和深克隆

在Java中,我们如何实现一个对象的克隆呢?

在Java中实现对象的克隆,我们要用到Cloneable接口克隆也分为浅克隆和深克隆

1.实现浅克隆

1.重写clone方法

d7029197d72b4326a24eb326f8ff93d4.png

当我们想直接通过前面已经建立好的对象来调用Object类中的clone方法时,发现不行。因为Object类中的clone方法是被protected修饰的,只能在子类的内部调用。如下图

52f74750b2834c678556bf5425424031.png

所以我们要在Student类中重写Object类中的clone方法。 

 在Student类中重写了clone方法如下图所示

cc43cf3b6c3c4a758d16b445eea5bce3.png

重写之后,我们发现就能调用clone方法了。 

0e980672cdba4705a3427542dec92543.png

 

调用之后还会报错。

7c735760428c46a0a44c838c8ea8e978.png

 原因如下图

a4bf5a87cf764f66a2c25f26b54a796e.png

838c1819b1944936b5327213faeb054d.png

 

我们发现clone方法的返回值类型为Object类型,所以我们要进行强制类型转换。

d8fb0e29f78449c08a07c868bd8a1827.png

 

我们发现还会报出以下错 

b128956288d84cb691a05dcf6c7d2a2b.png

 解决方法

在main函数后加下图红色方框里面的字段。

b2f3b5ad4a65486eb92416387c74ff8c.png

到这一步浅克隆就完成了。

1.完整代码

class Student implements Cloneable{public String name;public int age;public Student(String name,int age){this.name=name;this.age=age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class Test {public static void main(String[] args)throws CloneNotSupportedException {Student student=new Student("张三",18);Student student1=(Student) student.clone();System.out.println(student);System.out.println(student1);}
}

运行代码

9331d21ff37a4861a68f421013d077e4.png

发现克隆成功了。

2.浅克隆堆栈图

b355d1dd62614391b1daddfa66568d9d.png

2.实现深克隆

先来看以下代码

class Money{double money=24;
}
class Student implements Cloneable{public String name;public int age;Money m=new Money();public Student(String name,int age){this.name=name;this.age=age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", money=" + m.money +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class Test {public static void main(String[] args)throws CloneNotSupportedException {Student student=new Student("张三",18);Student student1=(Student) student.clone();System.out.println(student);System.out.println(student1);student1.m.money=8;}
}

money一开始的值是24,但是我们将student1的money的值改变为8时,student的money的值也会变为24,因为上面代码只实现了浅克隆,没有实现深克隆。

上面的堆栈图如下

9ab29fb06c334a4286679084780b3924.png

由于m的值都是克隆过来的,所以两个引用都指向一个money,修改了一个money的值,自然会影响两个的m指向的值。

想解决这个问题,我们直接克隆一份money就行了。如下面的堆栈图所示。

81a0140356874b09acf3919ba7aae961.png

代码实现

class Money implements Cloneable{double money=24;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
class Student implements Cloneable{public String name;public int age;Money m=new Money();public Student(String name,int age){this.name=name;this.age=age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", money=" + m.money +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {Student tmp=(Student)super.clone();//克隆了Student里面的值tmp.m= (Money) this.m.clone();//克隆moneyreturn tmp;}
}
public class Test {public static void main(String[] args)throws CloneNotSupportedException {Student student=new Student("张三",18);Student student1=(Student) student.clone();System.out.println(student);System.out.println(student1);student1.m.money=8;System.out.println("修改student1的money的值后");System.out.println(student);System.out.println(student1);}
}

运行代码

b424d494f4974dee894e235505439e92.png

到这里深克隆就实现了。

3.总结

浅克隆克隆的是值,深克隆克隆的是引用。 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

解决mybatis/mybatis plus报错:Invalid bound statement (not found) 的方法汇总

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题,即在mybatis中dao接口与mapper配置文件在做映射绑定的时候接口与xml不匹配,要么是找不到,要么是找到了却匹配不到。 我的问题是项目没有把最新的方法x…

正版软件 | Internet Download Manager 下载管理器

前言 IDM 是一个下载加速器,可将下载速度提高多达 8 倍,恢复、组织和安排下载。 30 天免费试用!https://www.internetdownloadmanager.cc/ 新版本 Internet Download Manager v 6.40:添加了 Windows 11 兼容性。改进了媒体采集…

5G工厂长啥样

5G工厂是一种新型的工业互联网基础设施,利用5G为代表的新一代信息通信技术集成,打造新型工业互联网基础设施。在5G工厂中,自动化和智能化设备广泛使用,高度互联的工厂网络得以实现,远程监控和管理成为可能,…

系统测试需求指南(Word版-软件全套资料下载)

1 目的 2 概述 3 测试需求 3.1 测试范围 3.2 测试目标 4 测试需求的现状 5 测试需求的内容 5.1 主体内容 5.2 管理内容 6 测试需求的制定 6.1 需求信息来源 6.2 需求分析 6.2.1 功能性需求 6.2.2 系统功能需求 6.2.3 界面需求 6.2.4 安装需求 6.2.5 业务需求 …

qmt量化交易策略小白学习笔记第8期【qmt编程之获取股票资金流向数据--内置Python】

qmt编程之获取股票资金流向数据 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 感谢关注,需免费开通量化回测与咨询实盘权限,可以和博主联系! 获取股票资金…

【Unity之FGUI】黑神章Fairy GUI控件详解

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:就业…

铜镁合金应用领域广泛 我国具备原材料优势

铜镁合金应用领域广泛 我国具备原材料优势 铜镁合金又称铝青铜,是一种变形铝合金,指将镁金属、铝金属和铜金属经合金化反应制成的合金。与普通铝合金相比,铜镁合金具有比强度高、耐磨性好、减振性能佳、轻量化等优势,在金属冶炼、…

【前端】XML和HTML的区别详解

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

猫耳 WebSocket 跨端优化实践

前言 在现代的移动应用程序中,长连接是一种不可或缺的能力,包括但不限于推送、实时通信、信令控制等常见场景。在猫耳FM的直播业务中,我们同样使用了 WebSocket 长连接作为我们实时通信的基础。 在我们推进用户体验优化的工作中,…

IC开发——Ubuntu安装VCS2018

1. 简介 VCS是一种常用的Verilog仿真和综合工具,由Synopsys公司开发。它提供了一个完整的设计验证环境,用于验证硬件设计的正确性和性能。以下是VCS工具的一些主要特点和功能: 仿真功能:VCS支持基于事件驱动的数字电路级仿真&am…

【Linux命令】--- Linux下的分卷压缩与解压

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【Linux命令】--- 多核压缩命令大全&…

markdown画时序图的时候,如何自动显示每一条时序的序号

1: 现象描述 今天画时序图的时候,发现时序上面没有显示序号,看起来不够清晰,只有单纯的说明; 如下图所示 刚测试CSDN的时序图,默认是带序号的,看起来和实际使用的markdown工具有关系; 2:解决办…

XPosed项目的接入、模版制作、改名全过程

XPosed项目的接入、模版制作、改名全过程 写在前面 之前写过这篇Xposed Hook 过登录密码验证配置开发Xposed项目的文章,这次的接入使用的是当前最新版Android Studio,接入稍微有些差别,也记录下。 本篇文章主要是写关于XP项目接入、制作XP模…

两年前的微信聊天记录能恢复吗?正确答案在这里(全)

微信已经成为我们日常沟通中不可或缺的一部分,承载着无数重要的对话和回忆。然而,面对手机更换、系统升级或意外删除等情况,许多人不禁要问:两年前的微信聊天记录能恢复吗?这个问题的答案并不简单,因为能否…

WGCLOUD部署好后,怎么登录WGCLOUD界面

WGCLOUD的server启动完成后,我们在浏览器里输入URL,如下 http://[server主机IP]:9999 注意默认端口就是9999,如果修改过,那么把端口改成自己的实际端口 这样就可以看到登录页面了,默认账号密码是:admin/…

辅助科技照亮道路,携手共促盲文书写技能新飞跃

在这个科技日新月异的时代,创新的力量正以前所未有的方式融入我们的日常生活,特别是对于视觉障碍群体而言,技术的每一次进步都是通往更加独立生活的桥梁。今天,让我们聚焦于一款名为“蝙蝠避障”的辅助软件,它不仅为盲…

探索数字规律与数组操作

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、问题描述与需求概述 二、数字规律的理解 1. 观察数字模式 2. 思考生成方法 三、实现…

Ubuntu24.04安装tabby-terminal-1.0.207并处理依赖

1 下载 tabby-terminal-1.0.207 地址: https://github.com/Eugeny/tabby/releases 点击show all 36 assets 选择 tabby-1.0.207-linux-x64.deb 并下载。 2 依赖下载 gconf2_3.2.6-3ubuntu6_amd64.deb gconf2-common_3.2.6-3ubuntu6_all.deb gconf-service_3.2.6-…

怎么挑选骨传导耳机?精选六大选购技巧教你如何挑选

过去的两年里,骨传导耳机逐渐被大众的所熟知。可能毕竟长时间使用音量过大的传统入耳式耳机,多多少少会对我们的听力健康构成威胁。所以很多人就想找一款不伤耳朵的耳机。然后就了解到了骨传导耳机,所以就会延伸出这些问题——骨传导耳机好用…

vue3学习(二)

前言 上一篇分享了vue的基础指令,这篇记录下vue3的核心内容,也是自己的学习笔记,可能有些核心还不全,大佬请略过。 一、核心内容 分享这个之前,先声明下,我这里是用的脚手架的写法,分享的讲解截…