简述直接赋值,浅拷贝,深拷贝的区别

108 阅读1分钟
  1. 直接赋值
    • 没有产生新的对象,只是给对象新增一个对象的引用
    • 例如:Person p1= new Person(); Person p2 = p1 ; 就是直接赋值
    • image.png
  2. 浅克隆(浅拷贝)
    • 首先被克隆对象需要实现 Cloneable 接口 ,然后重写clone方法
      • 注意clone方法的访问修饰符默认是 protected
    • 结论:
      • 对象的成员属性是基础数据类型和基础数据类型包装类型以及String会直接复制一份在堆里面(A修改,B不会被影响),
      • 但是如果是成员属性是引用类型,那么只会复制对象的引用(也就是同一片内存用两个引用指向它,A修改B也会受到影响,因为修改的同一块内存数据)
    • 代码样例: 1681195086958.jpg
  3. 深克隆(深拷贝)
    • 对象的成员属性,不管是什么类型的,都会被重新复制一份,原对象和复制对象之间完全独立。
    • 实现方式:
      • 方式一(太麻烦):所有对象都去实现Clone接口,且都重写clone()方法,然后再被克隆对象的clone()方法中逐个调用
      • 方式二:利用 Serializable 将对象序列化为流
      • 方式二代码截图: 1681197058590.jpg 调用截图:
        image.png