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;
    }
}

现在创建两个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);
    }
}

运行结果如下:

person1.a: 1
person2.a: 1
person1.b: World
person2.b: Hello

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

你可能感兴趣的:(java,开发语言)