java浅拷贝和深拷贝
Posted 懵懂的菜鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java浅拷贝和深拷贝相关的知识,希望对你有一定的参考价值。
转:http://blog.csdn.net/u014727260/article/details/55003402
实现clone的2点:
1,clone方法是Object类的一个方法,所以任何一个类都会自动拥有该方法
2,并不是所有的类可以调用clone方法,因为javac需要程序员显示的声明,方法就是在类上声明“implements Cloneable”
浅拷贝
浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
实现对象拷贝的类,必须实现Cloneable接口,并覆写clone()方法。
深拷贝
深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。
现在为了要在clone对象时进行深拷贝, 那么就要Clonable接口,覆盖并实现clone方法,除了调用父类中的clone方法得到新的对象, 还要将该类中的引用变量也clone出来。如果只是用Object中默认的clone方法,是浅拷贝的。
如何进行彻底的深拷贝
对于上面的例子来说,怎样才能保证两个Body对象完全独立呢?只要在拷贝Head对象的时候,也将Face对象拷贝一份就可以了。这需要让Face类也实现Cloneable接口,实现clone方法,并且在在Head对象的clone方法中,拷贝它所引用的Face对象。修改的部分代码如下:
以上是关于java浅拷贝和深拷贝的主要内容,如果未能解决你的问题,请参考以下文章