Java中的深克隆和浅克隆(Clone)

这篇具有很好参考价值的文章主要介绍了Java中的深克隆和浅克隆(Clone)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

浅克隆(shallow clone)和深克隆(deep clone)是两种不同的对象复制方法。

浅克隆会创建一个新对象,然后将原始对象的所有字段复制到新对象中。如果字段是基本类型,则它们的值将被直接复制。如果字段是引用类型,则只会复制引用,而不会复制引用指向的对象。这意味着原始对象和克隆对象中的引用类型字段将指向同一个对象。

深克隆不仅会复制原始对象的所有字段,还会递归地复制引用类型字段指向的所有对象。这意味着原始对象和克隆对象中的引用类型字段将指向不同的对象。

Java中的深克隆和浅克隆(Clone)

Java中的深克隆和浅克隆(Clone)

 

 

 

在Java中,要实现对象的浅克隆和深克隆,可以让你的类实现Cloneable接口,并重写Object类中的clone方法。

浅克隆可以通过调用super.clone()方法来实现。这将创建一个新对象,并将原始对象的所有字段复制到新对象中。如果字段是基本类型,则它们的值将被直接复制。如果字段是引用类型,则只会复制引用,而不会复制引用指向的对象。

深克隆需要手动实现。需要在clone方法中创建一个新对象,并递归地复制所有引用类型字段指向的对象。

下面是一个示例类,它演示了如何实现浅克隆和深克隆:

 1 public class MyClass implements Cloneable {
 2     private int x;
 3     private int[] y;
 4 
 5     public MyClass(int x, int[] y) {
 6         this.x = x;
 7         this.y = y;
 8     }
 9 
10     public int getX() {
11         return x;
12     }
13 
14     public int[] getY() {
15         return y;
16     }
17 
18     @Override
19     public MyClass clone() throws CloneNotSupportedException {
20         MyClass clone = (MyClass) super.clone();
21         // Deep clone the y array
22         clone.y = y.clone();
23         return clone;
24     }
25 }

在这个示例中,我们定义了一个名为MyClass的类,它包含两个字段:一个整型字段x和一个整型数组字段y。我们让这个类实现了Cloneable接口,并重写了clone方法。

clone方法中,我们首先调用了super.clone()方法来执行浅克隆。然后,我们对整型数组字段y执行了深克隆,即通过调用它的clone方法来创建一个新的数组。

要使用这个类来创建浅克隆和深克隆对象,可以这样写:

int[] y = {1, 2, 3};
MyClass original = new MyClass(10, y);
MyClass shallowClone = original.clone();
MyClass deepClone = original.clone();

System.out.println("Original: " + original.getX() + ", " + Arrays.toString(original.getY()));
System.out.println("Shallow clone: " + shallowClone.getX() + ", " + Arrays.toString(shallowClone.getY()));
System.out.println("Deep clone: " + deepClone.getX() + ", " + Arrays.toString(deepClone.getY()));

y[0] = 100;

System.out.println("After modifying the original object:");
System.out.println("Original: " + original.getX() + ", " + Arrays.toString(original.getY()));
System.out.println("Shallow clone: " + shallowClone.getX() + ", " + Arrays.toString(shallowClone.getY()));
System.out.println("Deep clone: " + deepClone.getX() + ", " + Arrays.toString(deepClone.getY()));

在这个示例中,我们创建了一个原始对象original,然后使用它的clone方法创建了两个克隆对象:一个浅克隆对象和一个深克隆对象。接下来,我们修改了原始对象中的整型数组字段。

运行这段代码,将看到以下输出:

Original: 10, [1, 2, 3]
Shallow clone: 10, [1, 2, 3]
Deep clone: 10, [1, 2, 3]
After modifying the original object:
Original: 10, [100, 2, 3]
Shallow clone: 10, [100, 2, 3]
Deep clone: 10, [1, 2, 3]

从输出中可以看出,对原始对象的修改影响到了浅克隆对象,但没有影响到深克隆对象。文章来源地址https://www.toymoban.com/news/detail-574526.html

