如何理解Java Clone对象

基于 openEuler 24.03 LTS 源码编译安装 Zabbix 7.4 Zabbix是一款开源的企业级分布式监控系统,支持网络、服务器、应用等多种IT资源的监控。核心功能包括数据采集、告警通知、可视化展示等,采用Server/Agent架构,支持多种操作系统。本文详细介绍了在openEuler 24.03系统上部署Zabbix 7.4.2的完整流程,包括环境准备、MySQL配置、PHP/Apache安装、Zabbix编译安装等步骤,为构建企业级监控系统提供了实践指导。 阅读详情

为什么要使用clone(克隆)?

在实际编程过程中,我们常常要遇到这种情况:有一个对象 A,在某一时刻 A 中已经包含了一些
有效值,此时可能会需要一个和 A 完全相同新对象 B,并且此后对 B 任何改动都不会影响到 A 中
的值,也就是说,A 与 B 是两个独立的对象,但 B 的初始值是由 A 对象确定的。在 Java 语言中,
用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现 clone() 方法
是其中最简单,也是最高效的手段。

new一个对象的过程和clone一个对象的过程区别

new 操作符的本意是分配内存。程序执行到 new 操作符时,首先去看 new 操作符后面的类型,
因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充
对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的
引用(地址)发布到外部,在外部就可以使用这个引用操纵这个对象。clone 在第一步是和 new
相似的,都是分配内存,调用 clone 方法时,分配的内存和原对象(即调用 clone 方法的对象)
相同,然后再使用原对象中对应的各个域,填充新对象的域,填充完成之后,clone 方法返回,
一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。

clone对象的使用

复制对象和复制引用的区别
Person p = new Person(21,"Tom");
Person p1 = p;
System.out.println(p);
System.out.println(p1);

输出结果为两个相同的地址,说明是同一对象,可以把这种现象叫做引用的复制。

com.gph.base.Person@1fb3ebeb
com.gph.base.Person@1fb3ebeb
上面代码执行完成之后, 内存中的情景如下图所示:

复制对象的引用

而下面的代码是真真正正的克隆了一个对象。
Person p = new Person(21,"Tom");
Person p1 = (Person)p.clone();
System.out.println(p);
System.out.println(p1);

从打印结果可以看出,两个对象的地址是不同的,也就是说创建了新的对象, 而不是把原对象的地址赋给了一个新的引用变量:

com.gph.base.Person@1fb3ebeb
com.gph.base.Person@548c4f57

拷贝了对象
注:使用clone() 方法需要该类实现Cloneable接口 以及重写 clone()方法。

深拷贝和浅拷贝

Person p = new Person(23, "zhang");
Person p1 = (Person) p.clone();
String result = p.getName() == p1.getName() ? "clone 是浅拷贝的" : "clone 是深拷贝的";
System.out.println(result);

输出结果

clone 是浅拷贝的

所以,clone 方法执行的是浅拷贝, 在编写程序时要注意这个细节。

如何进行深拷贝?

如果想要深拷贝一个对象,这个对象必须要实现 Cloneable 接口,实现 clone方法,
并且在 clone 方法内部,把该对象引用的其他对象也要 clone 一份,这就要求这个
被引用的对象必须也要实现Cloneable 接口并且实现 clone 方法。

举个例子:
现在有Person类和Face类,人有一张脸,如果现在我要克隆一个人,
是两个人共用一张脸 还是 复制一张同样的脸?

显然是后者。 那么结合代码, Person类组合了 Face 类,要想深拷贝
Person 类,必须在 Person类的 clone 方法中将 Face类也要拷贝一份。

Person类

public class Person implements Cloneable{
	public Face face;

	public Person(){}

	public Person(Face face){ this.face = face;}
	@Override
	protected Object clone() throws CloneNotSupportedException{
		Person p = (Person)super.clone();
		p.face = (Face)face.clone();
		return p;
	}
}

Face类

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

Main方法

  		Person p = new Person(new Face());
        Person p1 = (Person) p.clone();
        System.out.println("p==p1 :"+ (p==p1) );
        System.out.println("p.face==p1.face:"+ (p.face==p1.face) );

输出结果:

p==p1 :false
p.face==p1.face:false
【考研复试】西安电子科技大学上机题 阅读详情

相关推荐

在x86机器上运行jailhouse

jailhouse jaihouse提供了一个demo ,https://github.com/siemens/jailhouse-images可以用于编译一整套可用的demo。 适用于多个平台。编译过程主要参考https://blog.youkuaiyun.com/weixin_39541632/article/details/110422345 此demo可以生成多个平台所用的操作系统image。 ...

闲人的专栏 3004

Clone对象

