对象克隆:
浅克隆:
被克隆的对象中的值类型数据被复制一份新值,但是引用的对象只被复制其引用传递给新克隆出来的对象
深克隆:
被克隆的对象中的值类型数据被复制一份新值,并且其中引用的对象会重新创建新的对象,把新对象的引用传递给新克隆出来的对象
一般情况下,认为克隆出来的对象与原对象的关系应该是:
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方法是一个浅复制