当前位置: 首页 > news >正文

Java 中的 Cloneable 接口和深拷贝

引言:
        在 Java 中,深拷贝是一种常见的需求,它可以创建一个对象的完全独立副本。Cloneable 接口提供了一种标记机制,用于指示一个类实例可以被复制。本文将详细介绍 Java 中的 Cloneable 接口和深拷贝的相关知识,并提供一些例子进行说明。

一、Cloneable 接口和深拷贝的关系

  1. Cloneable 接口是一个标记接口,它不包含任何方法。
  2. Cloneable 接口的存在告诉编译器目标类可以被克隆,但需要在具体类中实现 clone() 方法才能实现深拷贝。

二、实现深拷贝的步骤

       在具体类中实现深拷贝需要完成以下步骤:

  1. 实现 Cloneable 接口。
  2. 重写 clone() 方法。
  3. clone() 方法中使用适当的方式创建对象的副本,确保所有引用类型的成员变量也被克隆。

三、示例解析

        让我们通过一些示例来进一步理解 Cloneable 接口和实现深拷贝的过程。

1、浅拷贝的例子:

class Person implements Cloneable {private String name;private Address address;public Person(String name, Address address) {this.name = name;this.address = address;}@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}
}class Address {private String city;public Address(String city) {this.city = city;}
}public class Main {public static void main(String[] args) throws CloneNotSupportedException {Address address = new Address("Beijing");Person person1 = new Person("Alice", address);Person person2 = (Person) person1.clone();System.out.println(person1 == person2); // falseSystem.out.println(person1.getAddress() == person2.getAddress()); // true}
}

       在上述例子中,类 “Person” 实现了 Cloneable 接口,并重写了 clone() 方法。当克隆一个 “Person” 对象时,只有基本类型的属性会被复制,而引用类型的属性(如 “Address”)则会被复制引用。

2、深拷贝的例子:

class Person implements Cloneable {private String name;private Address address;public Person(String name, Address address) {this.name = name;this.address = address;}@Overridepublic Object clone() throws CloneNotSupportedException {Person clonedPerson = (Person) super.clone();clonedPerson.setAddress((Address) clonedPerson.getAddress().clone());return clonedPerson;}// getters and setters
}class Address implements Cloneable {private String city;public Address(String city) {this.city = city;}@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}// getters and setters
}public class Main {public static void main(String[] args) throws CloneNotSupportedException {Address address = new Address("Beijing");Person person1 = new Person("Alice", address);Person person2 = (Person) person1.clone();System.out.println(person1 == person2); // falseSystem.out.println(person1.getAddress() == person2.getAddress()); // false}
}

        在上述例子中,我们重写了 “Address” 类的 clone() 方法并在 “Person” 类的 clone() 方法中调用它。这样,当克隆一个 “Person” 对象时,不仅会复制基本类型的属性,还会创建一个新的 “Address” 对象。

总结:
        Cloneable 接口提供了一个机制来标记一个类实例可以被克隆。实现深拷贝需要在具体类中实现 Cloneable 接口,并在 clone() 方法中自定义复制对象的过程,确保所有引用类型的成员变量也被克

相关文章:

Java 中的 Cloneable 接口和深拷贝

引言: 在 Java 中,深拷贝是一种常见的需求,它可以创建一个对象的完全独立副本。Cloneable 接口提供了一种标记机制,用于指示一个类实例可以被复制。本文将详细介绍 Java 中的 Cloneable 接口和深拷贝的相关知识&#xff0…...

项目实战:通过axios加载水果库存系统的首页数据

1、创建静态页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href"style/index.css"><script src"script/axios.mi…...

RK3568平台 内存的基本概念

一.Linux的Page Cache page cache&#xff0c;又称pcache&#xff0c;其中文名称为页高速缓冲存储器&#xff0c;简称页高缓。page cache的大小为一页&#xff0c;通常为4K。在linux读写文件时&#xff0c;它用于缓存文件的逻辑内容&#xff0c;从而加快对磁盘上映像和数据的访…...

mysql联合索引和最左匹配问题。

1引言&#xff1a; 如果频繁地使⽤相同的⼏个字段查询&#xff0c;就可以考虑建⽴这⼏个字段的联合索引来提⾼查询效率。⽐如对 于联合索引 test_col1_col2_col3&#xff0c;实际建⽴了 (col1)、(col1, col2)、(col, col2, col3) 三个索引。联合 索引的主要优势是减少结果集数量…...

全球发布|首个AI视角下的生态系统架构解读—《生态系统架构--人工智能时代从业者的新思维》重磅亮相!

点击可免费注册下载 &#x1f447; 人工智能时代的企业架构师必读系列 《生态系统架构--人工智能时代从业者的新思维》 Philip Tetlow、Neal Fishman、Paul Homan、Rahul著 The Open Group Press 2023年11月出版 这本书可以很好地帮助全球架构师使用人工智能来构建、开发和…...

解决torch.hub.load加载网络模型异常

1 torch.hub.load 加载网络模型错误 通过网络使用torch.hub.load加载模型代码如下&#xff1a; self.model torch.hub.load("facebookresearch/dinov2", dinov2_vits14, sourcegithub).to(self.device) 运行网上的项目&#xff0c;经常会卡住或者超时&#xff0c…...

如何获取HuggingFace的Access Token;如何获取HuggingFace的API Key

Access Token通过编程方式向 HuggingFace 验证您的身份&#xff0c;允许应用程序执行由授予的权限范围&#xff08;读取、写入或管理&#xff09;指定的特定操作。您可以通过以下步骤获取&#xff1a; 1.首先&#xff0c;你需要注册一个 Hugging Face 账号。如果你已经有了账号…...

How to resolve jre-openjdk and jre-openjdk-headless conflicts?

2023-11-05 Archlinux 执行 pacman -Syu 显示 failed to prepare transaction&#xff1b;jre-openjdk and jre-openjdk-headless conflicts 解决 archlinux sudo pacman -Sy jdk-openjdk...

setTimeout和setImmediate以及process.nextTick的区别?

目录 前言 setTimeout 特性和用法 setImmediate 特性和用法 process.nextTick 特性和用法 区别和示例 总结 在Node.js中&#xff0c;setTimeout、setImmediate和process.nextTick是用于调度异步操作的三种不同机制。它们之间的区别在于事件循环中的执行顺序和优先级。…...

read 方法为什么返回 int 类型

在Java的输入流&#xff08;InputStream&#xff09;中&#xff0c;read方法返回int类型的值的原因是为了提供更多的信息和灵活性。虽然这可能看起来有些不直观&#xff0c;但有一些合理的考虑和用途&#xff0c;主要包括以下几点&#xff1a; EOF标志&#xff1a;read方法返回…...

在二维矩阵/数组中查找元素 Leetcode74, Leetcode240

这一类题型中二维数组的元素取值有序变化&#xff0c;因此可以用二分查找法。我们一起来看一下。 一、Leetcode 74 Leetcode 74. 搜索二维矩阵 这道题要在一个二维矩阵中查找元素。该二维矩阵有如下特点&#xff1a; 每行元素 从左到右 按非递减顺序排列。每行的第一个元素 …...

MS35657步进电机驱动器可兼容DRV8824

MS35657 是一款双通道 DMOS 全桥驱动器&#xff0c;可以驱动一个步进电机或者两个直流电机。可兼容DRV8824&#xff08;功能基本一致&#xff0c;管脚不兼容&#xff09;。每个全桥的驱动电流在 24V 电源下可以工作到 1.4A。MS35657 集成了固定关断时间的 PWM 电流校正器&#…...

SQL语句性能优化

1、查询 SQL 尽量不要使用 select *,而是 select 具体字段 反例子: select * from sys_user; 正例子: select id,name from sys_user; 理由如下: 只取需要的字段,节省资源、减少网络开销。select * 进行查询时,很可能就不会使用到覆盖索引了,就会造成回表查询。…...

线性代数之 伪逆矩阵

目录 一、伪逆矩阵 ◼ A的伪逆矩阵与SVD ◼ 用Python代码计算A的伪逆矩阵 ◼ 笔算A的伪逆矩阵 一、伪逆矩阵 ◼ A的伪逆矩阵与SVD 逆矩阵并不总是存在&#xff0c;即使是方阵。然而&#xff0c;对于非正方形矩阵&#xff0c;存在一个伪逆矩阵&#xff0c;也叫摩尔-彭罗斯…...

【3D图像分割】基于Pytorch的VNet 3D 图像分割5(改写数据流篇)

在这篇文章&#xff1a;【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割2&#xff08;基础数据流篇&#xff09; 的最后&#xff0c;我们提到了&#xff1a; 在采用vent模型进行3d数据的分割训练任务中&#xff0c;输入大小是16*96*96&#xff0c;这个的裁剪是放到Dataset类…...

【漏洞复现】Apache_Shiro_1.2.4_反序列化漏洞(CVE-2016-4437)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞分析3、漏洞验证 说明内容漏洞编号CVE-2016-4437漏洞名称Apache_Shiro_1.2.4_反序列化漏洞漏洞评级…...

Mac连接linux的办法(自带终端和iterm2)

1. 使用Mac自带终端Terminal 1.1 点击右上角的聚焦搜索&#xff0c;再输入终端 1.2 查找linux系统的ip地址 在虚拟机里输入如下命令&#xff0c;找到蓝色区域的就是ip地址 ip addr 如果没有显示ip地址&#xff0c;可以重新安装一下虚拟机&#xff0c;之后确保以太网的连接是打…...

js调整table表格上下相邻元素顺序

有时候我们会遇到要通过箭头控制table表格上下顺序的需求,如下: 点击向下就将该元素下移一位,下面的一位元素就移上来,点击向上就将该元素上移一位,上面的一位元素就移下来,也就是相邻元素互换位置顺序: <el-table :data="targetTable" border style=&quo…...

基于ruoyi框架项目-部署到服务器上

基于ruoyi框架项目-部署到服务器上 文章目录 基于ruoyi框架项目-部署到服务器上1.前端vue编译&#xff0c;后的dist下内容打包&#xff08;前后端分离版本需要&#xff09;2.后端打包成jar包&#xff08;如果是thymeleaf仅需打包jar&#xff09;3.上传到服务器目录下4. docker部…...

Docker 持久化存储和数据共享_Volume

有些容器会自动产生一些数据&#xff0c;为了不让数据随着 container 的消失而消失&#xff0c;保证数据的安全性。例如&#xff1a;数据库容器&#xff0c;数据表的表会产生一些数据&#xff0c;如果我把 container 给删除&#xff0c;数据就丢失。为了保证数据不丢失&#xf…...

Cesium 三维地图开发实战:主流在线底图(天地图、高德、百度等)的集成与坐标纠偏方案

1. 三维地图开发中的底图选择困境 第一次用Cesium加载国内在线地图时&#xff0c;我被满屏错位的道路和建筑搞懵了。明明在二维地图里精准对齐的学校操场&#xff0c;在三维场景里却飘到了隔壁小区。这种"灵魂出窍"般的偏移现象&#xff0c;其实是不同坐标系之间的&q…...

如何用快马平台为网站开发公司快速生成企业官网原型,提升方案演示效率

作为一名经常需要快速响应客户需求的网站开发者&#xff0c;我最近发现了一个能大幅提升工作效率的好方法 - 使用InsCode(快马)平台来生成企业官网原型。这个方法特别适合像我们华网三百每年.cn这样需要快速为客户提供方案演示的网站开发公司。 需求分析阶段 当接到一个新客户…...

EC2Instances.info未来发展规划:AI驱动的智能实例推荐系统

EC2Instances.info未来发展规划&#xff1a;AI驱动的智能实例推荐系统 【免费下载链接】ec2instances.info Amazon EC2 instance comparison site 项目地址: https://gitcode.com/gh_mirrors/ec/ec2instances.info EC2Instances.info作为专业的Amazon EC2实例比较平台&a…...

openEuler系统下NFS服务器配置实战:多场景权限管理与安全优化

1. NFS服务基础与openEuler环境准备 NFS&#xff08;Network File System&#xff09;是Linux系统中实现文件共享的经典方案&#xff0c;它允许不同主机通过网络访问远程文件系统&#xff0c;就像操作本地文件一样方便。在openEuler这个企业级Linux发行版上配置NFS服务&#xf…...

Maestro Studio终极指南:零代码可视化移动应用测试,5分钟上手自动化

Maestro Studio终极指南&#xff1a;零代码可视化移动应用测试&#xff0c;5分钟上手自动化 【免费下载链接】maestro Painless E2E Automation for Mobile and Web 项目地址: https://gitcode.com/GitHub_Trending/ma/maestro 还在为复杂的移动应用测试流程而烦恼吗&am…...

WebGL开发者必备:用RenderDoc旧版本抓帧调试的完整避坑指南(附DEBUG_CHROME.bat脚本)

WebGL开发者必备&#xff1a;用RenderDoc旧版本抓帧调试的完整避坑指南&#xff08;附DEBUG_CHROME.bat脚本&#xff09; 最近在WebGL开发中遇到一个棘手问题&#xff1a;最新版RenderDoc已经禁止了对Chrome等浏览器的抓帧功能。这对于正在学习图形学课程&#xff08;比如GAMES…...

Vivado MIG IP核实战:DDR3控制器配置与仿真全流程解析

1. Vivado MIG IP核与DDR3控制器基础认知 第一次接触DDR3控制器时&#xff0c;我被那些密密麻麻的时序图吓得不轻。直到发现Xilinx的MIG&#xff08;Memory Interface Generator&#xff09;IP核&#xff0c;才明白原来FPGA开发可以这么"偷懒"。这个IP核就像个贴心的…...

XposedRimetHelper:突破地理限制的系统级定位解决方案

XposedRimetHelper&#xff1a;突破地理限制的系统级定位解决方案 【免费下载链接】XposedRimetHelper Xposed 钉钉辅助模块&#xff0c;暂时实现模拟位置。 项目地址: https://gitcode.com/gh_mirrors/xp/XposedRimetHelper 一、移动办公的地理枷锁&#xff1a;企业考勤…...

多宽带联网(五) OpenWrt中MWAN3高级策略分流实战(游戏加速、视频优化场景)

1. MWAN3策略分流的核心价值 家里拉了两条宽带却发现刷视频卡、打游戏延迟高&#xff1f;这种情况我遇到过太多次了。去年给朋友家调试网络时&#xff0c;他同时接了电信和联通两条200M宽带&#xff0c;但看4K视频还是缓冲&#xff0c;玩外服游戏延迟总在200ms以上。后来用Open…...

3个核心功能让Windows优化变得如此简单:Winhance中文版深度体验

3个核心功能让Windows优化变得如此简单&#xff1a;Winhance中文版深度体验 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Wi…...