深拷贝,浅拷贝,引用拷贝

目录

深拷贝,浅拷贝,引用拷贝

引用拷贝

浅拷贝

深拷贝

例外


引用拷贝

基本数据类型存在栈中,对象的引用也在栈中,实际对象存在堆中

复制引用地址,但是跟原引用一样指向堆中的同一个对象,如果其中一个对对象作出修改,其他引用也会看到同样的变化。

对于对象中的基本类型字段,以及嵌套引用类型字段都是一起共享的


浅拷贝

创建新的堆对象,对于基本类型字段直接复制,对于引用类型字段复制其引用地址;对于基本类型字段的修改不影响原对象,对于引用类型字段,原对象也能看到对应的修改

需要继承Cloneable接口,重写Object类的clone方法,默认就是浅拷贝


深拷贝

深拷贝相当于是创建一个全新的对象,任何字段的修改都不会对原对象造成影响

第一种方法重写clone方法,先对当前对象进行浅拷贝,然后,手动拷贝嵌套对象,相当于创建一个新的嵌套对象。

第二种方法序列化,将对象序列化为字节流,再反序列化为新对象,需要继承Serializable接口;通过字节数组输出流,字节数组输入流,实现序列化与反序列化。

// 字节数组输出流 
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(bos); 
oos.writeObject(this); // 序列化原对象 
// 字节数组输入流 
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); 
ObjectInputStream ois = new ObjectInputStream(bis); 
return (Person) ois.readObject(); // 反序列化得到新对象

例外

string类型创建后内容引用不可变,所以在浅拷贝中,对string字段进行修改会创建新的string对象,本质是引用拷贝

Object.clone是protect方法,需要重写为public才能被外部调用

序列化深拷贝限制,所有的嵌套类必须实现了Serializable接口,无法拷贝transient修饰的字段

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