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

yizhihongxing

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实现

    接口签名是一种验证接口调用合法性的方式,在API开发中经常被使用。接口签名的实现过程需要借助对参数进行加密的算法,而具体的加密算法需要根据接口签名的实现规则来确定。下面我们就来详细讲解如何用Java实现接口签名的过程。 1. 接口签名实现规则 在使用Java实现接口签名之前,必须要明确如下接口签名实现规则。 1.1 参数加密 接口签名需要对参与签名的参数进行…

    Java 2023年5月26日
    00
  • uni-app 微信小程序授权登录的实现步骤

    下面是详细讲解“uni-app 微信小程序授权登录的实现步骤”的完整攻略: 一、前置条件 在进行微信小程序授权登录之前,要确保以下几个前置条件已经满足: 已经注册微信小程序开发者账号,并创建了一个小程序。 在小程序后台设置了合法的“授权域名”。 在小程序后台开启了“用户信息”,并获取了对应的“AppID”和“AppSecret”。 二、授权登录实现步骤 接下…

    Java 2023年5月23日
    00
  • SSM框架实现分页和搜索分页的示例代码

    下面我来为你详细讲解SSM框架实现分页和搜索分页的完整攻略。 一、前期准备 在实现SSM框架的分页和搜索分页功能前,需要进行一些前期准备工作: 导入MyBatis和Spring相关依赖。 创建数据库表,并插入数据。 配置数据源和MyBatis等相关配置文件。 定义Mapper和Service层接口及其实现类。 编写Controller层接口。 二、实现分页功…

    Java 2023年6月16日
    00
  • jdk6安装说明 在windows xp中安装JAVA环境办法分享

    下面是“jdk6安装说明 在windows xp中安装JAVA环境办法分享”的完整攻略: 环境准备 首先,你需要下载JDK6的安装包并准备好你的Windows XP电脑。 安装JDK6 双击JDK6安装程序,选择“安装”,然后点击“下一步”按钮。 阅读许可协议,选择“我接受”选项,然后点击“下一步”按钮。 选择JDK软件的安装路径,然后点击“下一步”按钮。 …

    Java 2023年5月24日
    00
  • java创建txt文件并存入内容

    下面就为您详细讲解如何使用Java语言创建txt文件并存入内容的完整攻略。 1. 准备工作 在创建和存入txt文件之前,我们需要先建立一个Java项目,打开eclipse等IDE并创建一个Java类。接着引入如下包: import java.io.File; import java.io.FileWriter; import java.io.IOExcept…

    Java 2023年5月20日
    00
  • Java核心教程之常见时间日期的处理方法

    Java核心教程之常见时间日期的处理方法 介绍 在Java编程中,处理时间与日期是常见的任务。Java提供了多种处理时间与日期的方式,本文将介绍常见的时间与日期的处理方法及其实现。 Date类 Java中最基础的日期类型是Date类。Date类表示的是从Java纪元以来的毫秒数,可以用来描述一个时间点。Date类提供了很多方法,如getYear()、getM…

    Java 2023年5月20日
    00
  • C#纯代码实现打字游戏

    下面是“C#纯代码实现打字游戏”的完整攻略: 步骤一:创建项目和界面 打开Visual Studio,创建一个新的Windows Forms Application项目。 在Form中设计游戏界面,可以添加文本框用于显示单词或句子,添加计时器用于计时等。 步骤二:生成单词列表 在代码中定义一个string类型的数组,存储所有可能出现的单词或句子。 可以使用R…

    Java 2023年5月19日
    00
  • Java使用JSONObject操作json实例解析

    下面我将为你详细讲解Java使用JSONObject操作json实例解析的完整攻略。 什么是JSONObject 在Java中操作json数据需要用到第三方库,其中一个流行的库是JSON-java。而JSONObject就是JSON-java库中的一个类,用于操作Json格式的数据。 导入JSON-java库 在使用JSON-java库前,需要先将其导入到项…

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