Cloneable接口和深拷贝
在java中如何对对象进行拷贝呢?我们可以使用Object类中的clone方法。
一、浅拷贝
在使用clone方法对对象进行拷贝的时候,需要注意:
1.需要重写clone方法;
2.clone方法的返回值是Object类,需要强制类型转化;
3.使用clone方法必须先实现Cloneable接口;
//深克隆
public class Test {//对抛出的异常进行处理public static void main(String[] args)throws CloneNotSupportedException {Person person=new Person("zhangsan",10);Person person1=(Person)person.clone();System.out.println("修改前:"+person.m.money);System.out.println("修改前:"+person1.m.money);person1.m.money=99.9;System.out.println("修改后:"+person.m.money);System.out.println("修改后:"+person1.m.money);//对person1.m.money修改后,person.m.money也被修改}
}
class Money {public double money=9.9;
}
//想要进行拷贝的类必须实现Cloneable接口
@SuppressWarnings("ALL")
class Person implements Cloneable{public int age;public String name;public Person(String name,int age) {this.age = age;this.name = name;}Money m=new Money();@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}//重写clone方法protected Object clone()throws CloneNotSupportedException{return super.clone();}
}
运行结果:
可以看到当我们将person1.m.money修改为99.9是, person.m.money也被修改为99.9,这是为什么呢?
原因是我们只对person 进行了拷贝,而没有对m进行拷贝,因此person1和person中的m为同一个引用,它们指向同一个对象,像这种不完全的拷贝方式叫做浅拷贝。
二、深拷贝
如果想将上面的对象m也拷贝一份,也很简单,与拷贝person类似。
//深克隆
public class Test {public static void main(String[] args)throws CloneNotSupportedException {Person person=new Person("zhangsan",10);Person person1=(Person)person.clone();System.out.println("修改前:"+person.m.money);System.out.println("修改前:"+person1.m.money);person1.m.money=99.9;System.out.println("修改后:"+person.m.money);System.out.println("修改后:"+person1.m.money);}
}
//Money类也实现Cloneable接口,对clone方法进行重写
class Money implements Cloneable{public double money=9.9;protected Object clone()throws CloneNotSupportedException{return super.clone();}
}
//想要进行拷贝的类必须实现Cloneable接口
@SuppressWarnings("ALL")
class Person implements Cloneable{public int age;public String name;public Person(String name,int age) {this.age = age;this.name = name;}Money m=new Money();@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}protected Object clone()throws CloneNotSupportedException{//clone的返回值为Object类,因此需要强制类型转换Person tmp=(Person) super.clone();//调用Monmey类中重写的clone方法,对m进行拷贝tmp.m=(Money) this.m.clone();return tmp;}
}
运行结果:

