Java基础-深拷贝和浅拷贝的区别

深拷贝、浅拷贝 阅读详情

最近这段时间太忙了。以至于之前一篇博文没办法写下去。

趁着今天早上有1个半小时的空闲,写一篇 深拷贝与浅拷贝

 

为什么要拷贝?

Java克隆是为了得到一个 完全一致的对象。

相同点:对象完全一样。这包括里头所有的变量,对象。

不同点:对象的内存地址不一样。

 

深拷贝与浅拷贝

一般来说,拷贝的类型分为 深拷贝与浅拷贝。

|—————————————————————————————|

| 深拷贝:引用对象的值等信息,复制一份一样的。             |

| 浅拷贝:只复制引用,另一处修改,你当下的对象也会修改。   |

|—————————————————————————————|

网上有这样的描述,以上描述不科学

 

从字面上理解更好。
浅拷贝---拷贝的级别浅。

深拷贝---拷贝级别更深。

 

具体呢?

浅拷贝---能复制变量,如果对象内还有对象,则只能复制对象的地址

深拷贝---能复制变量,也能复制当前对象的 内部对象

 

 

代码范例

 

public class mytest {
	public static void main(String[] args) {
        Parent item1 = new Parent("john", 10);
        Parent item2 = item1.clone();
        
    	System.out.println("parent1 = " + item1.toString());
    	System.out.println("parent2 = " + item2.toString());
	}
	
	public static class Parent implements Cloneable{
		String name = "";
		int age = 0;
		Parent (String n, int age){
			this.name = n;
			this.age = age;
		}

		public void setName(String na) {
			name = na;
		}
		@Override
	    protected Parent clone() {
			Parent clone = null;
	        try {
	            clone = (Parent) super.clone();
	        } catch (CloneNotSupportedException e){
	            throw new RuntimeException(e); // won't happen
	        }
	        
	        return clone;
	     }
		
		public String toString() {
			return "Parent[" + name + "===" + age + "];";
		}
	}
}


测试结果:

parent1 = Parent[john===10];
parent2 = Parent[john===10];

Parent1被复制了一份。

 

修改下main函数

再执行一次。

测试结果:

 

发现parent1被修改了,但是parent2并未收到影响。

 

 

再修改一下.

添加一个内部类son,并加到parent里头去。

public class mytest {
	。。。。。。。。	
	public static class Parent implements Cloneable{
		String name = "";
		int age = 0;
		Son theson;
		Parent (String n, int age){
			this.name = n;
			this.age = age;
		}

		public void setName(String na) {
			name = na;
		}
		
		public void setSon(Son s) {
			theson = s;
		}
		@Override
	    protected Parent clone() {
			Parent clone = null;
	        try {
	            clone = (Parent) super.clone();
	        } catch (CloneNotSupportedException e){
	            throw new RuntimeException(e); // won't happen
	        }
	        
	        return clone;
	     }
		
		public String toString() {
			return "Parent[" + name + "===" + age + "];" + "---Son:"+ (theson != null ? theson.name : "null");
		}
	}
	public static class Son implements Cloneable {
		String name = "";
		int age = 0;
		Son (String n, int age){
			this.name = n;
			this.age = age;
		}

		public void setName(String na) {
			name = na;
		}
		@Override
	    protected Son clone() {
			Son clone = null;
	        try {
	            clone = (Son) super.clone();
	        } catch (CloneNotSupportedException e){
	            throw new RuntimeException(e); // won't happen
	        }
	        
	        return clone;
	     }
		
		public String toString() {
			return "Son[" + name + "===" + age + "];";
		}
	}
}
<span style="mso-spacerun:'yes';font-family:Calibri;mso-fareast-font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;">
</span>

看main的修改

先copy再设置。

测试结果:

可以看到parent1与parent2中的son都变了。

可见,浅拷贝---只是将 内部对象的地址保存。。。。

 

最后,修改一下Clone

		@Override
	    protected Parent clone() {
			Parent clone = null;
	        try {
	            clone = (Parent) super.clone();
	        } catch (CloneNotSupportedException e){
	            throw new RuntimeException(e); // won't happen
	        }
	        clone.theson = theson.clone();
	        return clone;
	     } 

测试结果:

parent1 = Parent[alice-john===10];---Son:alice---john's son
parent2 = Parent[john===10];---Son:john'son<span style="mso-spacerun:'yes';font-family:宋体;mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;"> </span>

结果达到了我预计的结果。。。

 

小结

浅拷贝与深拷贝,一字之差,主要表明了拷贝的层次差别。

Object的clone方法,必须要实现Cloneable。

表明了,clone方法的实现要程序员自己来。。。

而深浅拷贝只是术语的区别。。。你怎么实现的就是怎么个定义。

1. 必须实现Cloneable

2. 要深拷贝,得注意对象的内部对象,也需要clone

 

 

 

