• Java深拷贝与浅拷贝技术解析及实例演示


    摘要:本文将详细介绍Java中的深拷贝和浅拷贝概念,通过分析源码和举例说明,帮助读者更好地理解这两种拷贝方式的区别及应用场景。
    一、深拷贝与浅拷贝的概念
    深拷贝:复制一个对象后,无论是基本数据类型还是引用类型,都是重新创建的。简单来说,深拷贝就是进行了完全彻底的复制。
    浅拷贝:对基本数据类型进行拷贝时,是值传递;对引用数据类型进行拷贝时,只是进行了引用传递,没有真实创建新的对象。
    二、深拷贝与浅拷贝的实现

    1. 深拷贝
      Java中,所有的对象都继承自Object类,Object类中提供了一个方法供我们对Java对象进行拷贝:clone()。要想成功调用这个方法,首先该类要实现Cloneable接口,并覆盖clone()方法。
      深拷贝的实现过程如下:
      (1)实现Cloneable接口。
      (2)覆盖Object类的clone()方法。
      (3)在clone()方法中,对基本类型数据进行值传递,对引用类型数据创建一个新的对象,并复制其内容。
    2. 浅拷贝
      Java中的浅拷贝则是仅对基本数据类型进行值传递,对引用数据类型进行引用传递。当引用类型数据发生变化时,浅拷贝的对象也会受到影响。
      三、实例演示
      下面通过一个具体的例子来演示深拷贝和浅拷贝的区别。
      假设有一个Person类,其中包含两个属性:一个整数类型的基本数据类型变量a,和一个String类型的引用数据类型变量b。
    public class Person implements Cloneable {
        private int a;
        private String b;
        public Person(int a, String b) {
            this.a = a;
            this.b = b;
        }
        @Override
        protected Object clone() throws CloneNotSupportedException {
            Person clonedPerson = (Person) super.clone();
            clonedPerson.a = a; // 基本数据类型值传递
            clonedPerson.b = (String) b.clone(); // 引用数据类型值传递
            return clonedPerson;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    现在创建两个Person对象,分别进行深拷贝和浅拷贝。

    public class Main {
        public static void main(String[] args) throws CloneNotSupportedException {
            Person person1 = new Person(1, "Hello");
            Person person2 = person1.clone();
            System.out.println("person1.a: " + person1.a);
            System.out.println("person2.a: " + person2.a);
            person1.b = "World";
            System.out.println("person1.b: " + person1.b);
            System.out.println("person2.b: " + person2.b);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果如下:

    person1.a: 1
    person2.a: 1
    person1.b: World
    person2.b: Hello
    
    • 1
    • 2
    • 3
    • 4

    从这个例子可以看出,浅拷贝时,person2的b属性受到了person1变化的影响;而深拷贝时,person2的b属性独立于person1,变化不会相互影响。
    总结
    深拷贝和浅拷贝在Java中有着明显的区别。深拷贝进行了彻底的复制,无论是基本数据类型还是引用数据类型,都不会受到原对象的影响;而浅拷贝则只是对基本数据类型进行值传递,对引用数据类型进行引用传递,导致对象间的关系仍然存在,容易受到原对象的影响。在实际开发中,我们需要根据不同的场景选择合适的拷贝方式,以满足程序的设计需求。
    来源:Java技术栈公众号

  • 相关阅读:
    富文本编辑器(添加列表)
    Haskell使用了map/filter和zip来实现功能的例子
    聚甲基丙烯酰氧乙基三甲基氯化铵(Poly-MAC)表面接枝聚苯乙烯树脂微球相关研究
    2022-2027年中国劳动防护眼镜行业市场供需现状与趋势预测研究报告
    微信小程序入门开发教程
    一百八十八、Hive——HiveSQL查询表中的日期是星期几(亲测,附截图)
    OpenCV实现人脸关键点检测
    CRM项目记录(七)
    webrtc H265 网页播放器迈向实用第一步
    NodeRed Modbus学习一(配置Modsim32)
  • 原文地址:https://blog.csdn.net/weixin_40725027/article/details/134564672