Java学习手册:clone方法(浅复制&深复制)

Java clone浅复制与深复制的区别 概述 Java对象要调用 clone 进行复制,必须实现 Cloneable 接口,否则会抛出CloneNotSupportedException的异常。 clone 方法默认是浅复制,如果要实现深复制,那必须在clone方法调用对象成员的复制方法。 浅复制:复制对象时,对象内部引用类型的成员,仍然共用内存空间。此时A对象修改这个成员的属性,B对象的该成员也会受影响。 深复制:复制对象时,对象内部引用类型的成员,也会重新开辟新的空间。此时A对象和B对象完全互不干扰。 浅复制clone Grade: 班级 阅读详情

一、clone方法

在实际编程中,经常会遇到从某个已有的对象A创建出另外一个与A具有相同状态的对象B,并且对B的修改不会影响到A的状态。在Java语言中,仅仅通过简单的赋值操作显然无法达到这个目的,而Java提供了一个简单有效的clone()方法来满足这个需求。

Java中的所有类默认都继承自Object类,而Object类中提供了一个clone()方法。这个方法的作用是返回一个Object对象的复制。这个复制返回的是一个新的对象而不是一个引用。以下是使用clone()方法的步骤:
(1)实现clone的类首先需要继承Cloneable接口。Cloneable接口实质上是一个标识接口,没有任何接口方法。
(2)在类中重写Object类中的clone()方法。
(3)在clone方法中调用super.clone()。无论clone类的继承结构是什么,super.clone()都会直接或间接调用java.lang.Object类的clone()方法。
(4)把浅复制的引用指向原型对象新的克隆体。

注:clone()方法执行的是浅拷贝,如果想要在clone对象时进行深拷贝, 那么就要实现Clonable接口,覆盖并实现clone()方法。

package com.haobi;
/*
 * 使用clone()方法的步骤--浅复制
 */
class A implements Cloneable{//1、继承Cloneable接口
	private int a = 0;
	public int getInt() {
		return a;
	}
	public void setInt(int i) {
		a = i;
	}
	public void changeInt() {
		a = 1;
	}
	public Object clone() {//2、重写Object类的clone()方法
		Object o = null;
		try {
			o = (A)super.clone();//3、在clone()方法中调用super.clone()
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return o;
	}
}
public class TestClone {
	public static void main(String[] args) {
		A a = new A();
		A b = (A)a.clone();//4、把浅复制的引用指向原型对象的克隆体
		b.changeInt();
		System.out.println("a:"+a.getInt());
		System.out.println("b:"+b.getInt());
	}
}
//程序输出结果如下:
a:0
b:1

在C++语言中,当开发人员自定义复制构造函数时,会存在浅复制和深复制之分。Java语言在重载clone()方法时也存在同样的问题,当类中只有一些基本的数据类型时,采用上述方法就可以了,但是当类中包含了一些对象时,就需要用到深复制了,实现方法是在对对象调用clone()方法完成复制后,接着对对象中的非基本类型的属性也调用clone()方法完成深复制。示例如下:

package com.haobi;

import java.util.Date;
/*
 * 深复制 
 */
class AA implements Cloneable{
	
