首页 > 编程语言 >浅克隆和深克隆 :Java中的对象克隆方式探究

浅克隆和深克隆 :Java中的对象克隆方式探究

时间:2024-01-27 15:24:09浏览次数:35  
标签:Java 克隆 对象 探究 复制 引用 类型

在Java编程中,我们经常需要对对象进行复制或克隆操作.对象克隆是创建一个新的对象,并将原始对象的值复制给新的对象,以便独立使用或修改.在对象克隆中,我们经常遇到两种主要的克隆方式:浅克隆(Shallow Clone)和深克隆(Deep Clone).本文将介绍这两种克隆方式的概念、区别以及在Java中的实现.

1.浅克隆(Shallow Clone):
浅克隆是指创建一个新对象,然后将原始对象的字段值复制给新对象.在浅克隆中,如果原始对象有引用类型的字段,那么新对象和原始对象会共享相同的
引用,即他们指向同一个对象.这意味着如果修改了其中一个对象的引用类型字段,另一个对象也会受到影响.

举一个例子:当我们在照镜子的时候,镜子里面会出现一个和我们一模一样的个体,我们可以把它理解成镜子克隆了一个我们,当我们把头发剃干净了,镜子 
里面的我们也把头发剃干净了,当我们摔了一跤额头破了,镜子里面的我们额头也破了,因为其实镜子里面的我们和我们自己本身就指向同一个个体对象.

在Java中,可以通过实现Cloneable接口并重写Clone方法来实现浅克隆.clone方法会创建一个新对象;并将原始对象的字段值复制给新对象,然而,对于 
引用类型的字段,只是复制了引用而不是创建新的对象.

2.深克隆(Deep Clone):
深克隆是指创建一个新对象,并将原始对象的字段值复制给新对象.与浅克隆不同的是,在深克隆中,如果原始对象有引用类型的字段,新对象会创建一个新
的引用类型对象,并将其复制到新对象中,这意味着修改其中一个对象的引用类型字段不会影响另一个对象.

举一个例子:假如我们有一个双胞胎兄弟,长得一模一样尤其的英俊帅气,我们双保胎兄弟就等于一个深克隆,这是两个个体,其中一个双胞胎兄弟健身了练 
的肩膀上半身,身材贼好,另一个双胞胎兄弟主打一个练大腿肌肉下半身贼发达,那么这两个个体一个肌肉上半身发生变化不会影响另一个兄弟,这就是深 
克隆.

在Java中,实现深克隆可以使用多种方式,如序列化与反序列化、手动递归复制等.其中,使用序列化与反序列化是一种常见的深克隆方式.通过将对象写入 
字节流,然后从字节流中读取对象,可以创建一个完全独立的新对象.

3.浅克隆与深克隆的选择
在选择浅克隆还是深克隆时,需要根据具体情况来决定.如果对象的字段中没有引用类型或不需要对引用类型进行修改,那么浅克隆就足够了,然而,如果对
象的字段中有引用类型,并且需要对引用类型进行修改而不影响原始对象,那么应该选择深克隆.

总结:
好了来给大家总结一下,浅克隆和深克隆时Java中常用的对象克隆方式.浅克隆只复制字段的值,而不复制引用类型对象本身(可以参考理解案例);而深克隆则会创建新的引用类型对象,以完全独立的克隆对象.在实际应用中,根据对象的字段和需求来选择合适的克隆方式,以确保程序的正确性和稳定性.

标签:Java,克隆,对象,探究,复制,引用,类型
From: https://www.cnblogs.com/javatutu/p/17991474

相关文章

  • gitlab修改 克隆地址(内网-外网)
    修改gitlab克隆地址1、打开gitlab我们看到的gitlab克隆地址  2、进入容器修改配置文件dockerexec-itgitlabbash   #进入容器 vim/opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml  #修改配置文件host修改为gitlab服务器的IP地址 3、重启g......
  • Java中的枚举
    Java的枚举是一个特殊的数据类型,用于定义一组命名的常量,用关键字enum来声明。这在项目开发中经常会用到,除了可以定义一些常量类来提高代码的复用性外,有些必要情况需要通过枚举,因为枚举这个数类型不是什么字符串七七八八的,比如项目开发中会有公告字段的填充,像aop切面类时通过自定义......
  • java enum枚举实现机制
    在上篇文章中,我们对Java中的枚举类进行了详细的介绍。对于Enum还不了解的小伙伴,可以先预习《Java中的枚举类型(Enum)详解》一文。通过反编译,我们知道Java枚举类会在编译之后转化为一个继承了java.lang.Enum的类,而我们定义的每个枚举值都会在类的初始化阶段被实例化为我们所定义的......
  • 初识JAVA的第4天,循环结构
    day4java新手随笔练习publicclassDoc{Stringname;//属性/***since指明需要最早使用的jak版本*@authorwushen作者名*@paramname参数名*@return返回值情况*@throwsException异常抛......
  • SpringBoot启动项目报错:java.lang.UnsatisfiedLinkError: D:\files\software\jdk-1
    目录问题描述解决方法:问题描述在运行向的时候出现报错:java.lang.UnsatisfiedLinkError:D:\files\software\jdk-15.0.1\jdk-17.0.3.1\bin\tcnative-1.dll:Can'tloadIA32-bit.dllonaAMD64-bitplatform atjava.base/jdk.internal.loader.NativeLibraries.load(Native......
  • windows下java启动失败
    windows下java启动失败一、问题现象微服务原来在linux下部署,现在有客户环境为windowsserver,把linux的包拷到windowsserver下,使用java-jar命令无法启动。同样的包在linux可以启动,就是在windows启动不了。问题提示:现象一:2023-10-2713:40:05.682ERROR11736---[main]o.......
  • 关于javascript的一些笔记(一)
    在script标签内使用import的时候,必须在script标签加上type=“module”当使用script标签加上type="module"的时候,是当所有模块都加载进来才进行工作的,也就是如果html在script标签下面也是可以正常运行的,他是后解析的当使用script标签加上type="module"的时候,script标签里面......
  • 每日一道Java面试题:Java是值传递还是引用传递?
    写在开头Java是值传递还是引用传递?这个问题几乎100%的出现在了各大主流Java面试题中,知识点很小,但很考验面试者对于Java运行的理解,今晚趁着生产投产的空子,过来小聊一下。实参与形参所谓的值传递or引用传递是指方法在调用的过程中实参传递的两种变现形式,那么好,想搞清楚这个问题的......
  • Java商城单体和微服务架构有什么区别
    微服务架构概述BizSpring移动全端国际化电商平台,是建立在SpringCloud基础上的微服务应用,服务化是系统达到一定规模以后的必然选择,主流的互联网公司基本都在迁移到服务化架构。我们的微服务化架构给客户带来更多便捷,每个开发团队及各人更加专注于自身业务的开发,每个服务独立......
  • Java学习日记 Day12 心累~
    SpringMVC:主要学了SpringMVC架构下请求与响应的各种方式,在响应中要知道请求转发和重定向的区别。算法:合并二叉树:判断当前节点两棵树的数值关系,然后递归判断左右子树的关系。二叉搜索树中的搜索:根据二叉搜索树的特点,递归查找左右子树,当值相等就返回。验证二叉搜索树:为自己的左......