java复制

java复制

起男 1,160 2020-09-21

java复制

直接赋值赋值

直接赋值,在java中,A a1 = a2,我们需要理解的是这实际上复制的是引用,也就是说a1和a2指向的是同一个对象。因此,当a1变化的时候,a2里面的成员变量也会跟着变化

浅复制

复制引用但不复制引用的对象

创建一个新对象,然后将当前对象的非静态字段复制到该新对象,如果字段是基础类型的,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象

操作

  1. 实现Cloneable接口
  2. 重写Clone方法(必须重写,由于object中是protected的其它地方掉不到)
    1. 用object的clone方法复制对象,并返回
  3. 调用对象.clone()方法创建新对象

现象

  1. 两个对象地址不同
  2. 对象的基本类型属性值相同
  3. 对象的引用类型属性地址相同

深复制

深拷贝不仅复制对象本身,而且复制对象包含的引用指向的所以对象

操作

  1. 实现Cloneable接口(当前类和属性中的引用类型)
  2. 重写clone方法
    1. 用object的clone方法复制对象
    2. 变量当前类里的引用类型,调用指定类型的clone方法
    3. 生成新对象并返回
  3. 调用对象.clone()方法创建新对象

现象

  1. 两个对象地址不同
  2. 对象的基本类型属性值相同
  3. 对象的引用类型属性地址不相同

序列化

在java语言里深复制一个对象,常常可以先使对象实现Serializable接口,然后把对象写到一个流里,在从流里读出来,便可以重建对象