在Java中对象的克隆有深克隆和浅克隆之分。有这种区分的原因是Java中分为基本数据类型和引用数据类型,对于不同的数据类型在内存中的存储的区域是不同的。基本数据类型存储在栈中,引用数据类型存储在堆中。
java有8中基本数据类型:byte,short,int,long,float,double,char,boolean
由浅入深,先看个克隆对象的例子
1 | public class Apple{ |
输出如何呢?我们会发现当改变苹果b的重量属性时,苹果a的重量属性也被修改了;
这与基本数据类型的赋值有差异,即,传值与传址的区别;基本数据类型传的是变量的值,所以两个变量就是两个值,修改其中一个变量不会影响到另外一个变量的值;而非基本数据类型传递的是对象在堆中的地址,两个对象指向的是同一个地址,所以b对象改变了地址中对象的属性值,那么a获取属性值当然也会变了.
以上的简单粗暴直接等号赋值的方式,明显是有坑;如何让他们互不影响呢,接下来介绍”浅克隆”;
1 | public class Apple implements Cloneable{ |
通过实现Cloneable接口,重写他的clone方法实现”对象分离”;
通常遇到这种Apple只是属于”简单对象”,没有引用其他的对象,我们一般现在使用:Apple b= (Apple)a.clone();即可实现分离的效果,但是如果有引用其他的对象,还需要做进一步的改造;
1 | public class Customer implements Cloneable{ |
根据输出情况,发现当我们更改customer的name属性时,customer1与customer2互不影响;但是,更改Apple的color属性,customer1与customer2同时更改了;因为我们再对customer对象做clone操作的时候,只是针对了customer对象,并没有对Apple对象进行处理,所以customer1与customer2对象的apple属性仍然是指向了同一个地址;
通过如下方式,进一步的克隆对象:
1 |
|
总结:
1.浅克隆:只复制基本类型的数据,引用类型的数据只复制了引用的地址,引用的对象并没有复制,在新的对象中修改引用类型的数据会影响原对象中的引用。
2.深克隆:是在引用类型的类中也实现了clone,是clone的嵌套,复制后的对象与原对象之间完全不会影响。
3.使用clone实现的深克隆其实是浅克隆中嵌套了浅克隆,与toString方法类似
- 本文作者: Kiven
- 本文链接: http://hzxstudio.com/2018/08/03/objectClone/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!