A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© vipzh 中级黑马   /  2012-12-5 10:21  /  1415 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Java中的深度克隆和浅度克隆

3 个回复

倒序浏览
浅克隆:就是被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。就是说浅克隆只复制了当前的对象得字段的逐字段拷贝,对当前的对象的引用还是指向以前的。

深克隆:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

深克隆与浅克隆的区别:浅克隆不用序列化,这种克隆方式仅仅只是将指定的当前对象复制出来一个,这种复制过程不包括原对象引用的各个对象,引用的对象不变。深克隆的过程是通过序列化来完成的,而序列化的过程可以将对象及所牵涉的所有引用链中的对象一起通过字节流的方式转移到特定的存储,再通过反序列化的过程读出这些序列化的字节流重构出对象,这样就完成了一个新对象的产生。
Java的clone()方法

  2.1 clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足:

  ①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象

  ②对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样

  ③如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。

  2.2 Java中对象的克隆

  ①为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。

  ②在派生类中覆盖基类的clone()方法,并声明为public。

  ③在派生类的clone()方法中,调用super.clone()。

  ④在派生类中实现Cloneable接口。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
克隆的特点:
1.克隆后的对象具有克隆前的对象的属性和方法。
2.哪个类要克隆就要实现接口。
浅克隆:就是只复制一个对象,而对象内部所存在的指向其他对象、数组或者引用则不予复制。
深克隆:相对于浅克隆,深克隆就不仅仅是复制一个对象那么简单,同时也会复制对象内部所包含的所有引用。
PS:改变浅克隆得到的对象(即引用)会影响对象本身的值和引用,而改变深克隆得到的对象则不会改变原来对象本身的值和引用(因为深克隆是对原对象进行了完全的按位复制,包括原对象的值和引用)。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
A,  无论是深克隆还是浅克隆都是克隆,既然是克隆就必然会产生一个全新的对象,这个全新的对象和原对象的保持一致性的深浅取决于克隆的深度。但需要始终明确的一点是克隆的对象与源对象没有任何关系,它在堆中是一个独立的实体,占据独立的内存地址,与原对象没有任何引用与指向关系。这个新生的对象是在源对象被克隆时由JVM运行时环境在调用类加载器时通过反射创建出来的。B、深克隆与浅克隆的区别:深克隆的过程是通过序列化来完成的,而序列化的过程可以将对象及所牵涉的所有引用链中的对象一起通过字节流的方式转移到特定的存储单元中(这个存储单元可以是内存也可以是硬盘,对于克隆通常是序列化至内存),再通过反序列化的过程读出这些序列化的字节流重构出对象,这样就完成了一个新对象的产生。而浅克隆不用序列化,这种克隆方式仅仅只是将指定的当前对象复制出来一个,这种复制过程不包括原对象引用的各个对象C、克隆出的对象与原对象具有相同的属性及方法,但克隆的对象与原对象是属于两个不同的独立对象,因此二者占据内存中不同的空间地址。这就好比两个人长的极为相像但他们毕竟还是属于两个人,可以住在不同的场所。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马