【克隆方法+深浅拷贝】

news2024/11/7 17:59:18

文章目录

  • 前言
  • Clonable 接口
    • 克隆方法代码的实现
  • 浅拷贝
  • 深拷贝
  • 总结


前言

Clonable 接口

克隆方法代码的实现

//1.当类要调用克隆方法时,这个类要实现一个Cloneable接口
class Student implements Cloneable{
    public String name;
    public int age;

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

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    //2.类要重写克隆方法时,调用克隆方法
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public class Test {
    //3.当类要调用克隆方法时,要在main方法后面添加throws CloneNotSupportedException(声明异常)
    public static void main(String[] args) throws CloneNotSupportedException{
        Student student = new Student("zhangsan",10);
        System.out.println(student);
        //克隆一个跟Student一样的对象
        Student student1 = (Student) student.clone();//4.返回值是Object,父类给子类会报错,要强转成子类,向下转型
        System.out.println(student1);

    }
}

总结:
1.当类要调用克隆方法时,这个类要implements Cloneable接口
2.在类里面要重写克隆方法
3.要在main方法后面添加 throws CloneNotSupportedException(声明异常)
4.实例化克隆对象时,因为重写方法的返回值是Object,父类给子类会报错,所以要强转成子类

浅拷贝

被克隆对象和克隆对象引用变量的内容是一样的,存储的地址也一样,当变量的值改变了,克隆对象和被克隆对象的引用指向的还是同一个。
所以浅拷贝就是,被克隆对象引用谁,克隆对象就引用谁。

类似于小时候大家基本都经历过的两个孩子看电视抢一个遥控器,孩子1要看哪个台,孩子2就必须看哪个台。

class Money{
    public double m = 19.9;
}
class Student implements Cloneable{
    public String name;
    public int age;

