怎样理解 Object 类中的 clone() 方法?

news2024/12/24 22:11:05

目录

1. clone() 方法说明

2. JVM 内存模型

3. 浅拷贝(浅克隆)与深拷贝(深克隆)的区别

4. 使用 clone() 克隆方法需要注意的事项

5. Object 类中的 clone() 方法为浅克隆


1. clone() 方法说明

clone() 方法是 Java.lang.Object 类中已经定义好的一个方法,该方法的主要作用是可以克隆一个对象。

2. JVM 内存模型

再往下继续了解之前,我们要先简单了解JVM的内存模型。在 Java 中,数据主要分为基本数据类型和引用数据类型,它们在内存中的分布也是不同的。

JVM 我们主要可以划分 JVM栈,堆,方法区(元空间),本地方法栈,程序计数器为五个部分,这里我们重点关注 JVM栈,堆,方法区。

JVM栈:运行我们所编写的方法,存储临时变量;

堆:存储引用数据类型的,例如对象;

方法区:存储 static 静态方法和类加载器;

3. 浅拷贝(浅克隆)与深拷贝(深克隆)的区别

Java中的数据类型主要分为基本数据类型和引用数据类型。基本数据类型是在各自的JVM栈中存储,而引用数据类型则是在堆中存储,JVM栈中的对象保存的不过是堆中对象的内存地址。

clone() 克隆方法又可以分为浅拷贝与深拷贝,浅拷贝与深拷贝最本质的区别就在于它们对于不同的数据类型拷贝时做的行为是不一样的。

浅拷贝:基本数据类型会复制一份完整的值,而引用数据类型则是复制一份内存地址,也就是说复制出来的对象和原来的对象引用同一个对象。

深拷贝:不仅基本数据类类型会复制一份完整的值,而且引用数据类型也会复制一份完整的值,字符串会复用字符串常量池中的值。也就是说原来的对象也复制了一份,两者操作的是不同的对象。

4. 使用 clone() 克隆方法需要注意的事项

(1)如果想要克隆一个对象,那么被克隆对象的类必须实现 Cloneable 接口,如下图所示,该接口也定义在 java.lang 包下,接口中什么都没有定义,像这种接口被称为标记型接口,没有实际意义,只是做一个标记,表示该类的对象可以被克隆,不标记则不可以;这一点与 Serializable 序列化接口极其相似。

(2)克隆对象调用 clone() 方法时,必须重写父类 Object 中的 clone() 方法,如下图所示,clone() 方法的修饰符为 protected。

被 protected 修饰的方法只能在本包中访问,或者在该类的子类中访问。

所以就有一个问题,我们的代码肯定不能在 java.lang 包下编写,而我们的业务类通常为了能够调用 clone() 去继承实体类,因为可能需要继承其他类,两种办法都行不通,所以我们不许重写父类 Object 中的 clone() 方法,扩大访问权限,才能够调用。

5. Object 类中的 clone() 方法为浅克隆

上面说到了调用 clone() 方法需要重写父类 Object 类中的 clone() 方法,如下部分代码

