深拷贝/浅拷贝 #
对象拷贝,就是将一个对象复制一份。复制方法不同则有不同结果
浅拷贝 #
新建一个对象,将对方的属性全部复制过来 有自己的堆内存地址,但是对方的属性中的引用类型,对于双方来说是共享的,只复制了内存地址 只拷贝了第一层
深拷贝 #
有多少层就拷贝多少层,两个对象完全分开,但是内容相同
相关接口和方法 #
Cloneable接口 #
是一个标记接口,在类中重写Object中的Clone方法,类调用clone方法才能克隆成功
可以直接调用super.clone(),来使用Object中的clone方法得到浅克隆结果
如果不实现该接口,则会抛出CloneNotSupported异常
Cloneable接口下没有任何方法
Object.clone方法 #
该方法被native修饰,是一个空方法,没有方法体(native修饰都是如此)
每一个native方法在JVM中都有一个同名实现体
判断是否实现Cloneable接口,是在JVM方法体中实现的
默认实现浅拷贝
如何实现深拷贝? #
使用序列化将对象变成字节流,输入再输出
或者让内部每一层对象都实现clone方法,调用clone方法时,将clone出来的对象的属性值替换成原属性值的clone结果
或者嵌套遍历访问其中每个元素,新建对象复制值