首页 > 编程语言 >Java中的深克隆和浅克隆(Clone)

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

时间:2023-07-17 22:34:28浏览次数:23  
标签:Java 克隆 对象 clone original 字段 MyClass Clone

浅克隆(shallow clone)和深克隆(deep 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]

从输出中可以看出,对原始对象的修改影响到了浅克隆对象,但没有影响到深克隆对象。

标签:Java,克隆,对象,clone,original,字段,MyClass,Clone
From: https://www.cnblogs.com/FangwayLee/p/17561467.html

相关文章

  • Java中七七八八的各种锁
    乐观锁or悲观锁乐观锁即蹲坑不锁门,只会在更新的时候判断有没有其他线程去更改数据,有的话就回滚典型:悲观锁即进厕所立马锁门,其他线程来了即阻塞,进到阻塞队列中,等待主线程蹲坑完毕后,按顺序获取典型:synchronized和ReentrantLock独占锁or共享锁顾名思义,独占锁即获......
  • Java 变量类型
    在Java中,变量可以分为以下几种类型:变量(LocalVariables):定义在方法、构造方法或代码块内部的变量。局部变量在声明时被创建,并在方法执行完毕后被销毁。局部变量没有默认值,必须在使用前进行初始化。参数(Parameters):定义在方法或构造方法的参数列表中的变量。参数是用于接收方法......
  • Java爬虫--HttpClient-Post请求
    //下面是一个demo:packagetest;importorg.apache.http.HttpEntity;importorg.apache.http.client.methods.CloseableHttpResponse;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.util......
  • java ExecutorService 主线程不停吗
    如何实现"JavaExecutorService主线程不停"1.简介在Java中,可以使用ExecutorService来实现多线程任务的执行和管理。主线程指的是调用ExecutorService的线程,在任务执行完成之前,主线程通常是需要等待的,但有时候我们希望主线程不停止,而是继续执行其他操作。本文将介绍如何实现这......
  • java BitSet
    JavaBitSet的实现引言在Java开发中,BitSet是一个非常有用的类,用于存储和操作位集合。它可以用于各种场景,如位图索引、布隆过滤器、位掩码等。本文将介绍如何实现一个简单的JavaBitSet,并教会刚入行的开发者如何使用它。步骤概览下面是实现JavaBitSet的步骤概览,我们将一步步进......
  • java Base64 加密
    JavaBase64加密解密详解在实际应用开发中,我们经常需要对数据进行加密和解密操作。其中,Base64是一种常用的编码方式,它将二进制数据转换为可打印的ASCII字符串,使得数据可以在网络传输中进行安全的传递。本文将介绍Java中的Base64加密和解密操作,并提供相应的代码示例。Base......
  • java Array工具类构建数组
    JavaArray工具类构建数组在Java编程中,数组是一种重要的数据结构,它可以用于存储和操作一组相同类型的数据。在构建数组时,我们可以使用Java的Array工具类来帮助我们更轻松地创建和操作数组。本文将介绍如何使用JavaArray工具类来构建数组,并提供一些常用的示例代码。1.导入Array......
  • java @path
    实现Java@Path注解的步骤作为一名经验丰富的开发者,你即将向一位刚入行的小白解释如何实现Java@Path注解。这个注解用于标识RESTfulAPI中的路径。步骤概览下面是实现Java@Path注解的步骤概览,我们将通过表格的形式展示每个步骤所需的操作:步骤操作代码1.引入相关依......
  • java @Dict多个值
    Java中的@Dict多个值在Java编程中,我们经常需要处理与字典相关的数据,例如将数据库查询结果转换为可读的文字描述。在实际开发中,我们可能需要根据字典表中的多个值进行查询和转换。为了简化这一过程,我们可以使用@Dict注解来实现多个值的转换。什么是@Dict注解?@Dict注解是一种用于......
  • Java数组
    Java数组数组概述数组的定义数组是相同类型数据的有序结合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问他们数组声明创建首先必须声明数组变量,才能在程序中使用数组.下面是声明......