Java中对象的深复制(深克隆)和浅复制(浅克隆)介绍

Java中的对象复制分为深复制和浅复制两种,本文将为大家介绍这两种复制方式,以及如何实现和应用。

一、浅复制

浅复制是指新对象只复制了原对象中的基本数据类型和引用类型变量的内存地址,而不会再次为引用类型创建新的内存空间,新对象和原对象共享引用类型变量所指向的内存空间。下面是一个浅复制示例:

public class Student implements Cloneable {
    private String name;
    private int age;
    private Course course;

    // ... 省略构造方法及setter/getter

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public class Course {
    private String name;

    // ... 省略构造方法及setter/getter
}

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Course java = new Course("Java");
        Student alice = new Student("Alice", 18, java);
        Student bob = (Student) alice.clone();

        System.out.println("alice: " + alice.toString());
        System.out.println("bob: " + bob.toString());

        System.out.println("alice.getCourse() == bob.getCourse(): " + (alice.getCourse() == bob.getCourse()));
    }
}

输出结果为:

alice: Student{name='Alice', age=18, course=Course{name='Java'}}
bob: Student{name='Alice', age=18, course=Course{name='Java'}}
alice.getCourse() == bob.getCourse(): true

可以看到,通过浅复制得到的bob与原对象alice具有相同的nameage属性,但是course属性却是指向同一个对象java的引用,这意味着bobalice共享同一个Course对象。

二、深复制

深复制是指新对象不仅复制了原对象中的基本数据类型和引用类型变量的内存地址,而且会再次为引用类型创建新的内存空间,使得新对象和原对象的引用类型变量具有不同的内存地址,不再共享任何一个对象。下面是一个深复制示例:

public class Student implements Cloneable {
    private String name;
    private int age;
    private Course course;

    // ... 省略构造方法及setter/getter

    @Override
    public Object clone() throws CloneNotSupportedException {
        Student student = (Student) super.clone();
        student.course = (Course) course.clone();
        return student;
    }
}

public class Course implements Cloneable {
    private String name;

    // ... 省略构造方法及setter/getter

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Course java = new Course("Java");
        Student alice = new Student("Alice", 18, java);
        Student bob = (Student) alice.clone();

        System.out.println("alice: " + alice.toString());
        System.out.println("bob: " + bob.toString());

        System.out.println("alice.getCourse() == bob.getCourse(): " + (alice.getCourse() == bob.getCourse()));
    }
}

输出结果为:

alice: Student{name='Alice', age=18, course=Course{name='Java'}}
bob: Student{name='Alice', age=18, course=Course{name='Java'}}
alice.getCourse() == bob.getCourse(): false

可以看到,通过深复制得到的bob与原对象alice具有相同的nameage属性,但是course属性却是指向不同的对象的引用,这意味着bobaliceCourse对象互不影响。

三、总结

浅复制和深复制都是实现对象复制的方式,但是它们之间复制的数据类型不同,应用场景也存在一定的区别。需要根据具体场景选择合适的方式进行对象的复制。

以上就是Java中对象的深复制和浅复制的介绍,希望可以帮助到大家。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中对象的深复制(深克隆)和浅复制(浅克隆)介绍 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • PHP排序算法之堆排序(Heap Sort)实例详解

    PHP排序算法之堆排序(Heap Sort)实例详解 什么是堆排序? 堆排序(Heap Sort)是一种树形选择排序,是对直接选择排序的有效改进。 堆排序的过程是将待排序的序列构建成一个大根堆(或小根堆),此时整个序列的最大(或最小)值就是堆顶的根节点。 将其与堆数组的末尾元素进行交换,此时末尾就为最大(或最小)值。 然后将剩余n-1个元素重新构造成堆,这样…

    Java 2023年5月26日
    00
  • 基于JSP的动态网站开发技术

    基于JSP的动态网站开发技术攻略 1. 什么是JSP JSP(JavaServer Pages) 是一种动态网页开发技术,它与 PHP、ASP 等技术类似,是一种基于服务端的网页解决方案。JSP 内嵌Java代码和特定的标签,可以用来生成动态网页,并和Java EE技术(Web容器、JDBC等)一起使用实现强大的功能。因此,JSP可以完美地和Java本身以及…

    Java 2023年6月15日
    00
  • java中数组的定义及使用方法(推荐)

    Java中数组的定义及使用方法 定义数组 Java中的数组是具有相同数据类型的数据元素的集合。要定义一个数组,需要指定数组类型和数组名称,然后指定数组大小。 int[] myArray = new int[5]; 上面的代码定义了一个名为myArray的整型数组,包含5个元素。每个元素默认初始化为0,它们存储在内存中相邻的位置上。这里使用的是[]来表示一个数…

    Java 2023年5月26日
    00
  • 主流品牌笔记本保修例外情况汇集

    主流品牌笔记本保修例外情况汇集 随着笔记本电脑的使用越来越广泛,其维修保养问题也变得越来越重要。笔记本电脑厂商都提供了保修服务来维持其产品的质量和信誉度。然而,我们需要了解的是,保修服务也存在例外和限制。本文收集了主流品牌笔记本保修例外情况,以帮助用户更好地理解如何保护自己的笔记本电脑。 保修期限 笔记本保修期限一般为一年或两年。在保修期限内,除非是用户自己…

    Java 2023年6月15日
    00
  • Java 8 Stream操作类型及peek示例解析

    Java 8 Stream操作类型及peek示例解析 Java 8引入了Stream API,可用于对集合和数组进行函数式操作。本篇攻略将介绍Java 8中Stream API的操作类型,并详细讲解peek()操作的定义、用法和示例。 Stream API操作类型 Stream API包含两种类型的操作:Intermediate(中间操作)和Terminal…

    Java 2023年5月26日
    00
  • 基于jsp+servlet实现的简单博客系统实例(附源码)

    这篇文章将会详细讲解如何通过使用JSP和Servlet来实现一个简单的博客系统。我们将会从搭建环境开始,到完成整个系统的构建。 环境搭建 工具准备 在开始之前,我们需要准备以下工具: Java SE Development Kit(JDK) Eclipse IDE for Java EE Developers Tomcat服务器 创建项目 打开Eclipse…

    Java 2023年6月15日
    00
  • JSP中使用JDBC访问SQL Server 2008数据库示例

    下面是详细的JSP使用JDBC访问SQL Server 2008数据库的攻略。 环境准备 安装SQL Server 2008数据库,并创建一个数据库。 下载并安装SQL Server 2008 JDBC驱动包。下载地址:https://www.microsoft.com/zh-CN/download/details.aspx?id=21599 配置Eclip…

    Java 2023年6月15日
    00
  • 关于SpringBoot整合redis使用Lettuce客户端超时问题

    好的。关于SpringBoot整合redis使用Lettuce客户端超时问题,需要注意以下几个方面:Lettuce版本问题、超时时间设置、连接池配置等。下面是一个详细的攻略: 1. 确定Lettuce版本 在使用SpringBoot整合redis时,我们需要确认使用的Lettuce版本是否与SpringBoot版本兼容。Lettuce有两个主版本:4.x和5…

    Java 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部