DRV8870电机驱动芯片原理与嵌入式多平台驱动开发 H桥电机驱动芯片是直流电机控制的核心硬件模块,其通过双MOSFET拓扑实现方向与速度的精确调控。工作原理基于电荷泵自举驱动、集成电流检测及多重硬件保护机制,技术价值体现在高集成度、宽压适配(4.5V–45V)与强鲁棒性。典型应用场景涵盖智能机器人执行器、工业自动化设备及电池供电移动终端。本文围绕DRV8870这一主流驱动芯片,深入解析其PH/EN与Dual PWM双控制模式、nFAULT故障响应机制,并结合Arduino/ESP32/STM32三大平台,提供可复用的跨MCU驱动库设计范式与FreeRTOS实 阅读详情

相关推荐

Rider高效调试UE引擎:无需编译源码的符号配置指南

本文提供了一份详尽的Rider高效调试UE引擎指南,核心在于无需编译源码即可配置调试符号。通过Epic启动器下载官方PDB文件,并在Rider中正确配置外部符号服务器路径,开发者能在10分钟内实现对引擎内部代码(如AActor::Tick)的源码级断点调试、变量查看和调用堆栈分析,极大提升问题排查效率。

weixin_29011239的博客 340

理解深拷贝和浅拷贝

目录 一、深浅拷贝是什么? 二、深浅拷贝基础(数据类型) 1.基础数据类型(值传递) 2.复杂数据类型(地址传递) 三、深浅拷贝怎样操作(代码示例) 1.浅拷贝: 1)通过Object.assign for in 进行浅拷贝 2.深拷贝: 1)深拷贝最简单的实现是: JSON.parse(JSON.stringify(obj)) 2)实现一个 deepClone 函数 (深拷贝,完美) 3)递归拷贝 一、深浅拷贝是什么? 首先我们要明白一点,js中数据类...

m0_65558076的博客 3万+

UFS逻辑单元管理

介绍UFS 逻辑单元管理和配置

m0_51720747的博客 1945

深拷贝|浅拷贝

深拷贝-浅拷贝

伏颜的博客 8184

蓝牙6.0的‘新雷达’:Channel Sounding信道探测,真能比UWB更香吗?

本文探讨了蓝牙6.0的Channel Sounding信道探测技术在室内定位领域的应用潜力。通过与UWB技术的对比分析,揭示了其在成本、功耗和兼容性方面的优势,特别是在智能门锁、物品追踪等场景中的商业价值。Channel Sounding技术不仅具备亚米级精度,还能通过现有蓝牙设备实现零边际成本部署,为物联网应用提供了新的解决方案。

weixin_29288313的博客 332

浅拷贝、深拷贝

深拷贝和浅拷贝   这两个概念是在项目中比较常见的,在很多时候,都会遇到拷贝的问题,我们总是需要将一个对象赋值到另一个对象上,但可能会在改变新赋值对象的时候,忽略掉我是否之后还需要用到原来的对象,那么就会出现当改变新赋值对象的某一个属性时,也同时改变了原对象,此时我们就需要用到拷贝这个概念了。 深拷贝和浅拷贝的区别 1.浅拷贝: 将原对象或原数组的引用直接赋...

Addisoni 4万+

Microapp 接入vite子应用

MicroApp接入vite版本,干货满满,手把手步骤说明,加上报错说明,赶紧上车!

outsider76557的博客 4658

【Java基础】深拷贝和浅拷贝的区别

目录深拷贝浅拷贝实现 深拷贝 能复制变量,也能复制当前对象的 内部对象 拷贝对象的值,如果对象中还有对象,则会把里面的对象也拷贝一份。 浅拷贝 能复制变量,如果对象内还有对象,则只能复制对象的地址 拷贝对象的值,如果对象中还有对象,浅拷贝只会拷贝这个对象的引用地址,实际上还是指向同一对象的,所以当一处发生改变,另一处也会随之改变 实现 todo ...

weixin_45325628的博客 385

【土壤普查实战】Python+ArcGIS随机森林模型一键生成土壤类型栅格图

本文详细介绍了如何利用Python和ArcGIS结合随机森林模型实现土壤类型栅格图的自动化生成,大幅提升土壤普查效率。通过环境准备、数据预处理、模型构建与调优等关键步骤,帮助用户掌握从样本点生成到最终栅格图输出的完整流程,适用于大面积区域或样本点较多的土壤分类任务。

weixin_29229989的博客 217

YOLOv11【第二十章:模型迭代与生态闭环篇·第1节】在线增量学习——部署后新数据自动回流重训!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 431

【137期】面试官:问点儿基础的,你能说说Java深拷贝和浅拷贝区别吗

【137期】面试官:问点儿基础的,你能说说Java深拷贝和浅拷贝区别吗

qq_41490913的博客 104

RK3568平台(USB篇)USB Gadget 驱动

USB 设备驱动,按照设备端关联的 USB 控制器 是工作在 主模式 还是 从模式,分为 USB 设备主机侧驱动 (主模式),或者 USB 设备从机侧驱动 (从模式)。同时,工作在 主模式 的 USB 控制器,称为 USB 主机控制器 (UHC: USB Host Controller),工作在 从模式 的 USB 控制器,称为 USB 设备控制器 (UDC: USB Device Controller)。有的 USB 控制器,只能工作在 主模式 或 从模式 中的某一种;

