Java实现深、浅Clone
来源:互联网 发布:淘宝卖家发短信的软件 编辑:程序博客网 时间:2024/06/05 21:52
Java实现Clone可以通过实现Cloneable接口,在实现类中调用super.clone()方法,即可实现浅克隆当前对象(为什么是当前对象,稍后解释)。之所以叫做“浅克隆“,是针对属性是非基本类型(共有八种基本类型)而言,基本类型在深、浅Clone中都一样。非基本类型在浅克隆中,只是复制一份对象的reference,不复制对象本身,而深克隆会复制对象本身。不复制对象本身就会有一个问题,当改动Clone对象中的属性时,原对象的属性也会被迫改动。例如:
输出结果
name=Kevin ,age=25,date=3915-10-30 16:30:56name=Kevin ,age=25,date=3915-10-30 16:30:56
更改Clone对象中的Date后,原始对象中的Date也随之改变。深克隆可以避免这种问题的产生,我提供两种深克隆的实现,一是循环Clone,一是实现Serializable接口反序列化生成全新的对象。
循环Clone,就是讲所有非基本类型Clone之后赋值,如:
package com.derby.nuke.adapter.starwood.avail;import java.io.Serializable;import java.util.Date;public class Programmer implements Cloneable{private String name; // 员工姓名private int age; // 员工年龄private Date date; /* 构造方法 */Programmer(String name, int age, Date date) {this.name = name;this.age = age;this.date = date;}public Object clone() throws CloneNotSupportedException { // 定义克隆方法Programmer p = (Programmer) super.clone();// 确定要复制的对象p.date =(Date) date.clone();return p;}public static void main(String[] args) {try {Programmer p1 = new Programmer("Kevin ", 25, new Date());Programmer p2 = (Programmer) p1.clone();Date d = p2.date;d.setYear(2015);System.out.println("name=" + p1.name + ",age=" + p1.age + ",date=" + p1.date.toLocaleString());System.out.println("name=" + p2.name + ",age=" + p2.age + ",date=" + p2.date.toLocaleString());} catch (CloneNotSupportedException e) {System.out.println("CloneNotSupportedException异常" + e.getMessage());e.printStackTrace();}}}Serializable接口反序列化生成全新的对象,如:
对于super.clone()方法返回的对象为什么是当前对象而不是父类对象?
Object中的clone执行的时候使用了RTTI(run-time type identification)的机制,动态得找到目前正在调用clone方法的那个reference,根据它的大小申请内存空间,然后进行bitwise的复制,将该对象的内存空间完全复制到新的空间中去,从而达到shallowcopy的目的。 所以调用super.clone() 得到的是当前调用类的副本,而不是父类的副本
0 0
- Java实现深、浅Clone
- java.lang.Cloneable 实现深clone和浅clone
- java 深clone和浅clone
- java实现shadow clone(浅克隆)与深克隆(deep clone)
- java实现shallow clone(浅克隆)与深克隆(deep clone)
- java实现深克隆(deep clone)
- Java Deep Clone Shallow Clone 深克隆和浅克隆
- Java Deep Clone Shallow Clone 深克隆和浅克隆
- Java基础五:浅clone和深clone
- java 实现对象的clone
- Java中的clone() 深拷贝 浅拷贝
- java中的clone( ) -- 浅拷贝 | 深拷贝
- java---深clone例子
- (3) java.lang.Object.clone()方法 以及 深拷贝浅拷贝 及其 实现
- java实现深复制:clone()及序列化
- java实现深复制:clone()及序列化
- java实现深复制:clone()及序列化
- 引用clone 浅clone 深clone 利用序列化clone 利用反射深clone
- libcurl的使用
- 自定义 ViewController 容器转场
- Python集成开发环境(Eclipse + Pydev)
- UVALive 6533 Inverting Huffman 哈夫曼树(构造
- java编写的2048程序
- Java实现深、浅Clone
- 20141030 N2
- 数据库锁表原因分析
- 【引用】objective-c copy mutableCopy 拷贝对象
- 【引用】Objective-C 的 self 和 super 详解
- Objective-C学习笔记第一章启程
- Objective-C学习笔记第二章对C的扩展
- Objective-C学习笔记第三章面向对象编程
- Objective-C学习笔记第四章继承