Java对象深复制与浅复制实例详解

Java对象深复制与浅复制实例详解

在 Java 中,对象的复制分为浅复制和深复制两种方式。本文将详细讲解 Java 中对象复制的概念、浅复制和深复制的实现方式、以及深浅复制的应用场景。

对象复制的概念

在 Java 中,我们可以通过 new 运算符来生成新的对象实例,但是有时候我们需要创建一个新对象,它的属性和原对象一模一样而且它们内存地址不同,这个时候就需要使用对象复制。

对象复制分为两种方式,浅复制和深复制。

浅复制

浅复制是指创建一个新对象,其属性和原对象的属性全部相同,但是引用类型对象的内存地址仍然相同。也就是说,新对象与原对象的引用对象之间共享内存地址,对其中一个对象的引用对象进行修改会影响到另一个对象的引用对象。

以下是一个浅复制的示例代码:

class Person implements Cloneable {
    String name;
    Phone phone;

    public Person(String name, Phone phone) {
        this.name = name;
        this.phone = phone;
    }

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

    public String toString() {
        return "Person{name='" + name + "', phone=" + phone.toString() + "}";
    }
}

class Phone {
    String model;
    String color;

    public Phone(String model, String color) {
        this.model = model;
        this.color = color;
    }

    public String toString() {
        return "Phone{model='" + model + "', color='" + color + "'}";
    }
}

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Phone phone = new Phone("iPhone", "white");
        Person person1 = new Person("张三", phone);
        Person person2 = (Person) person1.clone();
        System.out.println("person1: " + person1.toString());
        System.out.println("person2: " + person2.toString());
        // 修改 phone 对象
        phone.model = "Samsung";
        phone.color = "black";
        System.out.println("person1 after modification: " + person1.toString());
        System.out.println("person2 after modification: " + person2.toString());
    }
}

输出结果:

person1: Person{name='张三', phone=Phone{model='iPhone', color='white'}}
person2: Person{name='张三', phone=Phone{model='iPhone', color='white'}}
person1 after modification: Person{name='张三', phone=Phone{model='Samsung', color='black'}}
person2 after modification: Person{name='张三', phone=Phone{model='Samsung', color='black'}}

从上述代码执行的结果可以看出,person1 和 person2 的 phone 引用对象是相同的,当修改 phone 对象时,不论是 person1 还是 person2 都会受到影响。

深复制

深复制是指创建一个新对象,其属性和原对象的属性全部相同,包括引用类型对象的内存地址都是不同的。也就是说,新对象中的所有属性都是全新的,与原对象的属性之间不会共享内存地址,对其中一个对象的引用对象进行修改不会影响到另一个对象的引用对象。

以下是一个深复制的示例代码:

class Person implements Cloneable {
    String name;
    Phone phone;

    public Person(String name, Phone phone) {
        this.name = name;
        this.phone = phone;
    }

    public Object clone() throws CloneNotSupportedException {
        Person person = (Person) super.clone();
        person.phone = (Phone) phone.clone();
        return person;
    }

    public String toString() {
        return "Person{name='" + name + "', phone=" + phone.toString() + "}";
    }
}

class Phone implements Cloneable {
    String model;
    String color;

    public Phone(String model, String color) {
        this.model = model;
        this.color = color;
    }

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

    public String toString() {
        return "Phone{model='" + model + "', color='" + color + "'}";
    }
}

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Phone phone = new Phone("iPhone", "white");
        Person person1 = new Person("张三", phone);
        Person person2 = (Person) person1.clone();
        System.out.println("person1: " + person1.toString());
        System.out.println("person2: " + person2.toString());
        // 修改 phone 对象
        phone.model = "Samsung";
        phone.color = "black";
        System.out.println("person1 after modification: " + person1.toString());
        System.out.println("person2 after modification: " + person2.toString());
    }
}

输出结果:

person1: Person{name='张三', phone=Phone{model='iPhone', color='white'}}
person2: Person{name='张三', phone=Phone{model='iPhone', color='white'}}
person1 after modification: Person{name='张三', phone=Phone{model='Samsung', color='black'}}
person2 after modification: Person{name='张三', phone=Phone{model='iPhone', color='white'}}

从上述代码执行的结果可以看出,person1 和 person2 的 phone 引用对象是不同的,当修改 phone 对象时,只有 person1 被影响,而 person2 没有变化。

深浅复制的应用场景

浅复制和深复制的使用场景是不同的。在实际开发中,应该根据场景选择合适的复制方式。