weixin_49303682的博客 1438

java基础:java 的深拷贝和浅拷贝的区别

基本数据类型和引用数据类型的拷贝机制存在本质差异。基本数据类型(如数字、字符串)的拷贝(浅/深拷贝)都会创建独立副本,修改新数据不影响原数据。而引用数据类型(如对象、数组)的浅拷贝仅复制引用地址,新旧数据仍指向同一对象,修改会互相影响;深拷贝则会完全复制对象本身,创建完全独立的新对象,修改互不影响。理解这两种数据类型的拷贝机制对编程中的数据操作至关重要。

weixin_51243388的博客 167

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

137面试必问:问点儿基础的,你能说说Java深拷贝和浅拷贝区别吗

一、拷贝的引入 (1)、引用拷贝 创建一个指向对象的引用变量的拷贝。 Teacherteacher=newTeacher("Taylor",26); Teacherotherteacher=teacher; System.out.println(teacher); System.out.println(otherteacher); 输出结果: blog.Teacher@355da254 blog.Teacher@355da254 结果分析:由输出结果可以看出,它们...

AI乔治 339

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Java基础面试题041】Java中的深拷贝和浅拷贝有什么区别?

常见实现方式是重写Object.clone()方法,默认方法这个方法只是对对象的字段进行字段拷贝,对于基本类型的字段会复制值,对于引用类型的字段则复制引用。深拷贝创建的新对象与原对象完全独立,任何一个对象的修改都不会影响另一个。二修改浅拷贝对象中的引用类型的字段会影响要原对象,因为它们共享相同的引用。浅拷贝只复制对象的引用,而不复制引用指向的实际对象,也就是说,浅拷贝创建一个新对象,但它的字段(若是对象类型)深拷贝不仅复制对象本身,还递归复制对象中所有引用的对象。指向的是原对象中的相同内存地址。

lklalmq的博客 916

IMSL CNL 7.0.0 (x86-64)Crack

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

java基础:深拷贝和浅拷贝的区别是什么?

被复制过的新对象.而不再是原有的那些被引用的对象.换言之.深拷贝把要复制的对象所引用的。:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指。:被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其他对象的变量将指向。向原来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.原型模式:设计模式 --> Spring bean的Scope。

学亮编程手记 129

java面试题库冲刺1-java基础知识(JDK,JRE联系,HashMap和HashTable,==和equals,ArrayList和LinkedList,深拷贝和浅拷贝,重载和重写的区别)

1.【基础】JDK、JRE、JVM区别和联系 JDK:JAVA Deveipment Kit java开发工具 JRE:JAVA Runtime Enviroment java运行环境 JVM:JAVA Virtual Machine java虚拟机 JDK里开发环境包含了JRE,java运行得环境,JRE里面又包含了虚拟机。 2.【基础】HashMap和HashTable的区别及底层实现 HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线

weixin_44480609的博客 495

面试官:问点儿基础的,你能说说Java深拷贝和浅拷贝区别吗

一、拷贝的引入 (1)、引用拷贝 创建一个指向对象的引用变量的拷贝。 Teacherteacher=newTeacher("Taylor",26); Teacherotherteacher=teacher; System.out.println(teacher); System.out.println(otherteacher); 输出结果: blog.Teacher@355da254 blog.Teacher@355da254 结果分析:由输出结果可以看出,它们的地址值是相同...

Java6888的博客 245

java基础面试题:深拷贝和浅拷贝区别了解吗?什么是引用拷贝

无论是浅拷贝还是深拷贝,在处理引用类型的属性时,都可能存在引用拷贝的情况。这意味着拷贝后的对象和原始对象可能共享相同的引用对象。浅拷贝是创建一个新对象,新对象的属性值和原始对象的属性值相同。然而,如果属性是引用类型,浅拷贝只会复制引用,而不会复制引用的对象本身。这意味着新对象和原始对象将引用相同的对象,对其中一个对象的修改会影响到另一个对象。深拷贝是创建一个新对象,并递归地复制原始对象的所有属性,包括引用类型的属性。这样,新对象和原始对象将引用不同的对象实例,对其中一个对象的修改不会影响到另一个对象。

qq_46285584的博客 793

【Java基础】深拷贝和浅拷贝区别了解吗?什么是引用拷贝?

深拷贝和浅拷贝区别了解吗?

xxdd_123xxx的博客 145

每日一道Java 基础面试题 — 深拷贝和浅拷贝的区别是什么?

浅拷贝: 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指 向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。 A 复制 B ,修改B中的对象引用时,发现 A中的数据也随之改变,A和B 共用对象引用 深拷贝: 被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其他对象的变量将指向 被复制过的新对象.而不再是原有的那些被引用的对象.换言之.深拷贝把要复制的对象所引用的 对象都复制了一遍. A 复制 B, 修改B中的对象引用时, 发现 A中的数据并没

CSNZのBlog 412
上一篇: 探究eclipse转AS,解决65K问题---UNITY游戏相关
下一篇: Launcher3桌面壁纸被拉伸模糊的修改
手艺人王学明
手艺人王学明 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄17年 441粉丝 185原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值