摘要:本文将详细介绍Java中的深拷贝和浅拷贝概念,通过分析源码和举例说明,帮助读者更好地理解这两种拷贝方式的区别及应用场景。
一、深拷贝与浅拷贝的概念
深拷贝:复制一个对象后,无论是基本数据类型还是引用类型,都是重新创建的。简单来说,深拷贝就是进行了完全彻底的复制。
浅拷贝:对基本数据类型进行拷贝时,是值传递;对引用数据类型进行拷贝时,只是进行了引用传递,没有真实创建新的对象。
二、深拷贝与浅拷贝的实现
- 深拷贝
Java中,所有的对象都继承自Object类,Object类中提供了一个方法供我们对Java对象进行拷贝:clone()。要想成功调用这个方法,首先该类要实现Cloneable接口,并覆盖clone()方法。
深拷贝的实现过程如下:
(1)实现Cloneable接口。
(2)覆盖Object类的clone()方法。
(3)在clone()方法中,对基本类型数据进行值传递,对引用类型数据创建一个新的对象,并复制其内容。 - 浅拷贝
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;}@Overrideprotected 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技术栈公众号