浅复制适用于以下场景:

  • 对象的属性比较简单。
  • 其中一个对象没必要拥有自己的引用对象副本。

深复制适用于以下场景:

  • 对象的属性比较复杂,其中包含了大量的引用类型对象。
  • 这些引用类型对象必须独立存在,不能共享内存地址。
  • 对象被修改后不希望对另一个对象产生影响。

结论

本文主要讲解了 Java 中对象复制的概念、浅复制和深复制的实现方式,以及深浅复制的应用场景。

在实际开发中,应该根据实际需求选择合适的复制方式,避免因为复制的问题而导致程序出错。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java对象深复制与浅复制实例详解 - Python技术站

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

相关文章

  • 解决SpringBoot项目启动后网页显示Please sign in的问题

    针对SpringBoot项目启动后网页显示Please sign in的问题,一般是因为Spring Security认证授权机制未配置或配置不正确所致,可以采取以下步骤进行解决: 第一步:检查pom.xml中是否添加Spring Security依赖 启动Spring Security需要添加spring-boot-starter-security依赖,检…

    Java 2023年5月20日
    00
  • Android UI设计与开发之实现应用程序只启动一次引导界面

    下面是Android UI设计与开发之实现应用程序只启动一次引导界面的攻略: 步骤一:创建一个启动界面 在你的Android应用程序中,创建一个启动界面,用于判断应用程序当前是否是第一次启动。当应用程序是第一次启动时,这个启动界面将会展示引导页面,否则直接跳转到应用程序主界面。 步骤二:判断是否是第一次启动 在启动界面中加入一些代码,用于判断当前应用程序是否…

    Java 2023年5月20日
    00
  • 基于Java网络编程和多线程的多对多聊天系统

    基于 Java 网络编程和多线程的多对多聊天系统 系统概述 本系统是一款多对多聊天系统,利用 Java 的网络编程和多线程技术实现。该系统可以丰富人们之间的交流方式,提高沟通效率,并且适用于小型团体中人员之间的交流。 功能特点 本系统的主要功能包括: 用户注册、登录和退出 用户发起聊天和群聊功能 在线用户列表实时更新 聊天记录保存和查询功能 离线消息推送功能…

    Java 2023年5月19日
    00
  • JWT Token实现方法及步骤详解

    JWT Token实现方法及步骤详解 什么是JWT Token JWT(JSON Web Token)是一种用于访问网络资源的安全令牌。JWT用于在客户端和服务器之间安全地传输被称为声明的信息。 JWT包括三个部分,即头部(header)、载荷(payload)和签名(signature)。其中,头部是一个由两个字段组成的JSON对象,分别是类型(typ)和…

    Java 2023年5月20日
    00
  • Java 实现对称加密算法

    Java 实现对称加密算法攻略 对称加密算法指使用同一个密钥进行加解密的加密算法。本攻略将介绍 Java 如何实现对称加密算法,主要包括以下内容: 对称加密算法的种类 Java 中实现对称加密的常用类库 对称加密算法的实现步骤 示例说明 对称加密算法的种类 对称加密算法包括 DES、3DES、AES 等常用算法。其中,AES 目前是最常用的对称加密算法。 J…

    Java 2023年5月26日
    00
  • MyEclipse+Tomcat配置详解(图文)

    首先,需要说明的是,配置MyEclipse和Tomcat的过程并不是一成不变的,不同版本的软件可能会有些许差别。但是,总体上来说,配置过程都是大同小异的。接下来,我将根据网站上的“MyEclipse+Tomcat配置详解(图文)”文章,为大家详细讲解配置过程。 步骤一:下载MyEclipse和Tomact 要配置MyEclipse和Tomcat,自然需要先下…

    Java 2023年5月19日
    00
  • Java中避免NullPointerException的方法总结

    Java中避免NullPointerException的方法总结。 使用Optional类 Optional类可以对可能为空的对象进行封装,避免出现NullPointerException。使用Optional类的示例代码如下: Optional<String> optional = Optional.ofNullable(str); boole…

    Java 2023年5月26日
    00
  • Springboot 通过FastJson实现bean对象和Json字符串互转问题

    下面是详细讲解“Springboot 通过FastJson实现bean对象和Json字符串互转问题”的攻略: 1. 添加FastJson依赖 要使用FastJson完成bean对象和Json字符串的互转,需要在Springboot项目中添加FastJson依赖。在项目的pom.xml中添加以下依赖: <dependency> <groupI…

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