    //在Student类中实例化money,以便Student调用
    Money money = new Money();
    
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException{
        Student student = new Student("张三",10);
        Student student1 = (Student) student.clone();

        System.out.println("student "+student.money.m);
        System.out.println("student1 "+student1.money.m);

        System.out.println("==============");

        student.money.m=99.9;
        System.out.println("student "+student.money.m);
        System.out.println("student1 "+student1.money.m);
    }
}

解析图:

在这里插入图片描述

深拷贝

把被克隆对象引用的对象再克隆一份出来,让克隆的对象引用。
当被克隆对象引用的对象改变了,克隆的对象引用的对象还是原来的值。
就是两个孩子看电视一人一个遥控器,孩子1转台不会影响孩子2

class Money implements  Cloneable{
    public double m = 19.9;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class Student implements Cloneable{
    public String name;
    public int age;

    //在Student类中实例化money,以便Student调用
    Money money = new Money();

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

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Student tmp = (Student)super.clone();
        tmp.money = (Money) this.money.clone();
        return tmp;
    }

}

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException{
        Student student = new Student("张三",10);
        Student student1 = (Student) student.clone();

        System.out.println("student "+student.money.m);
        System.out.println("student1 "+student1.money.m);

        System.out.println("==============");

        student.money.m=99.9;
        System.out.println("student "+student.money.m);
        System.out.println("student1 "+student1.money.m);

    }

解析图:
在这里插入图片描述

总结

再次学了浅拷贝和深拷贝,比上一次思路清晰多了,浅拷贝的原理和代码较容易理解,深拷贝的原理和代码较复杂,理解得还不够深入,需多看几遍巩固。
今晚脑子有点乱,希望我也能轻舟已过万重山。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试/测试开发丨ChatGPT能否成为PPT最佳伴侣

点此获取更多相关资料 简介 PPT 已经渗透到我们的日常工作中,无论是工作汇报、商务报告、学术演讲、培训材料都常常要求编写一个正式的 PPT,协助完成一次汇报或一次演讲。PPT相比于传统文本的就是有布局、图片、动画效果等,可以给到观众更好…

使用IDEA生成JavaDoc文档(IDEA2023)

1、Tool-->Generate JavaDoc 2、配置生成JavaDoc文档 1、选择生成范围,可以根据需要选择单独一个文件或者包,也可以是整个项目 2、输出目录,要把JavaDoc文档生成在哪个文件中,最好新建一个文件夹结束 3、Local:…

云计算的思想、突破、产业实践

文章目录 📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。🌎跑过十五…

解决爬虫在重定向(Redirect)情况下,URL没有变化的方法

重定向是一种网络服务,它可以实现从一个网页跳转到另一个网页的功能。它把用户请求的网页重定向到一个新的位置,而这个位置可以是更新的网页,或最初请求的网页的不同版本。另外,它还可以用来改变用户流量,当用户请求某…

SpringCloud Alibaba 【四】Openfeign

Openfeign配置与使用 前言介绍openfeign使用openfeign导入依赖启动类正式使用测试结果 前言 在springcloud中消费者项目需要调用提供者项目的接口,一开始用的是RestTemplate中的方法。但是RestTemplate进行远程调用时,直接调用controller层的接口&#…

如何设置OBS虚拟摄像头给钉钉视频会议使用

环境: OBS Studio 29.1.3 Win10 专业版 钉钉7.1.0 问题描述: 如何设置OBS虚拟摄像头给钉钉视频会议使用 解决方案: 1.打开OBS 底下来源这添加视频采集设备 选择OBS虚拟摄像头 2.源那再建一个图像,随便选一张图片 3.点击虚…

基于stm32F4的智能宠物喂食器的设计:LVGL界面、定时喂食喂水通风

宠物喂食器 一、功能设计二、元器件选型三、UI设计四、原理图设计五、源代码设计六、成品展示 实物链接:https://m.tb.cn/h.5iCUX6H?tkPL65WXCEipQ CZ3457 一、功能设计 1、设计一个触摸屏作为人机交互 2、通过触摸屏设置时间定时喂食喂水通风 3、获取当前水槽的…

【CASS精品教程】CASS3D基础知识详解

点击3D图标加载影像数据(支持格式 .osgb 、.obj 、.xml 、.s3c),这里以 .xml 数据格式为例: 下面开始讲操作。 CASS 平台下二、三维窗口为联动操作,当鼠标指针位于三维窗口时: 缩放窗口—— 滑动鼠标滚轮平移窗口—— 按住鼠标滚轮并拖动鼠标旋转视角—— 按住鼠标左键…

【入门Flink】- 04Flink部署模式和运行模式【偏概念】

部署模式 在一些应用场景中,对于集群资源分配和占用的方式,可能会有特定的需求。Flink为各种场景提供了不同的部署模式,主要有以下三种:会话模式(Session Mode)、单作业模式(Per-Job Mode&…

使用ssl_certificate_by_lua指令动态加载证书

1、下载 OpenResty - 下载 根据自己系统选择下载,我的是64位 2、解压到目录 3、启动openresty 进入解压后的目录,执行nginx.exe 浏览器输入 http://localhost 查看是否正常。显示以下画面就表示没有问题。 接下来可以开始准备动态安装证书 4、使用o…

QT+SQLite数据库配置和使用

一、简介 1.1 SQLite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,非常适合嵌入式系统。Qt5以上版本可以直接使用SQLite(Qt自带驱动)。 二、下载和配置 2.1 SQLite下载…

SpringBoot3.* 集成又拍云上传组件

集成使用 添加Maven依赖 <!--又拍云--> <dependency><groupId>com.upyun</groupId><artifactId>java-sdk</artifactId><version>4.2.3</version> </dependency>代码编写 PostMapping("/common/upload") pu…

mysql迁移data目录(Linux-Centos)

随着时间的推移&#xff0c;mysql的数据量越越大&#xff0c;使用yum默认安装的目录为系统盘 /var/lib/mysql&#xff0c;现重新挂载了一个硬盘&#xff0c;需要做数据目录的迁移到 /mnt/data/。以解决占用系统盘过高情况。 1.强烈建议这种操作。镜像一个一样的Centos系统&…

WebSocket Day 01:入门案例

前言 欢迎来到WebSocket入门案例系列的第一天&#xff01;在今天的博客中&#xff0c;我们将一起探索WebSocket的基础知识和使用方法。本系列将以一个简单的入门案例为基础&#xff0c;带领您逐步了解WebSocket的原理和用法。 一、什么是 WebSocket ? WebSocket是一种在Web应…

【数据结构】希尔排序

文章目录 前言一、希尔排序的演示图例二、希尔排序&#xff1a;插入排序的优化版本☆三、核心算法思路四、算法思路步骤&#xff08;一&#xff09;预排序 gap>1&#xff08;二&#xff09;gap1 插入排序 完成排序收尾 五、码源详解&#xff08;1&#xff09;ShellSort1 ——…

OceanBase:01-单机部署(开发环境)

目录 一、体系架构 二、配置要求 三、解压安装包 四、执行安装 五、配置环境变量 六、快速部署 七、访问数据库 OceanBase 数据库&#xff08;OceanBase Database&#xff09;是一款蚂蚁集团完全自研的企业级原生分布式数据库&#xff0c;在普通硬件上实现金融级高可用&…

msvcp140.dll重新安装的解决方法,快速修复dll丢失问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行&#xff0c;给用户带来很大的困扰。那么&#xff0c;如何解决msvcp140.dll丢失的问题呢&#xff1f;本文将详细介绍解决…

基于transformer的解码decode目标检测框架(修改DETR源码)

提示:transformer结构的目标检测解码器,包含loss计算,附有源码 文章目录 前言一、main函数代码解读1、整体结构认识2、main函数代码解读3、源码链接二、decode模块代码解读1、decoded的TransformerDec模块代码解读2、decoded的TransformerDecoder模块代码解读3、decoded的De…

软件测试面试最经典的5个问题

软件测试面试灵魂五问&#xff01; 请做一下自我介绍&#xff1f;你为什么从上家公司离职&#xff1f;为什么转行做测试? 你对测试行业的认识&#xff1f;你的期望薪资是多少&#xff1f;最后&#xff0c;你要问我什么&#xff1f; 一、请做一下自我介绍 简历上有的可以一两…

VLAN与配置

VLAN与配置 什么是VLAN 以最简单的形式为例。如下图&#xff0c;此时有4台主机处于同一局域网中&#xff0c;很明显这4台主机是能够直接通讯。但此时我需要让处于同一局域网中的PC3和PC4能通讯&#xff0c;PC5和PC6能通讯&#xff0c;并且PC3和PC4不能与PC5和PC6通讯。 为了实…