	private Date  birth = new Date();
	public Date getBirth() {
		return birth;
	}
	public void setBirth(Date birth) {
		this.birth = birth;
	}
	public void changeDate() {
		this.birth.setMonth(1);
	}
	public Object clone() {
		AA a = null;
		try {
			a = (AA)super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		//实现深复制
		a.birth = (Date)this.getBirth().clone();
		return a;
	}
}
public class TestClone1 {
	public static void main(String[] args) {
		AA a = new AA();
		AA b = (AA)a.clone();
		b.changeDate();
		System.out.println("a="+a.getBirth());
		System.out.println("b="+b.getBirth());
	}
}
//程序输出结果如下:
a=Fri Apr 12 15:53:04 CST 2019
b=Tue Feb 12 15:53:04 CST 2019

在编程时,首先检查类有无非基本类型(即对象)的数据成员。若没有,则返回super.clone()即可;若有,确保类中包含的所有非基本类型成员变量都实现了深复制。

Object o = super.clone();//先执行浅复制
o.attr = this,getAttr().clone();//然后对每一个对象attr执行以下语句
//最后返回o

需要注意的是,clone()方法的保护机制在Object中的clone()是被声明为protected的。以User类为例,通过声明为protected,就可以保证只有User类里面才能“克隆”User对象。


二、深复制和浅复制有什么区别?

浅复制(Shallow Clone):被复制对象的所有变量都含有与原来对象相同的值,而所有对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

深复制(Deep Clone):被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象。而不再是原有的那些被引用的对象。换言之,深复制把复制的对象所引用的对象都复制了一遍。
以下例所示:

class Test{
	public int i;
	public StringBuffer s;
}

在这里插入图片描述


微带功分器设计与ADS-EM联合仿真实战解析 本文详细解析了微带功分器设计与ADS-EM联合仿真的实战技巧,涵盖特性阻抗计算、ADS原理图设计、版图生成与EM仿真等关键步骤。通过实际案例分享,帮助工程师掌握射频电路设计中的核心技术和调试方法,提升功分器设计效率与性能。 阅读详情

相关推荐

RK3566/RK3588 NPU性能实测:用mobilenet模型快速验证你的开发板NPU是否正常工作

本文提供了RK3566/RK3588开发板NPU性能实测指南,通过MobileNet模型快速验证NPU是否正常工作。详细介绍了环境搭建、测试资源获取、编译运行及结果分析的全流程,帮助开发者高效验证神经网络加速器功能,为后续AI应用部署奠定基础。

weixin_28826521的博客 448

Java中clone方法详解

Java中clone方法详解一、clone简介二、Java中对象的创建:new与clone创建对象的区别三、复制对象or复制引用:第一个例子(复制引用):第二个例子(复制对象):四、深拷贝 浅拷贝原理浅拷贝深拷贝 一、clone简介 clone 就是复制 , 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新...

Da_Xiong的博客 2万+

一文搞懂 RC Correlation Scale Factor 的生成与应用

pre-route 用的是统计估算模型,post-route 用的是详细布线提取,signoff 用的是第三方 QRC 或 StarRC——三个工具,三套参数体系,结果自然天差地别。不同 RC corner(rc_worst/rc_best/rc_typical)对应不同的工艺角和温度环境,每个 corner 的 R/C 偏差比例不同,必须分别生成和应用各自的 scale factor。别被名字骗了,这个工具专门干一件事——统计拟合两组 SPEF 之间的偏差,自动推荐最优 scaling factor。

weixin_47770727的博客 557

java clone() 方法详解及深克隆与浅克隆

clone 翻译过来就是克隆,顾名思义就是创造一个一模一样的事物。Java 代码中 clone() 方法是 Object 方法,而 Object 又是所有类的父类,也就是说所有 java 对象都可以调用 clone 方法克隆一个和自己“相同”的对象。本篇博客我打算系统整理 java clone() 方法的原理以及深克隆和浅克隆的关系。

weixin_42361467的博客 4102

STM32F103用软件I2C读取IP2366电量数据,实测避坑指南(附完整源码)

本文详细介绍了如何使用STM32F103的软件I2C驱动读取IP2366电池管理芯片的电量数据,包括GPIO初始化、I2C时序实现、关键延时优化及常见问题解决方案。通过实测避坑指南和完整源码,帮助开发者快速实现稳定的电量数据读取,适用于嵌入式电池管理系统开发。

weixin_33725722的博客 514

详解Numpy中的transpose方法

最近在学Numpy碰到了关于数组转置和换轴的概念,尤其是对tanspose方法有些疑惑,尤其是多维,查了不少资料,终于搞懂了。 Numpy数组的轴(axis) 所谓的**轴(axis)**可以理解为数组的维度。 具体而言,二维数组就是有两个维度,如果从空间上看,它就是一个平面,由x轴和y轴构成,而与此相对应的,该二维数组就有两个轴,x轴对应0轴,y轴对应1轴。 同理,三维数组有三个维度,空间上...

BlankGrid的博客 937

Java中的clone()方法

clone()方法的约定 Cloneable接口的目的是作为对象的一个混合接口,表明这样的对象允许克隆(clone),但是这个接口却没有定义clone(),这是它的缺陷:无法约束子类实现clone()方法。Object定义了一个受保护的clone()方法。Cloneable虽然没有定义clone()方法,但是却影响了Object.clone()方法的行为:如果一个类实现了Cloneable,调用Object的clone()就会返回该对象的逐域拷贝,否则抛出CloneNotSupportedException

yygr的博客 1万+

Unity3D实战:用EasyAR4.0稀疏空间地图打造AR导航应用(附完整代码)

本文详细介绍了如何使用Unity3D和EasyAR4.0的SparseSpatialMap功能构建AR导航应用。通过稀疏空间地图技术,开发者可以创建室内导航系统,解决传统GPS在室内环境中的局限性。文章包含完整代码示例,涵盖环境配置、地图构建、导航实现及性能优化等关键步骤,助力开发者快速掌握AR导航开发技巧。

t8u9v0的博客 1197

Clone使用

Clone

weixin_61518137的博客 1880

YOLOv8改进 | 主干篇 | 利用MobileNetV2替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者⭐⭐⭐⭐。

Snu77的博客 5686

Agentic AI为教育行业赋能,提示工程架构师解析应用潜力

然而,即便是最先进的 LLMs,在面对复杂、动态、需要持续规划和调整的教育场景时,也常常显得力不从心,它们更像是强大的“问答机器”,而非真正意义上的“学习伙伴”或“教学助手”。在教育场景中,传统的 AI 工具可能只能回答学生提出的特定问题,或者根据预设的规则推送一些学习材料。无论您是教育技术领域的开发者、产品经理,还是一线的教育工作者、教育管理者,抑或是对 AI 教育应用充满好奇的研究者,本文都将为您提供宝贵的 insights,助您把握 Agentic AI 时代教育创新的脉搏。

架构师的AI之路,分享AI应用开发架构的学习与实践。 466

解析java中的clone方法

本文详细解析了java中的clone方法

SSS4362的博客 6555

倍福--手动加入第三方伺服的配置

客户在没有硬件情况下,希望手动配置硬件,添加第三方驱动器,本文介绍其操作流程 目 录 软硬件版本 3 1.1. 倍福Beckhoff 3 1.1.1. 控制器硬件 3 1.1.2. 控制软件 3 操作步骤 3 2.1. 添加电机XML文件 3 2.2. 创建EtherCAT 3 2.3. 添加新建项 3 2.4. 选择型号 4 2.5. 关联NC轴 5 软硬件版本 1.1. 倍福Beckhoff 1.1.1. 控制器硬件 TwinCAT控制制器,PC或者EPC,包括: 嵌入式控制器:CX5020-

weixin_41883890的博客 5325

Java中clone方法以及深复制和浅复制

Java中处理基本数据类型(如:int , char , double等),都是采用按值传递的方式执行,除此之外的其他类型都是按照引用传递(传递的是一个对象的引用)的方式执行。对象在函数调用时和使用“=”赋值时都是引用传递。 Java中clone方法的作用是为了在现实编程中解决这样一个问题: 从某个已有的对象A创建出另外一个与A具有相同状态的对象B,并且对B的修改不会影响到对象A。 Java

nuisthou的博客 2586

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

clone()方法(浅复制、深复制)

1. 对象和引用的区别 2. clone()方法 3. 深复制与浅复制

LearningMegan 3570

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java基础:浅复制、深复制、克隆接口Clone以及clone()方法

1.了解浅复制和深复制 2.实现Cloneable接口,覆盖clone()方法,实现对一个对象的克隆。

Hicodden的博客 721

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java clone、浅复制、深复制、复制构造函数

在java中的对象重复利用通常有两种渠道:复制引用、克隆,不管何种方法,它们都是为了减少对象重复创建和赋值操作,一定程度上提高效率。这里就有关对象复用的几种方式和关系进行探讨。共识java中的对象分为两派:值类型和引用类型,这是因为他们的传递方式,一个是值传递,一个是引用传递。对于值类型,因为是值传递,所以在使用值类型的时候无须考引用类型存在一些问题,如:equals,hashcode,nullp...

ShewMi的专栏 3620

JAVA中浅复制与深复制

1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 ⑵深复制(深克隆) 被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制...

weixin_43452871的博客 1395

clone()方法、深复制和浅复制

clone方法   Java中没有明确提供指针的概念和用法,而实质上没个new语句返回的都是一个指针的引用,只不过在大部分情况下开发人员不需要关心如何去操作这个指针而已。   在实际编程中,经常会遇到从某个已有对象A创建出另一个与A具有相同状态的对象B,并且B的修改不会影响到A的情况,例如Prototype(原型)模式中,就需要clone一个对象实例。   仅仅通过简单的复制操作显然无法达到这个目

开着奥迪卖小猪 1601

JAVA clone方法-深复制(深克隆)&浅复制(浅克隆)

引子 为啥要用clone方法? 最近在项目中发现某开发人员代码有问题,然而单元测试也确实不通过,就是对对象的引用失败造成的 具体如下: 在对某个对象更新保存数据操作,对象关联某个文件需要将对象更新到数据库后再判断文件是否更新(文件存储到专门的文件系统中,对象保持文件的访问路径),如果文件更新了,那么就需要上传对象原来的文件,因此需要对要更新的对象保留一份副本 然而再...

junehappylove(王俊伟)的专栏 1万+

java byte clone_Java中的clone()----深复制,浅复制

这篇文章主要介绍了Java中对象的深复制(深克隆)和浅复制(浅克隆) ,需要的朋友可以参考下1.浅复制与深复制概念⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。⑵深复制(深克隆)被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量...

weixin_36418862的博客 1449

Java中的浅复制和深复制

一、浅复制与深复制概念 (1)浅复制 浅复制会复制“被复制对象”基本类型的值和对象的引用。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 (2)深复制 深复制会复制“被复制对象”基本类型的值,对象的引用将重新指向一个被复制过的新对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。 二、clone()、Cloneable和Serialiable (1)clone()...

鹿与森的博客 624

浅复制与深复制区别以及使用场景和案例

浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 深复制(深克隆): 被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象 所引用的对象都复制了一遍。 如何进行类复制? object类当中提供了浅复制的具体方法 注意事项 由doc我们可以得出以下几点主要事项

qq_42261668的博客 2023

Java中的clone方法

分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用(地址)发布到外部,在外部就可以使用这个引用操纵这个对象(当然,由于指令的重排序,发布对象可能在构造函数返回之前,详细看。都是分配内存,调用clone方法时,分配的内存和源对象(即调用clone方法的对象)相同,然后再使用源对象中对应的各个域,填充新对象的域, 填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。

zzdnb的博客 1461

clone方法的深复制和浅复制

clone()方法是Object类中的一个方法,clone是穿件对象的四大方法之一(另外三个 new ,反射,发序列化),通过调用该方法,可以新建一个对象。那什么是深复制什么是浅复制呢?还是举例子来说比较直观。 首先是浅复制,反下面代码: public class Student implements Cloneable{ private String studentName;

传a奇—学习博客 720

深复制和浅复制 && 数组深复制的方法

1 深复制和浅复制的方法 浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。 浅复制下次再取的时候,可能内容已经发生了变化 深复制:在计算机中开辟一块 新的内存地址 用于存放复制的对象。 clone是深复制方法 例子: item_table.put(can_item, temp_tab); 普通的复制,是浅复制,仅复制地址;若后面对can_item进行修改,对应也会修改。比如到了下一个can_item,new 一个新的can_item,就会导致item_t

qq_42990803的博客 1225
上一篇: Java学习手册:不可变类
下一篇: Java学习手册:“==”&equals&hashCode
浩比浩比
博客等级 码龄12年 395粉丝 202原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值