java深克隆和浅克隆
基本概念
浅复制(浅克隆)
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所拷贝的对象,而不复制它所引用的对象。
-
深复制(深克隆)被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
实现java深复制和浅复制的最关键的就是要实现Object中的clone()方法。
如何使用clone()方法
首先我们来看一下Cloneable接口:
官方解释:
1:实现此接口则可以使用java.lang.Object 的clone()方法,否则会抛出CloneNotSupportedException 异常
2:实现此接口的类应该使用公共方法覆盖clone方法
3:此接口并不包含clone 方法,所以实现此接口并不能克隆对象,这只是一个前提,还需覆盖上面所讲的clone方法。
public interface Cloneable { }看看Object里面的Clone()方法:
- clone()方法返回的是Object类型,所以必须强制转换得到克隆后的类型
- clone()方法是一个native方法,而native的效率远远高于非native方法,
- 可以发现clone方法被一个Protected修饰,所以可以知道必须继承Object类才能使用,而Object类是所有类的基类,也就是说所有的类都可以使用clone方法
protected native Object clone() throws CloneNotSupportedException;小试牛刀:
public class Person { public void testClone(){ super.clone(); // 报错了 } }事实却是clone()方法报错了,那么肯定奇怪了,既然Object是一切类的基类,并且clone的方法是Protected的,那应该是可以通过super.clone()方法去调用的,然而事实却是会抛出CloneNotSupportedException异常, 官方解释如下:
- 对象的类不支持Cloneable接口
- 覆盖方法的子类也可以抛出此异常表示无法克隆实例。
所以我们更改代码如下:
public class Person implements
