Jared's blog Jared's blog
首页
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • Java
  • 数据库SQL
  • 设计模式
  • 集成开发环境
  • Linux系统
  • 代码管理
  • 项目管理
  • 后端

    • 中间件
    • Spring家族
    • 服务器软件
    • 数据库
    • 搜索引擎
    • 分布式&微服务
    • 容器化
  • 前端

    • 基础
    • 模板框架
    • 组件化框架
  • 运维知识
  • 部署工具
架构与模型
  • 在线教育
  • 电商
  • 疑惑日志
  • 随笔
  • 友链
  • 书籍
  • 娱乐
  • Github (opens new window)
  • Gitee (opens new window)
  • CSDN (opens new window)

Jared H

💻🤣😜
首页
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • Java
  • 数据库SQL
  • 设计模式
  • 集成开发环境
  • Linux系统
  • 代码管理
  • 项目管理
  • 后端

    • 中间件
    • Spring家族
    • 服务器软件
    • 数据库
    • 搜索引擎
    • 分布式&微服务
    • 容器化
  • 前端

    • 基础
    • 模板框架
    • 组件化框架
  • 运维知识
  • 部署工具
架构与模型
  • 在线教育
  • 电商
  • 疑惑日志
  • 随笔
  • 友链
  • 书籍
  • 娱乐
  • Github (opens new window)
  • Gitee (opens new window)
  • CSDN (opens new window)
  • 数据结构与算法

  • 计算机网络

  • 操作系统

  • Java

    • 语言基础

      • 面向对象
      • 关键字
      • 运算符
      • 抽象类
      • 接口
      • 类型
      • String
      • 异常
      • 反射
      • 注解
      • 内部类
      • 泛型
      • 序列化
      • 复制
      • 集合

      • 并发、多线程

      • JVM

      • 工具

      • IO

      • 新特性

      • http通信流程图
    • 数据库-SQL

    • 设计模式

    复制

    # 14.复制

    # 1、概念

    将一个对象的引用复制给另外一个对象,一共有三种方式。第一种方式是直接赋值,第二种方式是浅拷贝,第三种是深拷贝。所以大家知道了哈,这三种概念实际上都是为了拷贝对象。

    # 2、直接赋值复制

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

    # 3、浅复制(复制引用但不复制引用的对象)

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

    class Resume implements Cloneable{ 
       public Object clone() { 
         try { 
           return (Resume)super.clone(); 
         } catch (Exception e) { 
           e.printStackTrace(); 
           return null; 
         } 
       } 
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    # 4、深复制(复制对象和其应用对象)

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

    class Cat implements Cloneable {
      String name;
      int age;
      Animal animal;
    
      Student(String name, int age, Animal animal) {
        this.name = name;
        this.age = age;
        this.animal= animal;
     }
      public Object clone() {
        Cat c = null;
        try {
           //完成浅克隆
            c = (Student) super.clone();
         } catch (CloneNotSupportedException e) {
            System.out.println(e.toString());
         }
         //双层克隆使得那个animal对象也得到了复制
          c.animal = (Animal) animal.clone();
          return c;
        } 
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    # 5、深复制实现之序列化

    如果对象都实现了Serializable接口,可以序列化进行io操作实现深复制。

    public class CloneUtils {
    
        @SuppressWarnings("unchecked")
        public static <T extends Serializable> T clone(T obj){
    
            T cloneObj = null;
    
            try {
    
                //写入字节流
                ByteArrayOutputStream out = new ByteArrayOutputStream();
    
                ObjectOutputStream obs = new ObjectOutputStream(out);
                obs.writeObject(obj);
                obs.close();
    
                //分配内存,写入原始对象,生成新对象
                ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());
    
                ObjectInputStream ois = new ObjectInputStream(ios);
    
                //返回生成的新对象
    
                cloneObj = (T) ois.readObject();
                ois.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return cloneObj;
        }
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    上次更新: 2022/04/01, 15:14:40
    序列化
    集合

    ← 序列化 集合→

    Theme by Vdoing Copyright © 2020-2022 Jared H
    粤ICP备20046800号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×