面试_java_克隆

48 阅读1分钟

为什么要克隆?

直接new一个对象不行吗?


对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值

如果想创建一个与当前状态相同的对象,大概有三种方式:

  • 先new一个,然后按属性一个一个赋值
  • 先new一个对象b,再让b指向原来的a对象。这种是复制了引用,实际上内存中还是只有一个对象。
  • clone。两个对象独立存在。并且是native方法,效率高。分为浅克隆与深克隆(浅克隆与第二种没区别)



浅克隆(浅拷贝、浅复制)

效果:如果原型对象的成员变量是值类型,将复制一份给克隆对象,也就是说在堆中拥有独立的空间;如果原型对象的成员变量是引用类型,就是引用地址的复制,修改一个另一个会被改变。

注意:如果是Sting这种final引用类型,修改克隆后的变量,原对象不会被改变。 Sting是特例


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




深克隆(深拷贝、深复制)

效果:深拷贝是一种完全拷贝,无论是值类型还是引用类型都会完完全全的拷贝一份,在内存中生成一个新的对象,两个对象修改其中任意的值另一个值不会改变。


实现方法

  • 实现Cloneable接口并重写Object类中的clone()方法(要求引用对象也实现 Cloneable 接口)
  • 实现Serializable接口,通过对象的序列化和反序列化实现克隆



zhuanlan.zhihu.com/p/95686213 blog.nowcoder.net/n/96b0de4a4…