Java 克隆:复制构造函数与克隆

为了实现克隆,我们需要配置我们的类并遵循以下步骤:

在我们的类或其超类或接口中实现 Cloneable 接口。
定义一个应处理 CloneNotSupportedException(抛出或记录)的 clone() 方法。
并且,在大多数情况下,我们从clone()方法中调用超类的clone()方法。
Java 克隆与复制构造函数
super.clone() 将调用它的 super.clone(),并且链将继续,直到调用到达 Object 类的 clone() 方法,该方法将创建一个字段到我们对象的字段 mem 副本并将其返回。

与一切事物一样,克隆也有其优点和缺点。然而,Java 克隆因其设计问题而闻名,但它仍然是当今最常见和流行的克隆策略。

Object.clone() 的优点
正如前面提到的,Object.clone() 存在许多设计问题,但它仍然是最流行和最简单的复制对象的方法。使用clone()的一些优点是:

克隆需要的代码行少得多——只需一个具有 4 行或 5 行长的 clone() 方法的抽象类,但如果我们需要深度克隆,我们将需要重写它。
这是复制对象的最简单方法,特别是当我们将其应用于已经开发的或旧的项目时。我们只需要定义一个父类,在其中实现 Cloneable,提供clone() 方法的定义,就可以了。我们父母的每个孩子都将获得克隆功能。 
我们应该使用克隆来复制数组,因为这通常是最快的方法。
从版本 1.5 开始,在数组上调用克隆会返回一个数组,其编译时类型与被克隆的数组的编译时类型相同,这显然意味着在数组上调用克隆不需要类型转换。
Object.clone() 的缺点
以下是导致许多开发人员不使用 Object.clone() 的一些缺点:

使用 Object.clone() 方法需要我们在代码中添加大量语法,例如实现 Cloneable 接口、定义 Clone() 方法并处理 CloneNotSupportedException,最后调用 Object.clone() 并将其强制转换到我们的对象上。
Cloneable 接口缺少clone() 方法。实际上,Cloneable是一个标记接口,里面没有任何方法,我们仍然需要实现它只是为了告诉JVM我们可以对我们的对象执行clone()。
Object.clone() 是受保护的,因此我们必须提供自己的clone() 并从中间接调用Object.clone()。
我们无法控制对象构造,因为 Object.clone() 不会调用任何构造函数。
如果我们在子类(例如Person)中编写clone方法,那么它的所有超类都应该在其中定义clone()方法或从另一个父类继承它。否则, super.clone() 链将会失败。
Object.clone() 仅支持浅复制,因此新克隆的对象的引用字段仍将保留原始对象的字段所保留的对象。为了克服这个问题,我们需要在我们的类持有引用的每个类中实现clone(),然后在我们的clone()方法中单独调用它们的克隆,如下例所示。
我们无法在 Object.clone() 中操作 Final 字段,因为 Final 字段只能通过构造函数更改。在我们的例子中,如果我们希望每个 Person 对象的 id 都是唯一的,那么如果使用 Object.clone(),我们将得到重复的对象,因为 Object.clone() 不会调用构造函数,并且最终的 id 字段不能修改自 Person.clone()。

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

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

相关文章

Ubuntu上svn基本使用(gitee提交下载)

目录 环境准备 1. 获取代码到本地 直接获取 获取代码时加入用户名密码 指定版本更新 2. 提交代码 3. 展示代码列表 4. 添加代码文件(目录) 5. 删除gitee仓库中的文件 参考文档链接 环境准备 当前操作系统为Ubuntu22.04LTS gitee 创建仓库时 需要打开svn的支持 sudo…

GoLong的学习之路,进阶,微服务之使用,RPC包(包括源码分析)

今天这篇是接上上篇RPC原理之后这篇是讲如何使用go本身自带的标准库RPC。这篇篇幅会比较短。重点在于上一章对的补充。 文章目录 RPC包的概念使用RPC包服务器代码分析如何实现的?总结Server还提供了两个注册服务的方法 客户端代码分析如何实现的?如何异步…

nginx配置正向代理支持https

操作系统版本: Alibaba Cloud Linux 3.2104 LTS 64位 nginx版本: nginx-1.25.3 1. 下载软件 切换目录 cd /server wget http://nginx.org/download/nginx-1.25.3.tar.gz 1.1解压 tar -zxvf nginx-1.25.3.tar.gz 1.2切换到源码所在目录…

【探索Linux】—— 强大的命令行工具 P.21(多线程 | 线程同步 | 条件变量 | 线程安全)

阅读导航 引言一、线程同步1. 竞态条件的概念2. 线程同步的概念 二、条件变量1. 条件变量函数⭕使用前提(1)初始化条件变量(2)等待条件满足(3)唤醒等待pthread_cond_broadcast()pthread_cond_signal() &…

JavaGUI详解

