Java深拷贝浅拷贝

在Java中,深拷贝和浅拷贝是两种不同的对象复制方式。

  1. 浅拷贝:创建一个新对象,然后将原对象的非静态字段复制到新对象中。如果字段是值类型的,那么对该字段执行逐位复制。如果字段是引用类型的,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象。

  2. 深拷贝:创建一个新对象,并将原对象的非静态字段复制到新对象中。如果字段是值类型的,那么对该字段执行逐位复制。如果字段是引用类型的,则递归地复制引用的对象,直到遇到值类型为止。因此,原始对象及其副本引用不同的对象。

以下是一个简单的Java代码示例,展示了浅拷贝和深拷贝的区别:

class Person implements Cloneable {String name;int age;Address address;public Person(String name, int age, Address address) {this.name = name;this.age = age;this.address = address;}// 浅拷贝public Object clone() throws CloneNotSupportedException {return super.clone();}// 深拷贝public Person deepClone() {return new Person(new String(this.name), this.age, new Address(this.address.city, this.address.street));}
}class Address {String city;String street;public Address(String city, String street) {this.city = city;this.street = street;}
}public class Main {public static void main(String[] args) throws CloneNotSupportedException {Address address = new Address("北京", "朝阳路");Person person1 = new Person("张三", 30, address);Person person2 = (Person) person1.clone(); // 浅拷贝Person person3 = person1.deepClone(); // 深拷贝System.out.println("person1: " + person1.address.city + ", " + person1.address.street);System.out.println("person2: " + person2.address.city + ", " + person2.address.street);System.out.println("person3: " + person3.address.city + ", " + person3.address.street);person1.address.city = "上海";System.out.println("修改person1的地址后:");System.out.println("person1: " + person1.address.city + ", " + person1.address.street);System.out.println("person2: " + person2.address.city + ", " + person2.address.street);System.out.println("person3: " + person3.address.city + ", " + person3.address.street);}
}

输出结果:

person1: 北京, 朝阳路
person2: 北京, 朝阳路
person3: 北京, 朝阳路
修改person1的地址后:
person1: 上海, 朝阳路
person2: 上海, 朝阳路
person3: 北京, 朝阳路

从输出结果可以看出,浅拷贝时,person1和person2引用的是同一个Address对象,而深拷贝时,person1和person3引用的是两个不同的Address对象。

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

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

相关文章

SAP 根据报错消息号快速定位问题

通常用户在业务的操作过程中,经常会遇到报错信息,有些报错是系统控制抛出的信息,但是有些报错的信息是根据不同地点业务场景对填写的数据进行判断校验,然后给出的报错信息,正常情况报错信息一般是有文本,或…

【C语言】文件操作讲解

C语言文件操作讲解 文件文件名文件类型数据在内存中的存储 文件缓冲区文件指针文件的打开与关闭fopenfclosefopen与fclose的使用文件的打开方式 文件的顺序读写fputcfgetcfputsfgetsfprintffscanffwritefread输入流与输出流对比scanf\fscanf\sscanf与printf\fprintf\sprintfssc…

【区分vue2和vue3下的elementUI和elementUI Plus的button组件,介绍如何安装,属性,事件,方法等以及使用案例】

区分vue2下的Element UI和vue3下的Element Plus的Button组件 Element UI (vue2) Button组件:基于Vue 2的Element UI库中的Button组件提供了多种样式和类型,如默认、主要、成功、警告、危险等。 Element Plus (vue3) Button组件:作为Element …

汇编原理(二)寄存器——内存访问

一个字 两个字节 双字 字节为8位 字为16位(看两格) 双子dword32位(看四格) 内存中字的存储: 0地址单元中存放的字节型数据是多少? 0地址字单元中存放的字型数据是多少? 2地址字单元中存放…

Secure Operation

文章目录 Secure Summation OperationSecure Set Union Operation Secure Summation Operation 让我们通过一个具体的例子来说明这个算法。 假设有三个数据拥有者 S1, S2 和 S3,他们分别持有以下值: S1 持有 value1 10S2 持有 value2 20S3 持有 val…

基坑气膜:建筑工地环保新利器—轻空间

随着城市化进程的加快,建筑行业的飞速发展带来了严重的环境问题,如噪音和粉尘污染,给人们的生活带来诸多不便。为了解决这些问题,建筑行业一直在探索更为环保和高效的施工方式。近年来,基坑气膜技术逐渐崭露头角&#…

Audition 2024 for Mac/Win:音频录制与编辑的卓越之选

随着数字媒体的不断发展,音频内容创作已经成为各行各业中不可或缺的一部分。无论是音乐制作、广播节目、播客录制还是影视配音,都需要高品质的音频录制和编辑工具来实现专业水准的作品。在这个充满竞争的时代,要想在音频创作领域脱颖而出&…

解线性方程组——最速下降法及图形化表示 | 北太天元 or matlab

一、思路转变 A为对称正定矩阵, A x b Ax b Axb 求解向量 x x x这个问题可以转化为一个求 f ( x ) f(x) f(x)极小值点的问题,为什么可以这样: f ( x ) 1 2 x T A x − x T b c f(x) \frac{1}{2}x^TAx - x^Tb c f(x)21​xTAx−xTbc 可…

ZooKeeper安装

安装Zookeeper 1、下载Zookeeper安装包 打开链接选择一个版本进行下载 https://zookeeper.apache.org/releases.html2、上传Zookeeper安装包到集群 输入命令 scp apache-zookeeper-3.8.4-bin.tar.gz hadoop192.168.88.100:/tmp也可以使用xftp等上传,物理机用u盘…

Python 网格变换之平移、旋转、缩放、变换矩阵

网格变换 一、平移1.1、代码示例1.2、结果示例二、旋转2.1、代码示例2.2、结果示例三、缩放3.1、代码示例3.2、结果示例四、变换矩阵4.1、代码示例4.2、结果示例一、平移 网格平移:将网格沿着特定的方向移动一段距离。 1.1、代码示例

Android实现无线连接ADB调试

无线连接ADB(Android Debug Bridge)进行调试,是一种方便的远程调试方式,尤其适合在没有USB线或者设备物理接触不便的情况下使用。下面是如何设置无线ADB调试的步骤: 1. 准备工作 确保你的电脑和Android设备连接在同一局域网(Wi-Fi)下。 2. 在Android设备上操作 允许…

hadoop其中一个节点坏了,用其他节点克隆的教程+datanode正常显示,但master只有1个livenodes

如果一个slave出了非常棘手的问题,还是用其他slave克隆吧,很快的。 克隆教程: 1.克隆后只需要:sudo gedit /etc/network/interfaces,把ip地址改好。 2.ssh不需要重新设置,其他东西也都不需要重新进行设置…

linux日常运维2

下载linux离线安装包---- 利用 Downloadonly 插件下载 RPM 软件包及其所有依赖包 1. 先找个可以上网的linux操作系统,这里是以centos7操作系统为例,如果要使用centos6就先安装一个centos6的系统,然后让他可以上网,后面步骤如下 a.…

《精通Stable Diffusion AI绘画:基础技巧、实战案例与海量资源一站式学习》

随着人工智能技术的迅猛发展,AI绘画已经成为了一个炙手可热的话题。特别是在设计、艺术和创意领域,AI绘画工具的出现无疑为创作者们带来了更多的可能性和便利。《Stable Diffusion AI绘画从提示词到模型出图》这本书,就是一本深入解析Stable …

打包迁移Python env环境

打包迁移Python env环境 平常工作中可能遇到python虚拟环境迁移的场景,总结了如下几个方法。适用于同架构、相同类型系统之间的python虚拟环境迁移。 方法一:使用pip freeze和requirements.txt 这种方法将当前环境中的所有包记录到一个文件中&#xff0c…

恢复视频3个攻略:从不同情况下的恢复方法到实践!

随着科技的进步,我们的生活被各种各样的数字内容所包围,其中,视频因其独特的记录性质,承载着许多重要的资料。但不管是自媒体人还是普通人日常生活随手一拍,都会遇到误删视频的情况。为了帮助您找回手机视频&#xff0…

从零学爬虫:使用比如说说解析网页结构

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、网页结构概述 示例:查看网页结构 三、使用比如说说解析网页 1.…

windows10更改文件默认打开软件

📚博客主页:knighthood2001 ✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下) 🎃知识星球:【认知up吧|成长|副业】介绍 ❤️感谢大家点赞👍&…

使用ollama + webui+docker 运行任意大模型

🏡 Home | Open WebUI 如果您的计算机上有 Ollama,请使用以下命令: docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/o…

【Vue】跨域问题解决

Vue列文章目录 【Vue】数据监测原理 【Vue】生命周期 【Vue】组件化编程 【Vue】组件用法 前言 … 目标 proxy代理的用法 #mermaid-svg-ZYJUqv8HPXLA3ecR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZYJUqv8HPX…