Clonable接口和拷贝
Hello~小伙伴们!本篇学习Clonable接口与深拷贝,一起往下看吧~(画图水平有限,两张图,,我真的画了巨久,求路过的朋友来个3连~阿阿阿~~~)
目录
1、Clonable接口概念
2、拷贝
2、1浅拷贝
2、2深拷贝
1、Clonable接口概念
Java 中内置了一些很有用的接口, Clonable 就是其中之一。
祖先类Object 中存在一个 clone 方法, 调用这个方法可以创建一个对象的 "拷贝". 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常。
那么具体如何使用Clonable接口呢?
以拷贝为为例来实现Clonable接口吧
2、拷贝
拷贝分为深拷贝和浅拷贝,就是从不同深度上去拷贝一个东西。接下来以拷贝person为例实现代码。注意:拷贝后的东西会占用新内存,也就是两者指向不同空间,互不影响。(该条件是区分是否被拷贝的核心!!!)
2、1浅拷贝
1、先创建Person类与Money类,并实例化两者对象。(以Money类对象是否拷贝来区别深拷贝或浅拷贝)
//Money类 public class Money {public double qianqian=9.9;@Overridepublic String toString() {return "Money{" +"qianqian=" + qianqian +'}';}}//Person类
public class Person{String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}//在Pweson类中实例化MoneyMoney money = new Money();@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';} }
2、在测试类中调用Clone方法
调用Clone方法不是那么的随意简单,需要注意四个点
(1)、在需要拷贝的类中重写Object类中的clone方法.
@Override
protected Object clone() throws CloneNotSupportedException {return super.clone();
}
(2)、将被拷贝的对象强转为该对象所属类。
从上面的代码块可以看到 clone 方法的返回类型为Obeject,所以要强转为拷贝对象所属类。
Person person2 =(Person) person1.clone();
(3)、 异常处理。在main方法体前添加throws CloneNotSupportedException。如下
public class Test {public static void main(String[] args) throws CloneNotSupportedException {Person person1 = new Person("zhangsan", 21);Person person2 = (Person) person1.clone();}
}
(4)实现接口,表示此类可被拷贝。
public class Person implements Cloneable {....}
3、通过person2.money来改变该money的属性的值。
person2.money.qianqian=99.99;
代码结果如图:

从结果可以看出,这种克隆方式是浅拷贝,怎么理解呢?

看图,改变person2.money来改变属性qianqian的值,也影响了person1.money的属性值。说明只只拷贝了Person类,没有拷贝Money类。这样的拷贝方式成为浅拷贝。
那么如何也将Money拷贝呢?
2、2深拷贝
拷贝Money只需要在浅拷贝的基础上修改两个地方。
1、在Money类中重写Object类中的clone方法
@Override
protected Object clone() throws CloneNotSupportedException {return super.clone();
}
2、在Person类中重写Object类中的clone方法
@Override
protected Object clone () throws CloneNotSupportedException {Person person2 = (Person) super.clone();person2.money = (Money) this.money.clone();return person2;
}
这里分了两部拷贝,第一步,先拷贝Person。第二步,拷贝Money(this.表当前调用clone方法的对象即person1)
整体代码如下:
//Money类
public class Money implements Cloneable{public double qianqian=9.9;@Overridepublic String toString() {return "Money{" +"qianqian=" + qianqian +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}//Person类
public class Person implements Cloneable {String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}Money money = new Money();@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overrideprotected Object clone () throws CloneNotSupportedException {Person person2 = (Person) super.clone();person2.money = (Money) this.money.clone();return person2;}}//测试类
public class Test {public static void main(String[] args) throws CloneNotSupportedException {Person person1 = new Person("zhangsan", 21);Person person2 = (Person) person1.clone();System.out.println(person1+"有"+person1.money);System.out.println(person2+"有"+person2.money);person2.money.qianqian=99.99;System.out.println("--------------------------------------------------------");System.out.println(person1+"有"+person1.money);System.out.println(person2+"有"+person2.money);}
}
代码结果:

加图理解:

本篇类的Clonable接口和深拷贝就学习到这里,是不是收获满满呢,如果觉得文章写的不错,留下小红心再走吧。后面一篇学习做图书管理系统!关注我,不要错过哦!~
相关文章:
Clonable接口和拷贝
Hello~小伙伴们!本篇学习Clonable接口与深拷贝,一起往下看吧~(画图水平有限,两张图,,我真的画了巨久,求路过的朋友来个3连~阿阿阿~~~) 目录 1、Clonable接口概念 2、拷贝 2、1浅拷贝 2、2深拷贝 1、Clon…...
关于小蛋の编程和小蛋编程为同一作者的说明
小蛋の编程和小蛋编程的作品为同一人制作,因前者为父母的手机号进行注册,现用本人手机号注册了新账号小蛋编程,后续文章将在新账号小蛋编程上进行刊登,同时在小蛋编程上对原账号文章进行转载。此账号不再发布帖子,请大…...
大数据平台之Spark
Apache Spark 是一个开源的分布式计算系统,主要用于大规模数据处理和分析。它由UC Berkeley AMPLab开发,并由Apache Software Foundation维护。Spark旨在提供比Hadoop MapReduce更快的处理速度和更丰富的功能,特别是在处理迭代算法和交互式数…...
How to use ModelSim
How to use ModelSim These are all written by a robot Remember, you can only simulate tb files....
【专业英语 复习】第8章 Communications and Networks
1. 单选题 One of the most dramatic changes in connectivity and communications in the past few years has been ____. A. widespread use of mobile devices with wireless Internet connectivity B. chat rooms C. satellite uplinks D. running programs on rem…...
运行vue3项目相关报错
1. VSCode打开TSVue3项目很多地方报错 报错内容 几乎所有文件都会出现未知飘红 error Delete CR prettier/prettier报错原因 插件冲突,Windows系统回车换行符与MAC不一致(所以这个问题Windows系统才会出现) 解决 需要安装Vue - Official…...
2024年6月计算机视觉论文推荐:扩散模型、视觉语言模型、视频生成等
6月还有一周就要结束了,我们今天来总结2024年6月上半月发表的最重要的论文,重点介绍了计算机视觉领域的最新研究和进展。 Diffusion Models 1、Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation LlamaGen,是一个…...
Centos Stream9 和Centos Stream10的下载网址
Index of /https://mirror.stream.centos.org/...
chrome 录制器及性能分析工具的使用
需求背景: 对比不同VPN方案网络延迟的差异。 验证工具: chrome浏览器自带的录制器、性能插件可以完美的解决这个问题。 注意:录制的操作都在当前页面,不存在新开标签页的场景 解决方案: 使用chrome录制器…...
如何打造稳定、好用的 Android LayoutInspector?
速度极慢,遇到复杂的布局经常超时 某些情况无法选中指定的 View 本文将围绕 LayoutInspector 的痛点,分析问题并修复,最终将 LayoutInspector 变成一个稳定、好用的插件。 二、加速 Dump View Hierarchy 2.1 问题描述 开发复杂业务的同学…...
C++ Thead互斥量死锁,mutex如何防止死锁---C++11多线程快速学习
假设有两个线程 T1 和 T2,它们需要对两个互斥量 mtx1 和 mtx2 进行访问,而且需要按照以下顺序获取互斥量的所有权: - T1 先获取 mtx1 的所有权,再获取 mtx2 的所有权。 - T2 先获取 mtx2 的所有权,再获取 mtx1 的所有…...
Ubuntu 之Glade图形化设计器
演示环境说明:本机使用Windows 11 家庭版本搭载 Ubuntu 22.04.4 LTS 子系统,同时并安装Ubuntu桌面虚拟化软件XLaunch。 如果没有搭建好上述问题,请参考:windows11子系统Ubuntu 22.04.4子安装图形化界面 Glade是什么?…...
152. 乘积最大子数组
152. 乘积最大子数组 题目链接:152. 乘积最大子数组 代码如下: class Solution { public:int maxProduct(vector<int>& nums) {int resnums[0];vector<int> f(nums.size()1,0),g(nums.size()1,0);f[0]nums[0],g[0]nums[0];for(int i1…...
proactor模式
Proactor模式是一种异步I/O的设计模式,它允许程序直接发起一个异步I/O操作并立即返回,而不需要等待该操作完成。一旦I/O操作实际完成,系统会通知相应的完成处理程序(Completion Handler),该处理程序随后执行…...
Charles抓包工具
一、charles简介 1,charles是什么 Charles中文名叫青花瓷,它是一款基于HTTP协议的代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果达到分析抓包的目的。 特点:跨平台、半免费 2,charles工作原理 前…...
RabbitMQ如何保证消息可靠
解决办法: 1、做好消息确认机制(pulisher、consumer[手动ACK]) 2、每一个发送的消息都在数据库做好记录。定期将失败的消息再次发送一遍 消息确认机制: 生产者确认模式:确认消息是否发送到broker,失败…...
学习笔记——路由网络基础——路由的高级特性
七、路由的高级特性 1、路由迭代(路由递归) 路由必须有直连的下一跳才能够指导转发,静态路由或BGP路由的下一跳可能不是直连的邻居,因此需要计算出一个直连的下一跳和对应的出接口,这个过程就叫做路由迭代(路由递归)。 添加一条去往20.1.1.…...
网络编程之XDP、TC和IO_URING以及DPDK
一、网络编程常见的技术 在前面已经分析过了XDP、TC和eBPF。也基本把三者间的关系理清了,但现在又有一个疑惑涌了上来。在前面提到过的IO_URING和DPDK与这些技术有什么关系呢?其实只要认真的看过分析文章可能大家心里都已经基本清楚了。 正如在前面不断…...
晶谷高温烧结导电浆料用低熔点玻璃粉 晶谷耐高温导电漆导电油墨高温玻璃粉
晶谷浆料玻璃粉是一种用于电子浆料的材料,它在电子浆料中起到粘结和降低烧结温度的作用,能够提高浆料与基材之间的结合力。 浆料玻璃粉的性能特点包括: - 软化点:软化点在350至650度之间。 - 热膨胀系数:热膨胀系数…...
【Mysql】DQL操作单表、创建数据库、排序、聚合函数、分组、limit关键字
DQL操作单表 1.1 创建数据库 •创建一个新的数据库 db2 CREATE DATABASE db2 CHARACTER SET utf8;•将db1数据库中的 emp表 复制到当前 db2数据库 ** 1.2 排序** 通过 ORDER BY 子句,可以将查询出的结果进行排序 (排序只是显示效果,不会影响真实数据) 语法结构:…...
音频频谱分析终极指南:Spek快速上手与深度应用全解析
音频频谱分析终极指南:Spek快速上手与深度应用全解析 【免费下载链接】spek Acoustic spectrum analyser 项目地址: https://gitcode.com/gh_mirrors/sp/spek Spek是一款功能强大的开源音频频谱分析工具,能够将音频文件的频率特性以彩色频谱图直观…...
GLM-4.1V-9B-Base效果展示:低质量压缩图(微信发送后)识别鲁棒性
GLM-4.1V-9B-Base效果展示:低质量压缩图(微信发送后)识别鲁棒性 1. 模型介绍 GLM-4.1V-9B-Base是智谱开源的视觉多模态理解模型,专门针对图像内容识别、场景描述、目标问答和中文视觉理解任务进行了优化。这个9B参数的模型在保持…...
LSM303DLHC驱动开发:磁力计校准与六轴姿态解算
1. LSM303DLHC 姿态感知核心:高精度磁力计与加速度计集成库深度解析LSM303DLHC 是意法半导体(STMicroelectronics)推出的紧凑型六轴惯性测量单元(IMU),集成了三轴加速度计(2g/4g/8g 可选量程&am…...
远程工作事故树:一次误删库引发的跨国追责
远程协作下的“脆弱”系统深夜,伦敦办公室的数据库工程师在连续工作十二小时后,敲下了一条他以为指向“测试环境”的删除命令。与此同时,上海的测试团队正在为次日的上线进行最后一轮回归验证。六小时后,当阳光照进浦东的办公室&a…...
Youtu-VL-4B-Instruct问题解决:服务启动失败?常见错误排查与修复
Youtu-VL-4B-Instruct问题解决:服务启动失败?常见错误排查与修复 1. 服务启动失败的常见表现 当你尝试启动Youtu-VL-4B-Instruct服务时,可能会遇到以下几种典型问题: 1.1 端口冲突错误 最常见的错误是端口已被占用,…...
国内顶级的SEO技术网站有哪些
国内顶级的SEO技术网站有哪些? 在当今互联网时代,搜索引擎优化(SEO)已经成为每个网站营销者不可忽视的重要环节。国内顶级的SEO技术网站不仅为业内人士提供了宝贵的技术分享和实践经验,还为企业的网站流量优化提供了有…...
LeaguePrank:英雄联盟段位修改与个性化展示完全指南
LeaguePrank:英雄联盟段位修改与个性化展示完全指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 想要在英雄联盟客户端中展示与众不同的段位和个性化信息吗?LeaguePrank 正是你需要的工具。这款开源…...
AST 是什么?费曼 + 大白话 + 画图,30 秒彻底懂
我用最简单、最形象、最不绕弯的方式给你讲清楚,保证你马上能听懂👇一、AST 代码的骨架结构图全称:Abstract Syntax Tree 抽象语法树一句话:AST 就是把代码拆成逻辑结构,去掉所有标点、空格、格式,只保留 …...
基于stm32的楼道照明系统[单片机]-计算机毕业设计源码+LW文档
摘要:本文提出了一种基于STM32单片机的楼道照明系统设计方案。该系统以STM32为核心控制器,结合人体热释电感应模块、声音感应模块和光照检测模块,实现楼道照明的智能控制。通过实时检测人体存在、声音信号以及环境光照强度,系统能…...
小红书内容保存难题,这款Python工具如何实现一键无水印下载?
小红书内容保存难题,这款Python工具如何实现一键无水印下载? 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作…...
