浅拷贝与深拷贝

作者简介: zoro-1,目前大一,正在学习Java,数据结构等
作者主页: zoro-1的主页
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖
浅拷贝与深拷贝
- 浅拷贝
- 浅拷贝定义
- 浅拷贝代码演示
- 浅拷贝的特点
- 深拷贝
- 深拷贝定义
- 深拷贝代码演示
- 深拷贝特点
浅拷贝
之前我们学了数组的拷贝,那么对象如何进行拷贝呢
浅拷贝定义
浅拷贝是一种复制对象的方法,在这种方法中,只复制对象的引用或指针,而不是对象本身的内容。
浅拷贝代码演示
class Hia{int a=6;
}
class Animal {String name="animal";int age=0;Hia hia=new Hia();public Animal(String name, int age) {this.name = name;this.age = age;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class Text4 {public static void main(String[] args) throws CloneNotSupportedException {Animal dog=new Animal("dog",5);Animal dogcopy=(Animal) dog.clone();}
}
代码讲解:
初始化Animal类为dog对象,现在想要copy一份dog对象,就要了解clone方法,他是object类里面的方法也就是Animal的父类的方法(因为所有类都是继承object类),这个类是由protected修饰所以我们不能直接调用,他的最大访问权限是不同包下的子类对象,且只能用super访问所以要在定义一个不带static修饰的方法下面访问,我这里采用的是重写父类的clone方法,返回super.clone();,clone的返回值对象是object,所以要强转为(Animal);
上面的代码运行出来结果还是错的
原因是在java里面只有实现Cloneable接口才说明这个类是支持拷贝的(虽然这个接口什么都没有);
浅拷贝的特点
特点是他只是将你类里面的变量的值赋值下来,不会将你成员对象引用的也赋值一份,下面这个图就能很好解释

当然我们也可以用代码直观的看出来
public class Text4 {public static void main(String[] args) throws CloneNotSupportedException {Animal dog=new Animal("dog",5);Animal dogcopy=(Animal) dog.clone();System.out.println(dog.hia.a);System.out.println(dogcopy.hia.a);dog.hia.a=9;System.out.println(dog.hia.a);System.out.println(dogcopy.hia.a);}
}

通过运行结果可以看出来我们发现该变原对象的hia.a,复制的对象的hia.a也发生了改变,这说明复制后的hia和前面指向的是同一个引用
想要将复制里面的引用也复制一份就要用到深拷贝
深拷贝
深拷贝定义
深拷贝是指在拷贝一个对象时,创建一个新的对象并将原对象的所有属性值都复制到新对象中,而不是简单地复制对象的引用地址。因此,在深拷贝后,两个对象之间是完全独立的,互不影响。深拷贝通常用于需要完全复制原对象的情况,例如在多线程环境下操作对象时,为了避免不同线程间共享对象导致的数据冲突,就需要使用深拷贝。深拷贝是指在拷贝一个对象时,创建一个新的对象并将原对象的所有属性值都复制到新对象中,而不是简单地复制对象的引用地址。
深拷贝代码演示
class Hia implements Cloneable{int a=6;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
class Animal implements Cloneable{String name="animal";int age=0;Hia hia=new Hia();public Animal(String name, int age) {this.name = name;this.age = age;}@Overrideprotected Object clone() throws CloneNotSupportedException {Animal animal=(Animal) super.clone();animal.hia=(Hia) animal.hia.clone();return animal;}
}
public class Text4 {public static void main(String[] args) throws CloneNotSupportedException {Animal dog=new Animal("dog",5);Animal dogcopy= (Animal) dog.clone();System.out.println(dog.hia.a);System.out.println(dogcopy.hia.a);dog.hia.a=9;System.out.println(dog.hia.a);System.out.println(dogcopy.hia.a);}
}

代码解释
我的理解是深拷贝是两层浅拷贝,现将对象进行一次拷贝然后再将dog对象里面的引用对象拷贝一份赋值给新的对象的里面的引用对象,譬如上面的代码,重写的clone()方法里面先super.clone(),复制一份当前类的对象,然后类里面的引用类型Hia调用clone(),复制一份再赋值给animal.hia,那现在animal就是就是彻底的拷贝了,然后返回animal;然后改变dog类里面的hia.a打印输出,只有dog类里面的改变了
深拷贝特点

深拷贝是一种复制数据的方式,它会创建一个完全独立的副本,而不是原始数据的引用。深拷贝的特点如下:
-
完全独立:深拷贝会创建一个全新的对象,而不是原对象的引用。
-
完整复制:深拷贝会复制所有的属性和方法,包括对象的嵌套属性和方法。
-
递归复制:如果对象有嵌套属性或方法,深拷贝会递归复制嵌套对象的属性和方法。
-
不受原对象改变影响:因为深拷贝生成的对象完全独立,所以它不会受到原对象的更改的影响。
需要注意的是,深拷贝可能会导致性能问题,特别是当数据结构非常复杂时。因为深拷贝会复制所有的属性和方法,包括对象的嵌套属性和方法,所以可能需要花费大量的时间和内存来完成。
今天的分享到这里就结束了,感谢大家支持,创作不易,希望大家能给博主个三连
相关文章:
浅拷贝与深拷贝
作者简介: zoro-1,目前大一,正在学习Java,数据结构等 作者主页: zoro-1的主页 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 浅拷贝与深拷贝 浅拷贝浅拷贝定义浅拷贝代码演示浅…...
背包 问题
1、背包问题 1.1、01背包 题目: 有n件物品和一个容量为m的背包,第i件物品的体积是v[ i ],价值是w[ i ],每件物品只有一件,求在不超过背包容量的前提下,可以放的物品的最大价值是多少 基本思路ÿ…...
蓝牙资讯|安卓将加强耳机音量监控,耳机查找功能将更加普遍
为了保护用户的听力健康,Android 14 将增加一项新功能,当用户使用耳机听音乐时,如果音量过高或持续时间过长,系统会发出警告,并自动降低音量。这个功能叫做“耳机音量过高警告(headphone loud sound alert&…...
vue,element。监听快捷键粘贴图片,添加到el-upload的列表。
在①中,粘贴图片,图片能够自动添加到底下el-upload组件的文件列表②。 // 对应① <el-card><el-tooltip content"粘贴图片至此" placement"top"><input readonly class"pasteImg" paste.prevent"hand…...
时序预测 | MATLAB实现基于CNN-BiLSTM卷积双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)
时序预测 | MATLAB实现基于CNN-BiLSTM卷积双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-BiLSTM卷积双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍…...
编织梦想:SpringBoot AOP 教程与自定义日志切面完整实战
什么是 AOP AOP 是指通过预编译方式和运行期动态代理的方式,在不修改源代码的情况下对程序进行功能增强的一种技术。AOP 不是面向对象编程(OOP)的替代品,而是 OOP 的补充和扩展。它是一个新的维度,用来表达横切问题&a…...
AssignableTypeFilter 和 AnnotationTypeFilter什么区别?
在 Spring 框架中,AssignableTypeFilter 和 AnnotationTypeFilter 都是用于在组件扫描过程中进行过滤的工具类,用于筛选出特定类型或特定注解的类。它们的主要区别在于筛选的侧重点和使用方式。 AssignableTypeFilter: AssignableTypeFilte…...
TCP-事件模型
#include "main.h"VOID Server_write_error() {}/*1.打开网络库 * 2.校验网络库版本 * 3.创建SOCKET * 4.绑定IP地址和端口 * 5.开始监听 * 6.创建客户端socket/接受链接 * 7.与客户端收发消息 * 8.(6.7)两步的函数accept,send,recv 有堵塞,可…...
typescript 声明文件
作用 1、为已存在js库提供类型信息,这样在ts项目中使用这些库时候,就像用ts一样,会有代码提示、类型保护等机制 2、项目内共享类型:如果多个.ts文件中都用到同一个类型,此时可以创建.d.ts文件提供该类型,…...
BC96 有序序列判断
描述 输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。 数据范围:3≤n≤50 序列中的值都满足1≤val≤100。 输入描述 第一行输入一个整数N(3≤N≤50)。 第二行…...
QT操作excel的两种方式 QT基础入门【Excel的操作】
QT操作excel的方式有两种:QAxObject 和QtXlsx QAxObject是通过调用office或者wps组件来实现对excel图表的操作的。只有装office软件或者wps软件就可以实现,但是 如果只装了office软件,有时可以用有时不可以用;如果只装wps软件&a…...
c++ qt--QString,弹出框(第二部分)
c qt–QString,弹出框(第二部分) 一.QString 1.所用头文件 #include<QString>2.功能 1.初始化 可以用字符,常量字符串、字符指针、字符数组等类型给QString进行初始化 QString str2"4567";//进行初始化2.拼…...
CSS自学框架之动画
这一节,自学CSS动画。主要学习了淡入淡出、淡入缩放、缩放、移动、旋转动画效果。先看一下成果。 优雅的过渡动画,为你的页面添加另一份趣味! 在你的选择器里插入 animation 属性,并添加框架内置的 keyframes 即可实现࿰…...
RabbitMQ的5种消息队列
RabbitMQ的5种消息队列 1、七种模式介绍与应用场景 1.1 简单模式(Hello World) 一个生产者对应一个消费者,RabbitMQ 相当于一个消息代理,负责将 A 的消息转发给 B。 应用场景:将发送的电子邮件放到消息队列,然后邮件服务在队列…...
【C语言】选择排序
基本原理 先找到数组中最大的那个数,将最大的数放到数组最右端(交换a[maxid]和a[len-1]这两个数的位置),然后继续从a[0]到a[len-2]中找到最大的数,然后交换a[maxid]和a[len-2]位置,依次查找交换,…...
异步更新队列 - Vue2 响应式
前言 这篇文章分析了 Vue 更新过程中使用的异步更新队列的相关代码。通过对异步更新队列的研究和学习,加深对 Vue 更新机制的理解 什么是异步更新队列 先看看下面的例子: <div id"app"><div id"div" v-if"isShow&…...
【Unity的URP渲染管线下实现扩展后处理Volume组件_TemporalAntiAliasing(TAA)_抗锯齿(附带下载链接)】
【Unity的URP渲染管线下的TAA抗锯齿】 背景:1. Unity内置的抗锯齿只能够满足部分画面需求。展示一个锯齿示例。2. 在75寸大屏电视上跑通展示一个锯齿示例。- 在Camera上配置3. 安装了一个TAA组建,最后打包APK在安卓机上运行报错。- 经过测试排查,发现是没有将后处理的shader…...
NineData通过AWS FTR认证,打造安全可靠的数据管理平台
近日,NineData 作为新一代的云原生智能数据管理平台,成功通过了 AWS(Amazon Web Service)的 FTR 认证。NineData 在 FTR 认证过程中表现出色,成功通过了各项严格的测试和评估,在数据安全管理、技术应用、流…...
Qt应用开发(基础篇)——滚屏区域类 QScrollArea
一、前言 QScrollArea类继承于QAbstractScrollArea,QAbstractScrollArea继承于QFrame,是Qt滚动视图的常用部件。 滚屏区域基类 QAbstractScrollArea 框架类 QFrame QScrollArea类提供了对另一个小部件的滚动视图,基础功能、滚动条控制、界面策…...
安装最新版chromedriver 116,亲测可用
Version Selection...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...