public class Users implements Serializable,Cloneable {
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

默认重写方法实际上还是调用的父类 Object 类中的方法,只是通过重写的方式让访问范围变大了,我们也可以将 protected 改为 public 。

而且默认重写方法采用的是浅拷贝,如果被克隆对象中含有引用数据类型,只会复制其对象的内存地址,和被克隆的对象操作同一引用数据类型。

如果想使用深拷贝,就只能在重写父类的 clone() 方法中自行添加其他逻辑处理变为深拷贝。

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

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

相关文章

文心一言、讯飞星火与GPT-4/3.5在回答中文历史问题的表现

最近,随着备受关注的文心一言正式免费向全社会开放,再次引起了社会层面对国产大模型的兴趣。 以文心一言为代表的国产大模型性能究竟如何?如果将它们相互比较,并且和GPT系列模型等国际前沿水平的LLM进行比较,会得到什么…

【系统设计系列】 应用层与微服务

系统设计系列初衷 System Design Primer: 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版: https://github.com/donnemart…

超全60000多字详解 14 种设计模式 (多图+代码+总结+Demo)

超全60000多字详解 14 种设计模式 (多图代码总结Demo) 之前读耗子叔文章时,看到过有句话没有实践,再多的理论都是扯淡,个人很赞同。你觉得自己学会了,但实践与学会之间有着很大差别。 单例模式 (Singleton Pattern) 定义或概念 …

水滴图 echarts lable失真显示很多9 水滴图 显示99999999

解决办法: 添加一个 seriesName lable用seriesName <template><div ref"EchartLiquidfill" class"EchartLiquidfill" :style"{ width: width }" /> </template><script> export default {name: "EchartLiquidfil…

第8章 驱动模块编译进内核实验(iTOP-RK3568开发板驱动开发指南 )

通过上一章的学习&#xff0c;我们学会了使用menuconfig图形化配置工具&#xff0c;以及了解了menuconfig相关的文件&#xff1a;Kconfig .config XXXdefconfig。本章节学习将helloworld驱动编译进内核。 输入“cd drivers/char”进入到 drivers/char 目录下&#xff0c;然后输…

2023工博会,正运动超高速PCIe实时运动控制卡应用预览(一)

展会倒计时&#xff1a;11天 本次的中国国际工业博览会正运动技术将携超高速PCIe实时运动控制卡亮相。 •为智能装备提供高速高精运动控制解决方案&#xff1b; •内部搭载运动控制实时内核MotionRT7; •提供多路高速IO输入输出&#xff0c;具备多种实时运动控制功能&#x…

Maven安装(超详解)

下载地址:Maven – Download Apache Maven 在提供的资料中,已经提供了下载好的安装包。如下 1、解压 apache-maven-3.9.4-bin.zip(解压即安装) bin目录 : 存放的是可执行命令。(mvn 命令重点关注) conf目录 :存放Maven的配置文件。(settings.xml配置文件后期需要修改)…

Unity中的场景加载

1、同步场景 2、异步加载 3、保留物体到下个场景中

vue 前端 问题整理

列表显示字典数据 template里面的vue代码 <el-table-column label"性别" align"center" prop"sex"><template #default"scope"> <!-- <dict-tag :optionssysUserSex :value"scope.row.sex&quo…

HTTP代理与代理IP的区别

HTTP代理和代理IP是网络安全和隐私保护中常用的两种工具。HTTP代理是一种代理服务器&#xff0c;它使用HTTP协议来转发客户端请求和响应目标服务器的响应。代理IP是一种匿名代理服务器&#xff0c;它隐藏了用户的真实IP地址&#xff0c;以保护用户的隐私和安全。本文将介绍HTTP…

从“13天”到“0天”延时,揭秘幸福里离线SLA保障最佳实践

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 “幸福里”是抖音集团旗下集内容、社区、工具于一体的房产媒体综合信息平台&#xff0c;致力于提供多样化房产资讯、定制找房需求。随着幸福里业务发展&#xff0c;…

注塑机数据采集的数据类型 物理量种类

1.状态数据&#xff1a;运行、停机、故障、待机等机台状态数据&#xff1b; 2.产量数据&#xff1a;模次、产量数据&#xff1b; 3.效率数据&#xff1a;稼动率、节拍、运行时间、停机时间、故障时间、待机时间等数据&#xff1b; 4.工艺数据&#xff1a;工艺数据保存、调机…

驱动开发--day2(内核不同模块的相互访问、字符设备驱动、led控制实验代码及现象)

实现三盏灯的控制&#xff0c;编写应用程序测试 head.h #ifndef __HEAD_H__ #define __HEAD_H__#define LED1_MODER 0X50006000 #define LED1_ODR 0X50006014 #define LED1_RCC 0X50000A28#define LED2_MODER 0X50007000 #define LED2_ODR 0X50007014#endif mychrdev.c #inc…

关于andriod App开发---查看与导出logcat日志内容

adb rootadb remountadb logcat&#xff08;开始打印指令&#xff09;按住 CtrlC&#xff08;终止打印指令&#xff09;保存日志指令&#xff1a;adb logcat -v time >D:\log\logcat.txt日志导出完成&#xff08;如下图&#xff09; 抓包工具&#xff1a; Charles(IOS 基础…

长春泛域名证书和通配符证书有什么区别

通配符SSL证书是一种数字证书&#xff0c;只是因为数字证书保护的域名数量或者类型不一样&#xff0c;将数字证书分为了单域名SSL证书、多域名SSL证书和通配符SSL证书三种。今天就随SSL盾小编了解通配符SSL证书和泛域名SSL证书的关系。 1.根据保护的域名类型&#xff0c;通配符…

传感器融合带来多重好处

传感器融合是一个热门话题&#xff0c;正好与物联网的增长趋势相吻合&#xff0c;尤其是与自动驾驶汽车和先进的驾驶员辅助系统&#xff08;ADAS&#xff09;相连。这个概念本身并不是什么新鲜事物。在Google Scholar上进行的搜索确定了可追溯到1960年代或更早的概念。但是如今…

云服务器下如何部署Flask项目详细操作步骤

参考网上各种方案&#xff0c;再结合之前学过的Django部署方案&#xff0c;最后确定Flask总体部署是基于&#xff1a;centos7nginxuwsgipython3Flask之上做的。 本地windows开发测试好了我的OCR项目&#xff0c;现在要部署我的OCR项目到云服务器上验证下。 第一步&#xff1a…

调用API接口的一些注意技巧

在实践中我们经常发现&#xff0c;很多同学都是直接请求调用和读取接口数据&#xff0c;而没有做状态码的判断&#xff0c;这在设计角度是非常不合理的。 另外&#xff0c;对于一些实时性要求不高的接口&#xff0c;更合理的做法应该是先把数据拉到本地缓存&#xff0c;再从缓存…

sql server 设置字段自增

1.将字段设置为主键&#xff1b; 2.将“标识规范”设置为是&#xff0c;这里注意切勿将默认值设置为0&#xff0c;否则无法选择“标识规范”

mybatis初体验(细节满满)

1.创建数据表&#xff08;库名为&#xff1a;mayikt&#xff09; CREATE TABLE mayikt_user (id int NOT NULL AUTO_INCREMENT,username varchar(20) DEFAULT NULL,userpwd varchar(20) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT9 DEFAULT CHARSETutf8mb3…