相关文章:
Cloneable接口和深拷贝
在java中如何对对象进行拷贝呢?我们可以使用Object类中的clone方法。 一、浅拷贝 在使用clone方法对对象进行拷贝的时候,需要注意: 1.需要重写clone方法; 2.clone方法的返回值是Object类,需要强制类型转化…...
C++:vector的介绍及使用
✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 文章目录 文章目录 前言 一、vector的介绍 二、vector的使用 2.1.构造和赋值重载(Member functions) 2.2 vector iterator 的使用 2.3 vector 空间增长问题 2.4 vector 增删查改 三 sort 四 v…...
【机器学习】大模型在机器学习中的应用:从深度学习到生成式人工智能的演进
🔒文章目录: 💥1.引言 ☔2.大模型概述 🚲3.大模型在深度学习中的应用 🛴4.大模型在生成式人工智能中的应用 👊5.大模型的挑战与未来展望 💥1.引言 随着数据量的爆炸性增长和计算能力的提…...
营销短信XML接口对接发送示例
在现代社会中,通信技术日新月异,其中,短信作为一种快速、简便的通信方式,仍然在日常生活中占据着重要的地位。为了满足各种应用场景的需求,短信接口应运而生,成为了实现高能有效通信的关键。 短信接口是一种…...
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:C语言刷题系列 目录 一、问题描述 二、解题思路 解题思路: 解题步骤: 三、C语言代码实现及测试 一、问题描述 给定一…...
Python pdf2imges -- pdf文件转图片
pdf文件转图片,需要安装PyMuPDF包,具体PyMuPDF包介绍可以参考:Python 处理 PDF 的神器 -- PyMuPDF import fitz # pip install PyMuPDF# PDF转换为IMG统一管理 def pdf_to_images(pdf_path, img_path, filename):"""pdf_p…...
分布式版本控制工具 git
git 是什么 分布式版本控制工具。github 是代码托管平台。 git 有什么用 保存文件的所有修改记录。使用版本号(sha1 哈希值) 进行区分。随时可浏览历史版本记录。可还原到历史指定版本。对比不同版本的文件差异。 为什么要使用 git 多人协作开发一个大…...
Flutter 中的 ExpansionTile 小部件:全面指南
Flutter 中的 ExpansionTile 小部件:全面指南 在 Flutter 应用中,ExpansionTile 是一个常用的折叠列表项,它允许用户点击标题来展开或折叠更多的内容。这个组件在实现可折叠列表、FAQ 部分或显示详情信息时非常有用。本文将详细介绍 Expansi…...
二进制的协议的测试程序
一、引子 由于要调试二进制私有协议,不想用C重头到尾写,用C写工程量有点大,因此想找一个比较简单的工具,postman无法实现,外界的几乎找不到合适的工具,只能考虑手写一个。 前面写了一个python通过tcp协议发…...
多线程事务
一、业务场景 我们在工作中经常会到往数据库里插入大量数据的工作,但是既需要保证数据的一致性,又要保证程序执行的效率。因此需要在多线程中使用事务,这样既可以保证数据的一致性,又能保证程序的执行效率。但是spring自带的Trans…...
春秋云境CVE-2020-26048
简介 CuppaCMS是一套内容管理系统(CMS)。 CuppaCMS 2019-11-12之前版本存在安全漏洞,攻击者可利用该漏洞在图像扩展内上传恶意文件,通过使用文件管理器提供的重命名函数的自定义请求,可以将图像扩展修改为PHP…...
MySQL 带游标的存储过程(实验报告)
一、实验名称: 带游标的存储过程 二、实验日期: 2024 年 5月 25 日 三、实验目的: 掌握MySQL带游标的存储过程的创建及调用; 四、实验用的仪器和材料: 硬件:PC电脑一台; 配置࿱…...
结构体(位段)内存分配
结构体由多个数据类型的成员组成。那编译器分配的内存是不是所有成员的字节数总和呢? 首先,stu的内存大小并不为29个字节,即证明结构体内存不是所有成员的字节数和。 其次,stu成员中sex的内存位置不在21,即可推测…...
基于SSH的母婴用品销售管理系统带万字文档
文章目录 母婴商城系统一、项目演示二、项目介绍三、系统部分功能截图四、万字论文参考五、部分代码展示六、底部获取项目源码和万字论文参考(9.9¥带走) 母婴商城系统 一、项目演示 母婴商城系统 二、项目介绍 基于SSH的母婴商城系统 系统…...
说些什么好呢
大一:提前学C和C。学完语法去洛谷或者Acwing二选一,刷300道左右题目。主要培养编程思维,让自己的逻辑能够通过代码实现出来。 现在对算法有点感兴趣但是没有天赋,打不了acm,为就业做准备咯。 大二(算法竞赛)࿱…...
1301-习题1-1高等数学
1. 求下列函数的自然定义域 自然定义域就是使函数有意义的定义域。 常见自然定义域: 开根号 x \sqrt x x : x ≥ 0 x \ge 0 x≥0自变量为分式的分母 1 x \frac{1}{x} x1: x ≠ 0 x \ne 0 x0三角函数 tan x cot x \tan x \cot x …...
C语言之指针进阶(3),函数指针
目录 前言: 一、函数指针变量的概念 二、函数指针变量的创建 三、函数指针变量的使用 四、两段特殊代码的理解 五、typedef 六、函数指针数组 总结: 前言: 本文主要讲述C语言指针中的函数指针,包括函数指针变量的概念、创建…...
RabbitMQ安装及配套Laravel使用
MQ MQ 全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 为什么需要mq: 解耦:MQ能够使各个系统或组件之间解耦,降低它们之间的耦合度,提高系统的灵活性和可维护性异步处理:通过MQ可以实现异步处理,提高系统响应速度和吞…...
java在类的定义中创建自己的对象?
当在main方法中新建自身所在类的对象,并调用main方法时,会不断循环调用main方法,直到栈溢出 package com.keywordStudy;public class mainTest {static int value 33;public static void main(String[] args) throws Exception{String[] sn…...
掌握C++回调:按值捕获、按引用捕获与弱引用
文章目录 一、按引用捕获和按值捕获1.1 原理1.2 案例 二、弱引用2.1 原理2.2 案例一2.3 案例二:使用base库的弱引用 三、总结 在C回调中,当使用Lambda表达式捕获外部变量时,有两种捕获方式:按值捕获和按引用捕获。 一、按引用捕获…...
使用开源 Authentik 实现 AWS 单点登录
前言 懒得自己编了, Gemini 这样介绍 Authentik: 简单来说,Authentik 是一款功能极其强大的开源身份验证与访问管理 (IAM) 解决方案。 如果你觉得像 Okta 或 Auth0 这种商业服务太贵,或者觉得像 Keycloak 这种传统方案配置起来太头疼,那么…...
嵌入式进阶——MCU启动与代码执行教程
MCU启动与代码执行教程 1. 简介 本教程旨在帮助理解,深入剖析ARM Cortex-M系列单片机上电后的完整启动流程,以及程序在Flash、RAM、寄存器三者的协同执行机制。基于STM32等典型MCU,从硬件复位瞬间开始,逐步讲解向量表加载、Reset_…...
工业网关上线前必须做的7项压力测试,第4项让3家客户当场终止验收:PHP-FPM+Docker+K8s边缘集群压测黄金指标手册
第一章:工业网关上线前必须做的7项压力测试,第4项让3家客户当场终止验收:PHP-FPMDockerK8s边缘集群压测黄金指标手册为什么第4项测试如此关键 第4项测试聚焦于 PHP-FPM 在高并发短连接场景下的子进程回收与内存泄漏叠加效应——这正是导致三家…...
人力资源管理AI落地实操:从踩坑到跑通的完整路径
人力资源管理AI是指将人工智能技术深度应用于招聘、人事、绩效、薪酬等HR管理全流程的智能化解决方案。 2026年,AI已从”锦上添花”变为HR部门的核心生产力工具,能够将简历筛选时间从平均3天缩短到4小时,绩效面谈记录效率提升6倍,…...
若依(RuoYi)SpringBoot框架前后端数据安全传输实践:基于Base64的接口加解密方案
1. 为什么需要接口数据加密? 最近在做一个金融类项目时,客户明确要求所有接口传输数据必须加密。这让我意识到,很多开发者可能忽略了接口安全的重要性。想象一下,如果你的API数据在传输过程中被截获,用户密码、身份证号…...
LabVIEW Excel工具包:高效读写EXCEL模板,快速生成测试报告制作利器
LabVIEW Excel工具包快速读写EXCEL样式模板生成测试报告制作LabVIEW工程师最头疼的Excel报告生成终于有解了!最近项目里被要求每天生成格式统一的测试报告,手动操作Excel差点把我逼疯。直到发现LabVIEW自带的Excel工具包,真香警告来了——原来…...
Browser.html快速入门:5分钟搭建你的第一个HTML浏览器
Browser.html快速入门:5分钟搭建你的第一个HTML浏览器 【免费下载链接】browserhtml Experimental Servo browser built in HTML 项目地址: https://gitcode.com/gh_mirrors/br/browserhtml Browser.html是一个基于HTML构建的实验性浏览器项目,它…...
科学/技术路线之争、天才 vs 体制、创新 vs 实用的对立故事
文章目录一、最像「交流电 vs 直流电」的路线大战1. **尼古拉特斯拉 vs 托马斯爱迪生**(你已知的原型)二、同级别的「史诗级科学互怼」2. **伽利略 vs 教会/亚里士多德学派**3. **牛顿 vs 莱布尼茨**4. **爱因斯坦 vs 玻尔**5. **巴斯德 vs 普歇**三、技…...
小红书视频下载神器:三步搞定无水印批量下载,新手也能轻松上手
小红书视频下载神器:三步搞定无水印批量下载,新手也能轻松上手 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果…...
别再吹牛了,% Vibe Coding 存在无法自洽的逻辑漏洞!蕾
简介 langchain中提供的chain链组件,能够帮助我门快速的实现各个组件的流水线式的调用,和模型的问答 Chain链的组成 根据查阅的资料,langchain的chain链结构如下: $$Input \rightarrow Prompt \rightarrow Model \rightarrow Outp…...