这篇文章来源于《java面试宝典》抱歉忘了引用地址:想发布为引用文章的,但是没有引用地址这个必填项,暂且作为原创吧,毕竟里面的部分文字和代码自己敲的; 1、Clone 在编程中我们会遇到这种情况,目前:有一个对象A已经有许多有效的数值,此时我们需要对象B 和A一致,并且对B的以后的修改不影响A的值,就是A与B是两个独立的值,但是B的初始值是A,clone就是实现这种操作最简单的方法: 就像:cop...

xiaocaodeshengri的博客 283

计算机网络实验六 RIP 配置实验

Man! What can I say?

AClerk的博客 1592

深入理解Java中的clone对象

在实际编程过程中,我们常常遇到这种情况:有一个对象 A,需要一个和 A 完全相同新对象 B,并且此后对 B 任何改动都不会影响到 A 中的值,也就是说,A 与 B 是两个独立的对象,但 B 的初始值是由 A 对象确定的。在 Java 语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现 clone()方法是其中最简单,也是最高效的手段。

2302_77758423的博客 2226

糖尿病预测(深度学习pytorch实现-最新)

本次做的项目是糖尿病的预测,也是来自kaggle上面的一个小项目。根据一个人的怀孕次数、血糖、血压、皮肤厚度、胰岛素指标、身体质量指数、糖尿病谱系指数、年龄等身体参数来预测一个人是否患有糖尿病。

NangoGreen的博客 5356

GameFramework框架详解之 DataTable配置表模块

一.前言: DataTable模块是项目的配置表模块,配置表一般是从excel导出csv/json/xml格式的,之所以是excel作为源文件,原因是因为策划同学使用配表最方便。然后一键导出到项目中,除了csv/json/xml配置文件外,一般还会伴随着导出配置的实体类,这样研发同学就可以使用了。GameFramework的DataTable模块也是秉持着这种一贯的策略来实现的。 二.DataRow DataRow在excel数据表中,对应的是一行数据,而在代码中对应的其实就是一条数据对象。 接口IData

TxNet 4724

Object类中的clone()方法

1要在类中实现Cloneable接口(异常的知识)2重写clone()方法,把throws CloneNotSupportedException放在main方法后面(异常的知识可以先后续学了在了解)3.强制类型转换成要克隆的对象的类型(因为clone返回Object类型)4.克隆方法是浅拷贝(接下来介绍)

HYY的博客 2618

22h2版本的win10安装Docker Desktop时页面空白

摘要:Windows10 22H2系统重装Docker时出现安装界面卡死问题,通过管理员CMD执行静默安装命令解决。命令指定了WSL-2后端及多个自定义数据存储路径(安装目录、Hyper-V数据、Windows容器数据、WSL数据),安装需等待几分钟。最终验证安装成功。

猿小白的博客 654

【Java SE基础】如何理解clone对象?

分配完内存之后,再调用构造函数,来填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象就创建完毕了,可以把他的引用(地址)发布到外部,在外部就可以使用这个引用来操作这个对象了。而clone在第一步和new是相似的,也是先分配内存,在调用clone()方法时,分配的内存和原对象(即调用clone方法的对象)相同,然后再使用原对象中对应的各个域,来填充新对象的域,填充完成之后,clone()方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。(对象在堆空间分配)

apple_64847327的博客 1218

CSP - 2024 普及组初赛试题及解析

CSP - 2024 普及组初赛试题及解析

QD_Jason的博客 2909

从0到1构建数据分析AI Agent:数据采集、洞察生成与报告自动化

在企业数字化转型的今天,数据分析师80%的时间被消耗在重复取数、数据清洗、报表排版等低价值劳动上,真正用于深度业务洞察和决策支持的时间不足20%。本文将从核心概念、技术原理、代码实现、落地实践全维度,教你从0到1搭建一套完整的数据分析AI Agent系统,实现「用户用自然语言提需求→Agent自动采集多源数据→AI自动挖掘业务洞察→自动生成符合业务要求的多格式报告」的全链路自动化,平均可将需求响应速度从天级压缩到分钟级,释放70%以上的分析师人力成本。

AI Python 编程之道的博客 471

java clone 对象_java对象clone

