作用:
得到对象的副本。
使用方法:
1. 实现Cloneable接口(一个空接口,没有需要实现的方法)
2. 覆盖Object#clone方法。
3. 在clone方法中调用super.clone()完成对象的浅拷贝(可能会抛出CloneNotSupportedException,需要try-catch)
这里说明了如果要想成功clone一个对象则要求它的超类都实现了Cloneable接口
4. 如果需要完成定制拷贝(深拷贝,修改信息等)在clone()中加入定制代码。
深浅拷贝的区别在于如何处理成员对象,深拷贝要求成员对象也要分别拷贝出一份,浅拷贝则直接复制了成员对象的引用。
深拷贝具有层次的概念,即N深拷贝,只完成前N层深拷贝,其余的使用浅拷贝。
可以使用发射和递归完成完全深拷贝。大致步骤描述如下:首先采用java reflection技术动态获取成员方法列表。然后视clone的深 度,对具备clone条件的并且有必要clone的成员进行逐一clone。这是一个递归的过程,直到clolne深度已到为止或者到对象已经没有 需要clone的成员属性为止。
Avoid implementing clone.
- clone is very tricky to implement correctly in all circumstances, nearly to the point of being pathological
- the importance of copying objects will always remain, since object fields often need to be defensively copied
- copy constructors and static factory methods provide an alternative to clone, and are much easier to implement