首页 > 编程语言 >【Java】Java 中实现深拷贝

【Java】Java 中实现深拷贝

时间:2022-12-14 16:46:22浏览次数:85  
标签:Java Artist 实现 clone artist Music 拷贝 public

浅拷贝 和 深拷贝

浅拷贝:只复制一层,如果对象的属性是引用数据类型,只会复制属性内存地址。
深拷贝:不只复制一层,如果对象属性是引用数据类型,会继续向下进行复制。

深拷贝的实现方法

1. 实现 Cloneable 接口

Artist.class

public class Artist implements Cloneable{
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private int age;

    public Artist(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public Artist clone() {
        try {
            Artist clone = (Artist) super.clone();
            // TODO: copy mutable state here, so the clone can't change the internals of the original
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

Music.class

public class Music implements Cloneable{
    /**
     * 音乐名称
     */
    private String title;
    /**
     * 所属专辑
     */
    private String album;
    /**
     * 作曲人
     */
    private Artist artist;

    public Music(String title, String album, Artist artist) {
        this.title = title;
        this.album = album;
        this.artist = artist;
    }

    @Override
    public Music clone() {
        try {
            Music clone = (Music) super.clone();
            // TODO: copy mutable state here, so the clone can't change the internals of the original
            clone.artist = this.artist.clone();
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

Music 类中的 artist 属性是 Artist类,Music 和 Artist 都要实现 Cloneable 接口,并且重写 clone() 方法

2. 序列化

每一个背拷贝的类都要实现 Serializable 接口

//深度拷贝
public Object deepClone() throws Exception{
    // 序列化
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bos);

    oos.writeObject(this);

    // 反序列化
    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
    ObjectInputStream ois = new ObjectInputStream(bis);

    return ois.readObject();
}

参考:https://www.cnblogs.com/ysocean/p/8482979.html

标签:Java,Artist,实现,clone,artist,Music,拷贝,public
From: https://www.cnblogs.com/HypoPine/p/16982540.html

相关文章

  • vue3.2+ts实现在方法中可调用的拟态框弹窗(类el-MessageBox)
    公司UI设计的拟态框弹窗跟ElementPlusUI的布局不太一致。导致不能够直接修改样式得到想到样式。直接上图。这个需求最主要的是要通过方法去调用。为了像el-messagebox......
  • 基于jsp+sevlet+spring+mysql实现校园疫情防控管理信息系统
    @目录一、系统介绍二、采用技术及开发环境1.开发技术2.开发环境二、功能展示1.学校疫情统计2.各情况统计3.各学院学生情况统计4.各学院教师统计5.最新时报6.后台管理四、代......
  • Java继承详解
    继承的定义、功能及要求定义:class子类extends父类{}通常也称子类为派生类、父类为超类。功能: 继承的主要目的是使子类可以重用父类的结构,也可以根据子类功能的需......
  • 第八节:基于Core6.0中间件实现SignalR的安全校验 以及 部署IIS注意的问题
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblog......
  • 基于Java+Swing实现俄罗斯方块游戏
    @目录一、系统介绍二、功能展示三、其他系统四、获取源码一、系统介绍俄罗斯方块项目,基本功能包括:游戏主界面显示模块、方块及数据显示模块、方块移动控制模块、游戏界面......
  • 基于Java+Swing实现连连看游戏
    @目录一、系统介绍二、功能展示三、其它1.其他系统实现五.获取源码一、系统介绍基本功能包括:消除模块,重新开始模块,刷新模块,选择难度模块,计时模块。本系统结构如下:(1)消除......
  • Hystrix结合Feign实现熔断和降级
    Feign本身就整合了Hystrix,所以它自带熔断和降级功能,只不过默认熔断功能是关闭的,需要我们自己去开启。所以我们只需要在Hystrix服务项目上添加Feign服务访问方式即可实现熔......
  • 基于Java+Swing+Socket实现泡泡堂游戏
    @目录一、功能展示1.游戏登陆2.房间3.对战二、代码展示三、其他系统四、获取源码前言《泡泡堂》是由韩国游戏公司Nexon开发的一款休闲游戏(CasualGame),于2003年在中国大陆......
  • java中的多态
    本文主要讲述java中的多态性质代码结构如图:Animal类:publicclassAnimal{privateStringname;publicAnimal(Stringname){this.name=n......
  • Java线程篇(十一):Fork/Join-Java并行计算框架
    并行是指系统内有多个任务同时执行,而并发是指系统内有多个任务同时存在,不同的任务按时间分片的方式切换执行,由于切换的时间很短,给人的感觉好像是在同时执行。 Java在JDK7......