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日

相关文章

  • 实例讲解Java的Spring框架中的控制反转和依赖注入

    下面就来详细讲解下实例讲解Java的Spring框架中的控制反转和依赖注入的攻略: 控制反转(IoC) 控制反转是 Spring 框架的核心原则之一,它实现了松耦合的 Java 代码。控制反转的本质可以理解为:将对象创建、组装、管理的控制权交给 Spring 容器,而不是代码中硬编码实现。 可以通过以下方式来实现控制反转: 使用构造函数实现依赖注入 使用 s…

    Java 2023年5月19日
    00
  • Spring框架JdbcTemplate数据库事务管理完全注解方式

    下面开始讲解“Spring框架JdbcTemplate数据库事务管理完全注解方式”的完整攻略。 什么是JdbcTemplate JdbcTemplate是Spring JDBC 模块中的一个核心类,用于简化JDBC操作。它完全封装了JDBC API,提供了一组更简单、更少样板代码的JDBC操作方式。同时,JdbcTemplate也提供了事务处理的支持。 JD…

    Java 2023年5月19日
    00
  • Java C++ 算法题解leetcode145商品折扣后最终价格单调栈

    Java C++ 算法题解leetcode145商品折扣后最终价格单调栈 简介 本文主要介绍了使用单调栈实现leetcode145道题目的算法思路以及Java、C++两种语言的代码实现。 题目描述:给定一个数组prices表示商品每一天的价格,并且在购买这个商品时,会给出一个最大的折扣价格,那么在每天商品的价格和折扣价格之间取一个较低的价钱,输出折扣后的最终…

    Java 2023年5月19日
    00
  • Spring 加载 Application Context五种方式小结

    下面进行详细讲解“Spring 加载 Application Context 五种方式小结”的攻略。 1. 使用 ClassPathXmlApplicationContext ClassPathXmlApplicationContext 是最常用的 Spring 上下文加载方式,也是最基本的一种方式。通过该方式可以加载类路径下的 XML 文件作为 Sprin…

    Java 2023年5月31日
    00
  • Java代码重构的几种模式详解

    Java代码重构的几种模式详解 什么是代码重构 代码重构(Code Refactoring)指的是在不改变代码行为的情况下,对代码的内部结构进行调整,以改善其质量、可读性、可维护性等特征的工作。 为什么需要重构代码 重构的目的在于优化代码的可读性、可维护性和可扩展性。在开发应用或软件的过程中,可能会出现以下情况: 代码冗余:代码重复度高,出现大量重复代码而导…

    Java 2023年5月30日
    00
  • Java postgresql数组字段类型处理方法详解

    标题 Java postgresql数组字段类型处理方法详解 简介 本攻略将为您介绍在Java中如何处理postgresql数据库中的数组字段类型,包括常用的数组字段类型、处理方法及其示例说明。 数组字段类型 postgresql数据库中有两种常见的数组字段类型: character varying[]:字符串数组 integer[]:整数数组 处理方法 4…

    Java 2023年5月26日
    00
  • Java图像处理之获取用户感兴趣的区域

    下面是Java图像处理之获取用户感兴趣的区域的完整攻略。 1. 确定用户感兴趣的区域 首先需要进行的是确定用户感兴趣的区域,这可以通过鼠标点击的方式来实现。具体的流程如下: 首先需要引用Java图形处理的库,例如JavaFX等。 创建一个可视化界面,并在界面上用ImageView组件展示原始图片。 监听ImageView的鼠标点击事件,获取鼠标点击的坐标,然…

    Java 2023年5月19日
    00
  • 带你走进Maven的大门-最全Maven配置及集成idea工具总结

    带你走进Maven的大门-最全Maven配置及集成idea工具总结 什么是Maven Maven是用于Java项目的构建工具,可以帮助我们管理项目依赖、打包和发布等工作。通过引入Maven的概念,我们可以将项目开发中的依赖管理的工作与项目本身的开发工作分离出来,大大提高项目构建和依赖管理的效率。 Maven的配置 环境变量的配置 首先需要配置Maven的环境…

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