Java的浅克隆和深克隆、Array.copy和Object中的clone

如何实现对象的克隆

(1)实现 Cloneable 接口并重写 Object 类中的 clone() 方法;

(2)实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深克隆。

深克隆和浅克隆的区别

(1)浅克隆:拷贝对象和原始对象的引用类型引用同一个对象。浅克隆只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅克隆。

(2)深克隆:拷贝对象和原始对象的引用类型引用不同对象。深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝(例:JSON.parse() 和 JSON.stringify(),但是此方法无法复制函数类型)。

补充:

深克隆的实现就是在引用类型所在的类实现 Cloneable 接口,并使用 public 访问修饰符重写 clone 方法。

Java 中定义的 clone 没有深浅之分,都是统一的调用 Object 的 clone 方法。为什么会有深克隆的概念?是由于我们在实现的过程中刻意的嵌套了 clone 方法的调用。也就是说深克隆就是在需要克隆的对象类型的类中重新实现克隆方法 clone()。

扩展

Array.copy和Object中的clone

二者均可以进行复制操作,但是 Array.copy是对一个对象内部数据进行复制,关注的是对象内部数据组成,最终调用的是 System的arraycopy()方法,且方法着重的时复制,而 Object.clone 是一个被protected修饰的方法,只有实现Cloneable接口才能进行克隆操作,其关注的是对象自身的存储位置,对对象的内部数据并不做处理,且该方法进行的时克隆。

posted @ 2022-03-23 21:59  SpoonBlog  阅读(181)  评论(0)    收藏  举报