Java对象深拷贝、浅拷贝之枚举类型

问题:为什么属于引用类型的enum不会有深拷贝浅拷贝的问题?

解释:

在Java中,枚举类型是一种特殊的类类型。每个枚举值都是该枚举类型的一个实例,并且这些实例在枚举类型被初始化时就已经被创建。这些实例在程序的整个生命周期中是不可变的。因此,枚举类型的每个值都只存在一个实例。当你引用一个枚举值时,你实际上是引用了这个不可变的实例。这就解释了为什么我们不需要对枚举进行深拷贝或浅拷贝。

深拷贝”和“浅拷贝”是针对可变对象的概念。浅拷贝只复制对象的引用,而不复制对象本身因此原对象和拷贝的对象实际上指向的是同一个对象。深拷贝则是创建一个新对象,并将原对象的所有字段一一复制到新对象中,因此原对象和拷贝的对象是完全独立的。

然而,由于枚举实例是不可变的,所以不存在需要创建新的实例(深拷贝》或者复制实例用(浅拷贝)的情况。你可以直接引用这个实例,而不用担心它会被改变。如果你尝试创建个枚举的新实例或者复制一个枚举实例的引用,你实际上还是会得到指向原来那个实例的引用。这就是为什么我们说在Java中,枚举没有深拷贝和浅拷贝的概念。

举例
测试代码

/**
 * 学生类
 */
 class Student implements Serializable {
    //是否毕业
    private boolean graduate;
    //名字
    private String name;
    //年级-枚举值
    private GradeType gradeType;
    //家庭地址
    private Address address;

    public Student(){};

    public Student(boolean graduate, GradeType gradeType, String name,Address address) {
        this.graduate = graduate;
        if (gradeType == null) {
            this.gradeType = GradeType.G1;
        } else {
            this.gradeType = gradeType;
        }
        this.name = name;
        this.address = address;
    }

    //重写了clone方法来完成Student对象的深拷贝
    @Override
    public Student clone(){
        Student student = new Student();
        student.setGraduate(this.graduate);
        student.setName(this.name);
        student.setGradeType(this.gradeType);
        student.setAddress(this.address);
        return student;
    }

    public boolean isGraduate() {
        return graduate;
    }

    public void setGraduate(boolean graduate) {
        this.graduate = graduate;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public GradeType getGradeType() {
        return gradeType;
    }

    public void setGradeType(GradeType gradeType) {
        this.gradeType = gradeType;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

/**
 * 年级枚举
 */
 enum  GradeType {
    G1,//高一
    G2,//高二
    G3;//高三
}

/**
 * 地址类
 */
class Address implements Serializable {
    //省
    private String province;
    //市
    private String city;
    //区
    private String district;

    public Address(){};

    public Address(String province, String city, String district) {
        this.province = province;
        this.city = city;
        this.district = district;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getDistrict() {
        return district;
    }

    public void setDistrict(String district) {
        this.district = district;
    }
}

测试方法

	    public static void main(String[] args) {
        Address a1 = new Address("广东省","广州市","天河区");
        Student s1 = new Student(Boolean.FALSE,GradeType.G1,"zhangsan",a1);
        Student s2 = s1.clone();
        System.out.println("s1="+ JSONObject.toJSONString(s1));
        System.out.println("s2="+JSONObject.toJSONString(s2));
        System.out.println("-----------做修改---------");
        //将拷贝的学生2名称改成zhangsanfeng
        s2.setName("zhagnsanfeng");
        //将拷贝的学生2的年级改成G3
        s2.setGradeType(GradeType.G3);
        //将毕业状态改成已毕业
        s2.setGraduate(Boolean.TRUE);
        //将拷贝的学生2的地址改成白云区
        Address a2 = s2.getAddress();
        a2.setDistrict("白云区");
        System.out.println("s1="+JSONObject.toJSONString(s1));
        System.out.println("s2="+JSONObject.toJSONString(s2));
    }

结果
在这里插入图片描述
可以看到在修改之前,打印出来的学生s1和学生s2有着相同的人员信息,
在修改学生s2的名字、年级、毕业状态和家庭住址后,可以发现只有家庭住址的改变影响到了学生s1,修改学生s2后,学生s1的地址也从天河区变成了白云区,而同为引用类型的年级并没有因为s2的修改而改变。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/39563.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何二次封装一个el-table组件并二次复用

*注:示例使用的是vue3和element进行二次封装的 首先我们来看效果图(总共可以分为以下几个模块): 表格数据操作按钮区域表格信息提示区域表格主体内容展示区域表格分页区域 表单搜索没有封装在这里是为了降低代码的耦合性(有兴趣的可以查看我…

rt-thread构建含c++源码的工程

RT-Thread Components > C/C and POSIX layerscons构建项目会出错: vim libraries/SConscript ,删除 pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp(切记不要注释,要删除) 再次scons构建项目&#…

【FPGA】基于C5的第一个SoC工程

文章目录 前言SoC的Linux系统搭建 前言 本文是在毕业实习期间学习FPGA的SoC开发板运行全连接神经网络实例手写体的总结。 声明:本文仅作记录和操作指南,涉及到的操作会尽量细致,但是由于文件过大不会分享文件,具体软件可以自行搜…

手机定屏死机问题操作指南

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、定屏死机问题抓取 Log 要求二、 复现定屏死机问题后做什么三、检查adb是否可连的方法四、连接adb 抓取以下Log五、如果adb不可连,执行下…

多个信贷范围时客户主数据界面的定制(套头和信用缴纳范围=信贷范围)

客户主数据-销售范围-开票的界面有信贷范围,叫贷方控制范围。 但是默认是看不到的。需要进行配置。 但是SAP的配置里面的名字很奇怪,在客户账户组里面的销售数据中(OVT0)定制 双击后处理的这个界面,和界面的“”开票凭证“”对不上&#x…

SaleSmartly,客户满意度调查的绝对好助手

企业使用客户满意度调查来收集反馈并评估客户满意度水平,包括有关产品质量、服务、支持和整体满意度的问题。客户满意度调查的主要目标是直接从客户那里收集有价值的见解,以了解他们的需求、偏好和期望。这种反馈可以帮助企业确定需要改进的领域&#xf…

Fiddler抓包app(方便后端定位app调用的是那个接口?参数为何?)

一、抓http请求的包 1、设置Fiddler允许远程连接 选择Tools->Options 选择Connections选项卡,选中允许远程连接,如图所示 2、手机与电脑连接相同的wlan网络 3、手机wlan设置手动代理, 1)手动代理的主机名设为电脑ip&…

5分钟给你破解这套10万赞的生产教程,访谈乔布斯的AI对话数字人视频是怎么做的

本期是赤辰第16期AI项目拆解栏目; 底部准备了7月粉丝福利,看完可以领取; 上周给粉丝们讲解AI动图说话月涨粉20万的案例并给出保姆式教程,粉丝反馈很热烈,都觉得AI强大,有些学员给自己账号做视频&#xff…

PID算法

PID,就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种很常见的控制算法。 需要将一个物理量保持在稳定状态(比如维持平衡,温度、转速的…

安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用后台模块SessionCookieToken身份验证唯一性

文章目录 开发环境数据导入-mysql架构&库表列数据库操作-mysqli函数&增删改查数据接收输出-html混编&超全局变量第三方插件引用-js传参&函数对象调用身份验证-Cookie使用身份验证-Session使用唯一性判断-Token使用具体安全知识点:Cookie和Session都…

数据库应用:CentOS 7离线安装MySQL与Nginx

目录 一、理论 1.安装依赖 二、实验 1.离线安装MySQL与Nginx 2.离线安装Nginx 三、问题 1.执行nginx -v命令报错 四、总结 一、理论 1.安装依赖 (1)概念 安装依赖是指在软件开发中,为了运行或者编译一个程序或者库,在计…

基于小波哈尔法(WHM)的一维非线性IVP测试问题的求解(Matlab代码实现)

💥1 概述 小波哈尔法(WHM)是一种求解一维非线性初值问题(IVP)的数值方法。它基于小波分析的思想,通过将原始问题转化为小波空间中的线性问题,然后进行求解。以下是一维非线性IVP测试问题的求解…

Android性能优化——启动优化

App 的启动速度是用户的第一体验,互联网中有一个八秒定律,如果用户等待八秒App 还没打开,70%的用户都会停止等待 一、启动分类 官方 App startup time 冷启动 耗时最多,衡量标准 热启动 最快。 后台~前台 温启动…

数据中心水浸事件,该如何找回安全?

数据中心是现代企业和组织中不可或缺的基础设施,承载着大量的敏感数据和关键业务运作。然而,水浸事件可能成为数据中心的巨大威胁,可能导致设备故障、数据丢失以及业务中断,给组织带来严重的损失和风险。 因此,为了保护…

linux之Ubuntu系列(八)用户管理 修改文件权限

修改文件权限 chown 修改拥有者 -R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。 修改 文件|目录 的拥有者 sudo chown [-R] 用户名 文件名|目录 更改文件属主&…

pytest 参数化进阶

目录 前言: 语法 参数化误区 实践 简要回顾 前言: pytest是一个功能强大的Python测试框架,它提供了参数化功能,可以帮助简化测试用例的编写和管理。 语法 本文就赶紧聊一聊 pytest 的参数化是怎么玩的。 pytest.mark.par…

⛳ Java数组

Java数组的目录 ⛳ Java数组🎨 一,一维数组👣 1.1,概念📢 1.2,基本用法1,语法格式2,代码 💻 1.3,内存结构📝 1.4,练习 🎁 …

DB-Engines排名公布 GBASE南大通用入围国产数据库TOP 3

什么是DB-Engines排名? DB-Engines排名是数据库领域的流行度榜单,它对全球范围内的419款数据库(截至2023年7月)进行排名,每月更新一次,排名越靠前,则表示越流行。在很多技术选型的场合&#xf…

亚信科技荣任「DBL电信行业工作组」副组长单位,AntDB数据库连年入选《中国数据库产品图谱》

日前,“2023可信数据库发展大会”在京圆满召开。亚信科技凭借自研的电信级核心交易数据库AntDB在通信行业15年的技术积累和行业贡献,成功当选为数据库应用创新实验室(DBL)电信行业工作组副组长单位。AntDB数据库连续两年入选《全球…

Stable Diffusion - 编辑生成 (OpenPose Editor) 相同人物姿势的图像

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131818943 OpenPose Editor 是 Stable Diffusion 的扩展插件,可以自定义人物的姿势和表情,以及生成深度、法线和边缘图等信…