java克隆为什么需要克隆我们在很多时候需要使用一个对象去记录另外一个对象的当前状态,对象中可能会有很多属性,如果我们一个一个去设置,不仅不方便,而且效率很低,我们看一个初学者可能遇到的问题class Person{String name;int age;public Person() {}public Person(String name, int age) {super();this.name...

weixin_35411480的博客 369

新手必看:C#调用YOLO模型完成图片/视频目标检测(上位机版)

新手学习C#调用YOLO模型,核心是先把基础流程跑通,再逐步优化。图片检测是基础,视频检测就是在图片的基础上加循环和线程,而上位机的实际项目,就是在这个基础上适配工业硬件和业务需求。本文的代码都是新手能直接复制运行的,如果你运行时遇到问题,先检查前期准备是否到位,再看避坑指南。记住,新手别追求一步到位,先实现功能,再慢慢优化性能和界面。等你能熟练调用YOLO模型后,再去研究模型训练、量化优化等进阶内容,会轻松很多。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 984

每天一道Java面试题——如何理解clone对象?

1.为什么要用clone? 在实际编程过程中,我们常常要遇到这种情况: 有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和 A 完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在 Java 语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,...

qq_41582351的博客 302

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

利用clone方法加速对象的构建

一 概述 Java语言中的所有对象都是继承自java.lang.Object类,在java.lang.Object类中存在一个clone方法。 protected native Object clone() throws CloneNotSupportedException; 该方法的作用为返回Object对象的拷贝。 二 clone方法特性 1. 拷贝对象是一个新对象,而不是一个对象的引用地址。 2. 拷贝对象与用new关键字返回的区别是,...

calm_encode的博客 788

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java赋值两个对象数组 clone_有关java对象数组的clone问题

有关java对象数组的clone问题题目:完成各个类的clone()方法(深拷贝)和复制构造函数。有个Point类,里面有integerx,y;父类是个抽象类Vo,派生两个子类A类(含一个point对象a1,和...有关java对象数组的clone问题题目:完成各个类的clone()方法(深拷贝)和复制构造函数。有个Point类,里面有integer x,y;父类是个抽象类Vo,派生两个子类A类(...

weixin_34615710的博客 238

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java中的引用是指针吗,JAVA中的指针,引用及对象的clone

Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念。并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。本文会让你了解什么是影子clone与深度clone,认识它们的区别、优点及缺点。看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来...

weixin_39950081的博客 175

如何理解clone对象?

1  为什么要用 clone ? 在实际编程过程中,我们常常要遇到这种情况:有一个对象 A,在某一时刻 A 中已经包含 了一些有效值,此时可能会需要一个和 A 完全相同新对象 B,并且此后对 B 任何改动都不 会影响到 A 中的值,也就是说,A 与 B 是两个独立的对象,但 B 的初始值是由 A 对象确定 的。在 Java 语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很 多途...

qq_41652648的博客 285

如何理解 clone 对象

为什么要用 clone? 在实际编程过程中,我们常常要遇到这种情况:有一个对象 A,在某一时刻 A 中已经包含了一些有效值,此时可能会需要一个和 A 完全相同新对象 B,并且此后对 B 任何改动都不会影响到 A 中的值,也就是说,A 与 B 是两个独立的对象,但 B 的初始值是由 A 对象确定的。在 Java 语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很...

DOONDO的技术窝 280

java clone 的用法:

clone 的用法: java.lang.Object类的clone()方法为protected类型,不可直接调用,需要先对要克隆的类进行下列操作: 首先被克隆的类实现Cloneable接口;然后在该类中覆盖clone()方法,并且在该clone()方法中调用super.clone();这样,super.clone()便可以调用java.lang.Object类的clone()方法。 应用实例: ...

weixin_39150719的博客 253

Java clone详解

1.java“指针”       Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念。并且由于Java不能 通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。本文会让你了解什么是影子clone与深度 clone,认识它们的区别、优点及缺点。         看到这个...

iteye_7859的博客 165

java8 clone_深入浅出Java中的clone克隆方法,写得太棒了!

作者:张纪刚blog.youkuaiyun.com/zhangjg_blog/article/details/18369201/Java中对象的创建clone 顾名思义就是 复制 , 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。我们回顾一下:在java语言中,有几种方式可以创建对象呢?使用new操作符创建一个...

weixin_29847829的博客 648

Java Date clone()方法具有什么功能呢?

Java Date clone()方法的功能简介说明

qq_25073223的博客 470

java clone()用法_java 中clone()的使用方法

java 中clone()的使用方法前言:clone就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有:1 使用new操作符创建一个对象2 使用clone方法复制一个对象那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存。程序执行到new操作符时, 首先...

weixin_39615257的博客 133

java如何实现克隆接口_java之实现clone接口的详解,克隆一个对象--对应有浅克隆和深克隆,概念结合代码深入理解...

1.首先,你要知道怎么实现克隆:实现Cloneable接口,在bean里面重写clone()方法,权限为public。2.其次,你要大概知道什么是地址传递,什么是值传递。3.最后,你要知道你为什么使用这个clone方法。先看第一条,简单的克隆代码的实现。这个也就是我们在没了解清楚这个Java的clone的时候,会出现的问题。看完代码,我再说明这个时候的问题。先看我要克隆的学生bean的代码:pac...

weixin_39680154的博客 453

浅复制和深度复制 clone()

Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念。并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。本文会让你了解什么是影子clone与深度c

giianhui的专栏 676
上一篇: CSP/CCF计算机职业资格认证题目:[201903-1 小中大]【已解决】
下一篇: Java中线程池的使用
_干柿鬼鲛
博客等级 码龄9年 27粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值