java_clone用法
### Java中的`clone`方法详解:浅拷贝与深拷贝 #### 一、引言 在Java中,`clone`方法提供了一种快速复制对象的方式。它属于`Object`类的一部分,但需要显式地在子类中声明并实现`Cloneable`接口才能正常使用。本文将详细介绍`clone`的基本概念、工作原理以及如何实现浅拷贝和深拷贝。 #### 二、预备知识 在深入了解`clone`之前,我们需要了解几个基础概念: 1. **Java的类型**:Java中的数据类型主要分为两大类——原始类型(如`int`)和引用类型(如`String`, `Object`等)。 2. **引用类型的存储**:所有引用类型的实例都存储在堆内存中。例如,对于下面的`B`类实例,其在堆内存中的存储形式包含了变量`a`的具体值以及指向字符串`b`的引用地址。 ```java public class B { int a; String b; public B(int a, String b) { this.a = a; this.b = b; } } ``` #### 三、为何使用`clone` 1. **设计模式需求**:GoF设计模式中的“原型模式”鼓励使用现有的实例作为原型来创建新的对象实例。这种情况下,`clone`方法非常有用。 2. **对象隔离**:有时,我们希望复制的对象与原对象完全隔离,即修改一个不会影响另一个。这时,`clone`可以帮助我们实现这一目标。 #### 四、`clone`的基本行为 `Object`类的`clone`方法提供了最简单的复制功能。对于一个对象`a`,`clone`方法会在堆上分配与`a`大小相同的内存空间,并将`a`的所有内容复制到这块新内存中。这包括原始类型的数据和引用类型的引用地址。然而,这种方式通常被称为“浅拷贝”。 #### 五、浅拷贝与深拷贝 - **浅拷贝**:仅复制对象本身及其包含的原始类型数据,但引用类型的字段仍然共享相同的引用。这意味着,通过浅拷贝创建的新对象在修改引用类型的字段时会同时影响到原对象。 例如,考虑以下代码示例: ```java class User { String name; int age; } class Account implements Cloneable { User user; long balance; @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } } // 示例代码 User user = new User(); user.name = "user"; user.age = 20; Account account = new Account(); account.user = user; account.balance = 10000; Account copy = (Account) account.clone(); // 修改后的结果 copy.user.name = "newName"; // 这也会修改account.user.name ``` - **深拷贝**:除了复制对象本身及其原始类型数据外,还递归地复制了对象中的所有引用类型。这意味着新对象与原对象完全隔离,即使修改引用类型的字段也不会影响到原对象。 #### 六、实现深拷贝 要实现深拷贝,通常需要在子类中重写`clone`方法,并确保复制所有引用类型的字段。例如,对于上述的`Account`类,可以这样实现: ```java @Override public Account clone() throws CloneNotSupportedException { Account clonedAccount = (Account) super.clone(); clonedAccount.user = (User) this.user.clone(); // 假设User类也实现了Cloneable接口 return clonedAccount; } ``` #### 七、何时选择深拷贝 并非所有的引用类型都需要进行深拷贝。如果引用的对象是不可变的(如`String`),则无需深拷贝,因为它们的状态无法改变。例如,如果`User`类中的`name`和`age`属性均被定义为不可变的,那么即使进行浅拷贝也不会出现问题。 #### 八、总结 在Java中,`clone`方法为我们提供了一个快速复制对象的方式。通过理解和掌握浅拷贝与深拷贝的概念,我们可以根据具体需求选择合适的方法来实现对象的复制。当涉及到引用类型的复制时,需要特别注意是否需要实现深拷贝以确保对象之间的完全隔离。
剩余12页未读,继续阅读
- tatatatatat2012-04-24很不错的clone解析,浅clone和深clone都有相关例子,很有用。
- lishengshu2482012-09-22clone分析的比较清晰,浅clone和深clone都有介绍,就是内容太杂乱了,而且DOC格式比较让人眼睛蛋疼
- chen_timi2013-08-17很好,很好用
- 粉丝: 8
- 资源: 228
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助