Java的深拷贝和浅拷贝深入了解

yizhihongxing

Java的深拷贝和浅拷贝深入了解

什么是深拷贝和浅拷贝

在Java中,对象的拷贝分为深拷贝和浅拷贝两种方式。

  • 浅拷贝:浅拷贝是指创建一个新对象,然后将原对象的非静态字段值复制到新对象中。如果字段是基本类型,则复制其值;如果字段是引用类型,则复制其引用,即新对象和原对象引用同一个对象。因此,对于引用类型字段的修改会影响到原对象和新对象。
  • 深拷贝:深拷贝是指创建一个新对象,并递归地复制原对象及其所有引用类型字段所引用的对象。这样,新对象和原对象引用的是不同的对象,对于引用类型字段的修改不会影响到原对象和新对象。

深拷贝和浅拷贝的实现方式

浅拷贝的实现方式

  • 使用clone()方法:Java中的Object类提供了clone()方法,可以实现对象的浅拷贝。需要注意的是,被拷贝的类必须实现Cloneable接口,并重写clone()方法。
  • 使用拷贝构造函数:通过定义一个构造函数,接受同类型的对象作为参数,将参数对象的字段值复制给新对象的字段。

示例1:使用clone()方法实现浅拷贝

class Person implements Cloneable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

// 测试
Person person1 = new Person(\"Alice\", 25);
Person person2 = (Person) person1.clone();

示例2:使用拷贝构造函数实现浅拷贝

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person(Person other) {
        this.name = other.name;
        this.age = other.age;
    }
}

// 测试
Person person1 = new Person(\"Alice\", 25);
Person person2 = new Person(person1);

深拷贝的实现方式

  • 通过序列化和反序列化:将对象序列化为字节流,然后再反序列化为新的对象。这种方式可以实现对象及其引用类型字段的深拷贝,但要求对象及其引用类型字段都必须实现Serializable接口。
  • 递归复制对象及其引用类型字段:通过递归地复制对象及其引用类型字段,创建新的对象。这种方式需要手动实现递归复制的逻辑。

示例1:通过序列化和反序列化实现深拷贝

import java.io.*;

class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person deepCopy() throws IOException, ClassNotFoundException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(this);

        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return (Person) ois.readObject();
    }
}

// 测试
Person person1 = new Person(\"Alice\", 25);
Person person2 = person1.deepCopy();

示例2:递归复制对象及其引用类型字段实现深拷贝

class Person {
    private String name;
    private Address address;

    public Person(String name, Address address) {
        this.name = name;
        this.address = new Address(address.getCity(), address.getStreet());
    }

    public Person deepCopy() {
        return new Person(this.name, this.address);
    }
}

class Address {
    private String city;
    private String street;

    public Address(String city, String street) {
        this.city = city;
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public String getStreet() {
        return street;
    }
}

// 测试
Address address = new Address(\"New York\", \"123 Main St\");
Person person1 = new Person(\"Alice\", address);
Person person2 = person1.deepCopy();

以上是关于Java中深拷贝和浅拷贝的详细讲解,包括定义、实现方式和示例说明。根据具体需求,选择适合的拷贝方式来保证对象的正确复制。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java的深拷贝和浅拷贝深入了解 - Python技术站

(0)
上一篇 2023年10月15日
下一篇 2023年10月15日

相关文章

  • Sublime Text4 配置 Python3 环境、代码提示、编译报错的解决方案

    下面是 “Sublime Text4 配置 Python3 环境、代码提示、编译报错的解决方案” 的完整攻略。 1. 下载安装 Sublime Text4 Sublime Text4 是一款轻量、快速、稳定的编辑器,可支持 Python 语言,并具有各种插件和设计特性。因此,首先需要下载安装 Sublime Text4。 下载地址:https://www.s…

    other 2023年6月27日
    00
  • 劲舞团服务器架设教程初窥探讨篇

    劲舞团服务器架设教程初窥探讨篇 背景介绍 劲舞团是一款风靡全球的音乐舞蹈游戏,玩家可以通过该游戏在线进行音乐游戏比赛。对于一些想要自己架设劲舞团游戏服务器的玩家来说,需要掌握一定的网络技术和服务器架设知识。本文将为您介绍劲舞团服务器架设的初步探讨,帮助您了解劲舞团服务器架设的过程和注意事项。 步骤介绍 步骤一:环境安装 在开始进行劲舞团服务器架设前,需要先安…

    other 2023年6月27日
    00
  • 在mac中怎么显示隐藏文件夹

    在mac中如何显示隐藏文件夹 macOS系统中,有一些系统文件夹是默认被隐藏起来的,例如.bash_profile、Library等。这是为了保护系统文件不被误操作删除,但对于一些高级用户来说,这些隐藏文件确实是需要经常访问的,那么该如何在mac中显示这些隐藏文件夹呢? 方法一:使用终端命令 在终端中输入以下命令,可以显示所有隐藏的文件夹和文件: defau…

    其他 2023年3月29日
    00
  • CentOS 7中搭建NFS文件共享存储服务的完整步骤

    下面是在CentOS 7中搭建NFS文件共享存储服务的完整步骤: 步骤一:安装NFS工具 在命令行中执行以下命令: sudo yum install nfs-utils 步骤二:创建共享目录 在命令行中执行以下命令: sudo mkdir /mnt/nfs_share 步骤三:配置NFS服务 用以下命令来打开“/etc/exports”文件,并在文件结尾添加…

    other 2023年6月27日
    00
  • 利用DNSLog实现无回显注入

    利用 DNSLog 实现无回显注入 在网络安全领域,无回显(Blind)注入攻击是一种常见的攻击方式。相比于普通的注入攻击,无回显注入攻击更难被发现和防范。为了利用这种攻击方式,黑客们常常会使用 DNSLog 工具进行控制和取数据。在本文中,我们将介绍如何使用 DNSLog 实现无回显注入攻击。 什么是 DNSLog DNSLog 是一款开源的,基于 DNS…

    其他 2023年3月28日
    00
  • jetbrainsc++ideclion配置与评测

    JetBrains C++ IDE CLion配置与评测 JetBrains C++ IDE CLion是一款功能强大的C++开发工具,它提供了丰富的功能和工具,可以帮助我们更高效地开发C++应用程序。以下是JetBrains C++ IDE CLion配置与评测的完整攻略。 步骤 以下是JetBrains C++ IDE CLion配置与评测的步骤: 下载…

    other 2023年5月6日
    00
  • idea中如何导入一个maven项目并配置相关设置

    在 IntelliJ IDEA 中导入一个 Maven 项目并配置相关设置的步骤如下: 打开 IntelliJ IDEA,点击“File” -> “New” -> “Project”,选择“Maven”并点击“Next”。 在“ Project”窗口中,选择“Create from archetype”并选择“maven-archetype-qu…

    other 2023年5月7日
    00
  • C#变量命名规则小结

    当使用C#编程时,了解变量命名规则是非常重要的。变量命名规则指定了在编写C#代码时,变量名应该遵循的规范。下面是一个详细的攻略,帮助您理解C#变量命名规则。 变量命名规则 变量名只能包含字母、数字和下划线(_),不能包含空格或其他特殊字符。 变量名必须以字母或下划线开头,不能以数字开头。 变量名区分大小写,例如myVariable和myvariable是不同…

    other 2023年8月8日
    00
合作推广
合作推广
分享本页
返回顶部