"实例分析java对象中浅克隆和深克隆" 在Java编程语言中,对象的克隆是一种创建新对象的方式,它与原始对象具有相同的状态,即数据成员的值相同。根据处理引用类型的不同,克隆可以分为浅克隆和深克隆。 浅克隆(Shallow Clone): 浅克隆是指创建一个新对象,这个新对象是原始对象的副本,但是对原始对象中的所有引用类型属性,仅复制引用,而不是复制对象本身。这意味着如果原始对象和克隆对象中都有一个引用类型的属性,它们都将指向内存中的同一对象。因此,修改其中一个对象的引用类型属性会影响到另一个对象。例如,在类`User`中,如果有`Mark`属性,它是`Chinse`对象的引用,那么在浅克隆后,两个`User`对象的`Mark`属性都会指向同一个`Chinse`对象。 深克隆(Deep Clone): 深克隆则更进一步,不仅创建了原始对象的副本,还对引用类型的属性执行了递归克隆,确保每个引用类型的属性都是一个新的独立的对象副本。这意味着修改原始对象或克隆对象的引用类型属性不会相互影响。为了实现深克隆,通常需要自定义克隆逻辑,或者实现`Serializable`接口并使用序列化和反序列化的方法来实现深拷贝。 在Java中,`Object`类提供了一个`clone()`方法,用于执行克隆操作。但是,这个方法默认是`protected`的,所以如果需要在类外部使用,必须在子类中重写`clone()`方法,并将其声明为`public`。此外,由于`clone()`方法抛出`CloneNotSupportedException`,所以重写时也需要捕获这个异常。 以下是一个简单的示例,展示了如何在Java中实现浅克隆和深克隆: ```java class User implements Cloneable { private String name; private Mark mark; // ... 构造函数、getters和setters等 @Override public User clone() throws CloneNotSupportedException { User clonedUser = (User) super.clone(); // 浅克隆 // 如果需要深克隆mark属性,需要手动处理 clonedUser.mark = this.mark.clone(); // 假设Mark类也实现了Cloneable return clonedUser; } } class Mark implements Cloneable { // ... Mark类的属性和方法 @Override public Mark clone() throws CloneNotSupportedException { return (Mark) super.clone(); } } ``` 在这个例子中,`User`类重写了`clone()`方法,执行浅克隆。如果希望对`Mark`进行深克隆,需要在`Mark`类中也实现`clone()`方法。请注意,对于那些不支持`clone()`方法的引用类型,如集合类,可能需要通过迭代和创建新对象来实现深克隆。 总结: 1. Java对象的克隆分为浅克隆和深克隆,区别在于处理引用类型属性的方式。 2. `Object`类的`clone()`方法是`protected`的,需要在子类中重写并调整访问权限才能在类外部使用。 3. 不实现`Cloneable`接口并尝试调用`clone()`方法会抛出`CloneNotSupportedException`。 4. 浅克隆只复制对象本身,引用类型的属性仍然共享相同的对象实例。 5. 深克隆不仅复制对象,还会对引用类型属性执行递归克隆,确保每个引用都指向新的对象实例。
下载后可阅读完整内容,剩余3页未读,立即下载
- 粉丝: 2
- 资源: 915
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- OptiX传输试题与SDH基础知识
- C++Builder函数详解与应用
- Linux shell (bash) 文件与字符串比较运算符详解
- Adam Gawne-Cain解读英文版WKT格式与常见投影标准
- dos命令详解:基础操作与网络测试必备
- Windows 蓝屏代码解析与处理指南
- PSoC CY8C24533在电动自行车控制器设计中的应用
- PHP整合FCKeditor网页编辑器教程
- Java Swing计算器源码示例:初学者入门教程
- Eclipse平台上的可视化开发:使用VEP与SWT
- 软件工程CASE工具实践指南
- AIX LVM详解:网络存储架构与管理
- 递归算法解析:文件系统、XML与树图
- 使用Struts2与MySQL构建Web登录验证教程
- PHP5 CLI模式:用PHP编写Shell脚本教程
- MyBatis与Spring完美整合:1.0.0-RC3详解