Java 语言 克隆 Clone 方法实现 浅拷贝与深拷贝的区别

Java阿木 发布于 23 天前 5 次阅读


摘要:在Java编程中,对象的复制是一个常见的需求。浅拷贝和深拷贝是两种常见的复制方式,它们在复制对象时有着不同的表现和适用场景。本文将深入探讨浅拷贝与深拷贝的区别,并通过代码示例展示如何在Java中实现这两种拷贝方法。

一、

在Java中,对象的复制可以通过多种方式实现,其中最常见的是通过构造函数、克隆方法或者序列化。在这三种方式中,克隆方法提供了最灵活的复制方式,因为它允许我们自定义复制过程。克隆方法分为浅拷贝和深拷贝两种,它们在复制对象时有着不同的表现。

二、浅拷贝与深拷贝的区别

1. 概念区别

浅拷贝:创建一个新的对象,然后复制原对象的基本类型成员变量值,对于引用类型成员变量,则直接复制引用,而不是复制引用指向的对象。

深拷贝:创建一个新的对象,然后复制原对象的所有成员变量值,包括基本类型和引用类型。对于引用类型成员变量,则递归复制引用指向的对象。

2. 表现区别

浅拷贝:如果原对象中的引用类型成员变量所指向的对象发生变化,那么新对象中的引用类型成员变量也会受到影响。

深拷贝:即使原对象中的引用类型成员变量所指向的对象发生变化,新对象中的引用类型成员变量所指向的对象不会受到影响。

3. 适用场景

浅拷贝:适用于对象中不包含复杂嵌套结构,或者嵌套结构中的对象不需要独立修改的情况。

深拷贝:适用于对象中包含复杂嵌套结构,或者嵌套结构中的对象需要独立修改的情况。

三、Java中实现浅拷贝与深拷贝

1. 实现浅拷贝

在Java中,实现浅拷贝可以通过以下方式:

(1)通过构造函数实现

java

public class ShallowCopy {


private int id;


private String name;


private ShallowCopyChild child;

public ShallowCopy(ShallowCopy source) {


this.id = source.id;


this.name = source.name;


this.child = source.child;


}


}


(2)通过克隆方法实现

java

public class ShallowCopy implements Cloneable {


private int id;


private String name;


private ShallowCopyChild child;

@Override


protected Object clone() throws CloneNotSupportedException {


return super.clone();


}


}


2. 实现深拷贝

在Java中,实现深拷贝可以通过以下方式:

(1)通过构造函数实现

java

public class DeepCopy {


private int id;


private String name;


private DeepCopyChild child;

public DeepCopy(DeepCopy source) {


this.id = source.id;


this.name = source.name;


this.child = new DeepCopyChild(source.child);


}


}


(2)通过克隆方法实现

java

public class DeepCopy implements Cloneable {


private int id;


private String name;


private DeepCopyChild child;

@Override


protected Object clone() throws CloneNotSupportedException {


DeepCopy clone = (DeepCopy) super.clone();


clone.child = new DeepCopyChild(this.child);


return clone;


}


}


四、总结

本文介绍了Java中浅拷贝与深拷贝的区别,并通过代码示例展示了如何在Java中实现这两种拷贝方法。在实际开发中,我们需要根据具体需求选择合适的拷贝方式,以确保对象的正确复制。

注意:在实际应用中,对于复杂对象的深拷贝,可能需要递归复制嵌套结构,或者使用序列化等方式实现。本文仅展示了基本的实现方法,具体实现方式可能因项目需求而有所不同。