浅拷贝:复制一个对象,对象内部存在的指向其他对象的引用则不赋值。
深拷贝:除了赋值对象本身外,还复制对象内部引用指向的对象。
为了更加清楚地表达两者之间的区别,用图示说明。
假设有一个对象A,包含两个对象A1、A2的引用。
对A进行浅拷贝后,得到对象B,但是对象A1、A2并没有被拷贝:
对A进行深拷贝,得到对象B的同时,A1和A2连同它们的引用也被拷贝:
上面,我们对浅拷贝和深拷贝的概念有了一定了解,接下来对java的克隆进行一些讨论。
在最基本的Object类中,有一个本地方法clone(),为避免创建的每个类都默认具有克隆能力,JDK中将该方法设置为protected。Object.clone()会检查原先的对象有多大,再为新对象腾出足够多的内存,将所有二进制位从原来的对象复制到新对象。这叫做“按位复制”。在Object.clone()开始操作前,首先会检查一个类是否具有克隆能力,即它是否实现了Cloneable接口。若未实现,Object.clone()方法会抛出一个CloneNotSupportedException异常,指出我们不能克隆它。
根据上面的描述,如果要使用Object.clone()来实现对象的克隆功能,有两点需要注意:1、调用super.clone(),并将克隆方法设置为public;2、实现cloneable接口。
另外,利用java序列化也可以实现克隆。