到了这里,关于Java中的深克隆和浅克隆(Clone)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity】预制体材质变(Clone)克隆体问题

    1、排查代码是否存在直接修改预制体的材质为克隆体。         解决:删了这段代码。 2、双击Prefab文件进入预制体编辑模式时,会执行预制体身上的脚本方法Awake、Start等(生命周期方法),所以要排查这些方法里是否有克隆材质行为。         解决:             

    2024年02月10日
    浏览(54)
  • GitHub下载克隆clone指定的分支tags代码

    github上有很多tag分支版本的代码,我想克隆下载指定版本到我服务器上面 例如:我想下载tag:v2.0.2的代码 命令: git clone -b [tags标签] [git地址] 例如:git clone -b v2.0.2 https://github.com/spring-projects/spring-retry.git 若想对克隆后的项目重命名则可执行以下命令 git clone -b [tags标签] [git地

    2024年02月06日
    浏览(53)
  • WSL2 git clone命令无法克隆远程仓库

    最近在往WSL2里拉取git仓库的时候,突然出现了这个问题,WSL2无法连接到git服务器,导致代码无法拉取下来,可能是因为我最近不小心修改了windows的防火墙设置,导致出现了这个问题。 在查阅了很多篇博客以后,终于找到一篇博客可以解决我这个问题,下面记录一下详细过程

    2024年01月18日
    浏览(39)
  • Java进阶(4)——结合类加载JVM的过程理解创建对象的几种方式:new,反射Class,克隆clone(拷贝),序列化反序列化

    1.类什么时候被加载到JVM中,new,Class.forName: Class.forName(“包名.类名”); 2.创建对象的方式,反射,本质是获得类的类对象Class; 3.克隆clone,深拷贝,浅拷贝的对比; 4.序列化和反序列化的方式; Hello h; // 此时没有用Hello,jvm并没有进行类加载 看到new : new Book() Class.forName:

    2024年02月12日
    浏览(42)
  • 使用Git克隆(clone)Gitee的代码到本地文件夹

    注意:不论是在项目的哪个文件夹下来拿HTTPs下载链接,都会直接clone整个项目到本地 然后摁下\\\"Enter\\\",代码就会被Git到本地仓库

    2024年02月22日
    浏览(51)
  • MySQL篇—通过Clone插件进行本地克隆数据(第二篇,总共三篇)

        在上一篇文章中,我们深入探讨了Clone技术的多种用途,以及使用它所需满足的前提条件。我们也详细分析了Clone存在的限制,并深入了解了其背后的备份原理。今天,我们将继续探索MySQL Clone Plugin的强大功能,Clone其实最重要的就是克隆数据了,包括本地克隆数据和远程

    2024年02月02日
    浏览(37)
  • JS的深拷贝和浅拷贝

    ‍本文作者是360奇舞团开发工程师 在讨论深拷贝和浅拷贝之前,先来了解下Js基本数据和引用数据类型的存储问题 基本数据类型:Number String Boolean Undefined Symbol Null 引用类型 :Object,function,Array等 基本数据类型的值存放在栈中,在栈中存放的是对应的值;引用类型对应的值存

    2024年02月09日
    浏览(39)
  • Git基础教程:使用Git Clone指令克隆指定分支的代码到嵌入式系统

    Git是一种分布式版本控制系统,广泛应用于软件开发中。Git Clone是Git的一条常用指令,用于克隆远程代码仓库到本地。在嵌入式系统开发中,我们经常需要从远程仓库中获取特定分支的代码,并将其部署到嵌入式设备上。本文将详细介绍如何使用Git Clone指令来克隆指定分支的

    2024年02月04日
    浏览(57)
  • 【git】Fork或者git clone克隆了别人项目,如何保持与原项目同步更新

    Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库# 一、网页/服务端Fork别人的项目到你的Github 如何在 Github 网页端同步更新? 进入你自己的 fork 过来的仓库。 点击 “Pull requests” ,如何点击右侧绿色的 “New pull request”。Github 首先会比较

    2024年02月08日
    浏览(46)
  • Rust中的Copy和Clone

    Rust中的 Copy 和 Clone trait都允许创建类型实例的副本。它们都提供了一种复制类型实例的方法,但它们之间存在一些重要的区别。了解这些区别有助更好地使用这两个特征。 Copy trait允许按位复制类型的实例。这意味着当您将一个变量赋值给另一个变量时,如果该类型实现了

    2023年04月22日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包