代码改变世界

[Java学习笔记]对象克隆

2014-05-12 17:58  hellenism  阅读(227)  评论(1编辑  收藏  举报

对象克隆:

浅克隆:

被克隆的对象中的值类型数据被复制一份新值,但是引用的对象只被复制其引用传递给新克隆出来的对象

 

深克隆:

被克隆的对象中的值类型数据被复制一份新值,并且其中引用的对象会重新创建新的对象,把新对象的引用传递给新克隆出来的对象

 


 

一般情况下,认为克隆出来的对象与原对象的关系应该是:

x.clone() != x                                   // 引用不等,分别是两个不同的对象
x.clone().getClass() == x.getClass()   // 类型相等
x.clone().equals(x)                            // 逻辑相等

但不是强制的

 


 

Java中实现克隆:

Java中Object中定义了clone方法,默认为浅克隆操作,即你只是简单super.clone得到的结果是浅克隆的结果,如果需要深克隆,则需要实现Cloneable接口,并且重写clone方法

 

查看Java源代码发现Object中的克隆方法如下:

protected native Object clone() throws CloneNotSupportedException;

 

通过JNI调用,也就是Object的默认clone实现就是C++中的浅克隆操作.

 

C++中克隆(复制)一个对象的途径一般为两种:

一是实现类的【复制构造函数】

二是实现【=号运算符】的重载

对于C++而言,所谓的浅克隆和深克隆就只是一个概念了,需要浅克隆那么在上述两种操作中就传递指针,如果需要深克隆则new出新的对象即可

 

一个类不显示实现此两个方法,无法进行对象的克隆(复制),然而由于Java的Object是默认浅克隆,所以可推断Object中的native clone方法是一个浅复制