深拷贝/浅拷贝

深拷贝/浅拷贝 #

对象拷贝,就是将一个对象复制一份。复制方法不同则有不同结果

浅拷贝 #

新建一个对象,将对方的属性全部复制过来 有自己的堆内存地址,但是对方的属性中的引用类型,对于双方来说是共享的,只复制了内存地址 只拷贝了第一层

深拷贝 #

有多少层就拷贝多少层,两个对象完全分开,但是内容相同

相关接口和方法 #

Cloneable接口 #

是一个标记接口,在类中重写Object中的Clone方法,类调用clone方法才能克隆成功
可以直接调用super.clone(),来使用Object中的clone方法得到浅克隆结果
如果不实现该接口,则会抛出CloneNotSupported异常
Cloneable接口下没有任何方法

Object.clone方法 #

该方法被native修饰,是一个空方法,没有方法体(native修饰都是如此)
每一个native方法在JVM中都有一个同名实现体
判断是否实现Cloneable接口,是在JVM方法体中实现的
默认实现浅拷贝

如何实现深拷贝? #

使用序列化将对象变成字节流,输入再输出
或者让内部每一层对象都实现clone方法,调用clone方法时,将clone出来的对象的属性值替换成原属性值的clone结果
或者嵌套遍历访问其中每个元素,新建对象复制值