赞
踩
在Java中,如果要拷贝一个自定义类型的对象,那么这个对象所属的类必须实现Cloneable接口,并且重写Object类中的clone方法。
(1) 类实现Cloneable接口,表示这个类可以被克隆;
(2) 由于Objectt类中的clone方法是被Protected修饰,所以我们需要重写clone方法,通过super引用才能调用。
通过一段代码来解释什么是浅拷贝:
当前有一个Money类:
和一个Person类:
注意:Person类中有一个Money类对象。
然后我们创建一个Person对象并拷贝:
根据代码运行结果,可以发现我们拷贝成功了:
简单画一下Person1对象和Person2对象在内存中的存储:
可以看到,Person1和Person2中的Money对象其实是同一个对象~
那么通过Person2来修改m中money的值,Person1中m的money值必然也会发生变化:
代码运行结果:
像上述这种拷贝的方式就是浅拷贝:
只拷贝了对象的属性的值,如果属性是引用数据类型,并不会拷贝一个新的引用数据类型对象。
要解决上面浅拷贝中的问题,就需要用到深拷贝:如果被拷贝对象的属性是引用数据类型,那么也会拷贝一个新的引用数据类型对象。
此时,我们需要让Money类也实现Conleable接口,并重写Object类中的clone方法:
重写一下Person类中的clone方法:
此时,我们再来运行刚才的代码就会发现:修改person2中m的money并不会影响到person1中m的money~
代码运行结果:
因为person2的m现在指向了一个新的Money对象:
至于到底是使用深拷贝还是浅拷贝,取决于业务场景~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。