GUI Java GUI**1、Java GUI 概述****2、容器****2、1 窗口****2、2 弹窗和对话框****对话框****自定义弹窗** **2、3 面板****普通面板****滚动面板****分隔面板****选项卡面板** **3、布局****3.1、流式布局****3.2、网格布局****3.3、边框布局****4、组件****4.1、基本组件**…

Steampipe的安装部署及简单使用(附带AWS CLI的安装与使用)

介绍 Steampipe 将 API 和服务公开为高性能关系数据库,使您能够编写基于 SQL 的查询来探索动态数据。Mods 通过使用简单 HCL 构建的仪表板、报告和控件扩展了 Steampipe 的功能。 官网:https://steampipe.io/ steampipe的安装 下载脚本并执行 sudo /…

Unity优化——批处理的优势

大家好,这里是七七,前段时间在忙一些事情,最近终于有空来更新优化篇了。本文本打算分为上下两篇,但为了看更方便,就多花了几天写成一文发布,具体是介绍了图形优化中批处理的具体效果,虽然本文篇…

【Linux】cat 命令使用

cat 命令 cat(英文全拼:concatenate)命令用于连接文件并打印到标准输出设备上。 可以使用cat连接多个文件、创建新文件、将内容附加到现有文件、查看文件内容以及重定向终端或文件中的输出。 cat可用于在不同选项的帮助下格式化文件的输出…

LV.13 D1 嵌入式系统移植导学 学习笔记

一、嵌入式系统分层 操作系统:向下管理硬件、向上提供接口 操作系统为我们提供了: 1.进程管理 2.内存管理 3.网络接口 4.文件系统 5.设备管理 那系统移植是干什么呢? 就是将Linux操作系统移植到基于ARM处理器的开发板中。 那为什么要移植系…

【calcitonin ; 降钙素 ;降钙素原】

Parathyroid_Hormone -甲状旁腺激素 PTH ; 特立帕肽;

『OPEN3D』1.8.2 全局ICP配准

前文提到的多种icp方式均需要初始的变换函数作为配准过程的初始值,并在该初始值上进行迭代优化得到结果;那么global icp为前面这些精配准的icp提供了初始变换函数。因此global ICP配准后可视化的点云结果可能没有完全配准,需要再进行一次精配准操作。 global icp需要对点云提…

lightdb plorasql集合类型新增可变数组

文章目录 背景集合类型可变数组可变数组示例 背景 在信创适配中,从Oracle迁移过来的存储过程使用到可变数组。因此在LightDB-X 23.4版本中对现有的集合类型进行了增强,添加了可变数组类型。 集合类型 在LightDB-X 23.4版本开始plorasql支持的集合类型…

【SQL开发实战技巧】系列(四十八):Oracle12C常用新特性☞多分区操作和管理

系列文章目录 【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧…

K8s构建的mysql无法远程连接

最近在写一个老师布置的大作业,都是老师写好的yaml文件,都是没问题的,但是构建的mysql无法远程连接。 尝试了网上的很多方法,都失败了,我的构建过程应该是没什么错误的,所以网上的方法并不奏效&#xff0c…

【小白专用】Sql Server 连接Mysql 更新23.12.09

目标 已知mysql连接参数(地址和用户),期望通过Microsoft Sql Server Management Studio (以下简称MSSSMS)连接Mysql,在MSSSMS中直接查询或修改Mysql中的数据。 一般是选最新的版本下载。 选64位还是32位&a…

C++ 对象的初始化和清理:构造函数和析构函数

目录 构造函数和析构函数 构造函数 析构函数 构造函数的分类及调用 括号法 显示法 隐式转换法 拷贝构造函数的调用时机 使用一个已经创建完毕的对象来初始化一个新对象 值传递的方式给函数参数传值 以值方式返回局部对象 构造函数调用规则 初始化列表 类对象作…

【Java 基础】27 XML 解析

文章目录 1.SAX 解析器1)什么是 SAX2)SAX 工作流程初始化实现事件处理类解析 3)示例代码 2.DOM 解析器1)什么是 DOM2)DOM 工作流程初始化解析 XML 文档操作 DOM 树 3)示例代码 总结 在项目开发中&#xff0…

Jupyter notebook修改背景主题

打开Anaconda Prompt,输入以下内容 1. pip install --upgrade jupyterthemes 下载对应背景主题包 出现Successfully installed jupyterthemes-0.20.0 lesscpy-0.15.1时,说明已经下载安装完成 2. jt -l 查看背景主题列表 3. jt -t 主题名称(…

【LeeCode】18.四数之和

给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; 0 < a, …

mysql的BIT数值类型

MySQL :: MySQL 8.2 Reference Manual :: 11.1.5 Bit-Value Type - BIT MySQL :: MySQL 8.2 Reference Manual :: 9.1.5 Bit-Value Literals BIT类型用来存放bit值&#xff0c;每一位是0或者1&#xff0c;允许1-64位。 例如&#xff0c;下面表定义了new这列的类型为8位的BIT…