你真的懂Java中的Cloneable接口和深拷贝么?

news2024/12/22 16:30:07

Cloneable接口 和 深拷贝

💐文章导读

这篇文章就为大家讲讲什么是Cloneable接口,接口的用法以及什么是深拷贝和浅拷贝,如果有不足的地方,还望读者在评论区提出!!!

上篇文章讲过用Comparable接口进行对象比较,和一个Comparator比较,但是许多有趣的接口还有好多,请让我持续给您讲解,假如,你写了一个重要的代码,但是很害怕万一万一数据丢了怎么办?这时,就有人说了,我直接复制存储一份不就行了么😂,对,没错,是这样的😂,现在就要讲一个和复制功能一样的有趣接口:

🍁Cloneable接口

下面,我会根据下面的代码来对Cloneable接口进行讲解:

public class Student implements Cloneable{//实现接口
     int age = 10;
    //重写clone方法
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                '}';
    }
    public static void main(String[] args) throws CloneNotSupportedException {
        Student student1 = new Student();
        Student student2 = (Student)student1.clone();
        System.out.println(student1.toString());
        System.out.println(student2.toString());
    }
}

下面将针对上面的代码一段一段的讲解,请拿好你的小板凳认真坐好啦!!!

下面一段一段的代码可能与上面有一点点的不同,那是因为上面是处理过后的完美代码,下面讲解的代码是没有经过处理的,根据没有处理过的代码一步一步带你学会clone()方法,最后就会称为完美的代码!!!

在这里插入图片描述

可以看到,当调用clone()方法时,结果报出了一个异常表示不支持克隆;下面就解决这第一个异常(第一个异常说明这里不止一个异常😂);

我们点击去clone()方法,看看它的是如何实现的;

在这里插入图片描述

可以看到,clone方法是属于object类的,但是object类不是所有类的父类么,那Student类也应该是Object类的子类呀,在子类中调用父类中的方法,为什么没办法调用呢?

第一个异常:

想要在子类中调用父类的方法,就要通过super进行调用,那么就通过在子类中重写父类的方法,调用重写的clone方法;
在这里插入图片描述

当重写这个方法后发现,它还是报错的,那怎么回事呢?来接着看!

在这里插入图片描述

当把鼠标放在红线位置时发现,有一个添加异常到方法签名,下面就点击一下,发现这个红线不仅没消失还变长了😅,然后在main方法后添加了一行这个东西,这个异常将在Java异常文章中进行讲解,这里简单提一下,这里表示,在main函数中可能会抛出一个异常,而这个异常如果在方法这里不进行处理的话,就会交给方法的调用者处理,就这样一直向上推,最后交给了jvm进行处理,jvm就会报出错误,终止程序;

在这里插入图片描述

那这个异常是怎么回事呢?是因为:当student1调用clone方法时,因为clone方法的返回类型是Object类型的,而Object类是Student的父类,把父类对象赋值给子类进行了向下转型,所以要进行强制类型转化;

在这里插入图片描述

看,这样就没有红线啦,那么现在就运行起来!!!

在这里插入图片描述

结果运行时还报异常,我就想要拷贝一下还没完没了了是吧,不要着急😂,解决完这个异常,就完事了,可以看到这里表示的是Student不能被拷贝,那么是因为我们还要去实现Cloneable接口;
在这里插入图片描述

当实现完Cloneable接口后,进入这个接口发现,这个接口是空的,那么这个接口有什么用呢?因为啊,这个接口也叫作标记接口,表示这个对象可以被克隆,如果不实现这个对象的话,就没办法进行克隆,没办法,谁让人家就是这么规定的呢😁

那么 下面就可以正常运行了

在这里插入图片描述

以上就是clone方法的使用,你学废了么!!!
不要打瞌睡,下面就要上硬货啦,既然学过了拷贝,那么就来拓展一下什么是深拷贝吧!!!

🍁深拷贝

下面是完美的代码,没有错误的,下面如果我讲的代码如果有什么不一样的,不要奇怪,那是因为我要给你讲呀!最后都会再回到下面的代码中的。我会一步一步的将下面的代码进行讲解:

class Grade implements Cloneable{
    int grade = 60;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class Student implements Cloneable{
     int age = 10;
     Grade g;

     public Student() {
         this.g = new Grade();
     }
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                '}';
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Student tmp = (Student) super.clone();
        tmp.g = (Grade) this.g.clone();
        return tmp;
    }
    public static void main(String[] args) throws CloneNotSupportedException {
        Student student1 = new Student();
        Student student2 = (Student) student1.clone();
        System.out.println(student1.toString());
        System.out.println(student2.toString());
        System.out.println("===========================");
        //对student2中g的grade进行修改
        student2.g.grade = 90;
        System.out.println(student1.g.grade);
        System.out.println(student2.g.grade);
    }
}

请看我慢慢给你讲解:

在这里插入图片描述

然而结果并不理想,它把两个对象里的grade都改了,哎!我不是进行了拷贝么,怎么会改一个把两个全都改了呢?上面之所以是这种情况是因为,现在并没有构成深拷贝,而是下图这种情况,请看下面图解:

在这里插入图片描述

它只是对Student对象中的内容进行了一份拷贝,但是并没有对,对象中的对象中的内容进行拷贝也就是grade=60;这种情况就是浅拷贝!那想要进行深拷贝该怎么操作呢?下面请看我讲解:
在这里插入图片描述

以上就是讲解,下面将根据上面的讲解做的一个配图;
在这里插入图片描述

就仅仅对clone方法里面的代码添加了三行就构成了深拷贝,所以是不是很神奇呢!!!

在这里插入图片描述

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

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

相关文章

单模光纤的特征方程以及MATLAB求解

在之前的文章中,我们写出了单模光纤的特征方程以及对应的导波模式 这里我们在MATLAB中求解特征方程并表示出几个归一化参数的变化曲线 用到的公式是单模光纤导波模式的特征方程: clear close all tic Vmax 10; N 100;for j 1:NV(j) j/N*Vmax;Vtemp …

电脑微信占用100多GB空间 解决办法来了:重回清爽流畅

这几天微信吃内存的话题又上热搜了,作为一款10亿用户的国民级APP,微信的真是让人又爱又恨,不用几乎不可能,用起来槽点又多,光是磁盘占用就是个头疼的问题。 不论是工作还是日常沟通,微信里面的文件及语音、…

python中的类型转换

文章目录 类型转换简介int()float()str()bool() 类型转换简介 所谓的类型转换,将一个类型的对象转换为其他对象。 类型转换不是改变对象本身的类型,而是将对象的值转换为新的对象。 类型转换四个函数 int() 、 float() 、 str() 、 bool() int() int()…

cpp11实现线程池(一)——项目介绍

项目介绍 线程池是库的形式提供给用户,是必须放到代码中,不能单独运行,亦称为基础组件 第一版线程池任务对象使用继承技术,提供一个抽象基类Task,里面有一个纯虚函数run(),使用时继承该类,并重…

第二篇:强化学习中的7个基础概念

你好,我是zhenguo(郭震) 这是强化学习第二篇:强化学习7个基础概念 在强化学习中,智能体需要在不断尝试和错误的过程中学习,通过观察环境的反馈(奖励或惩罚)来调整自己的行为&#xf…

windows系统安装curl

下载安装包 https://curl.se/windows/ 2.如图所示,把下载的zip包解压到C盘某个目录下 把bin目录配置到系统环境变量Path里 在命令行里直接输入curl即可开始使用 5.curl测试访问百度 6.curl 测试ip端口连通性 用法:curl -v ip:port

推荐一款C端的低代码产品

目录 写在前面 低代码平台 平台怎么选 各平台区别 为什么选它 写在前面 大家都知道低代码这个叫法是从B端叫起来的,也就是说不管是业务人员还是开发人员,都是企业内部使用。那么有没有C端的,且免费使用的低代码产品呢? 低代码…

Matlab论文插图绘制模板第93期—带类别标签的散点图

在之前的文章中,分享了很多Matlab散点图的绘制模板: 进一步,再来分享一种特殊的散点图:带类别标签的散点图。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,加群的朋友请…

数据库基础5-复合查询

文章目录 多表查询自连接子查询合并查询 基础查询中,再补充一个点: 在使用年薪进行降序排序中,我们有以下语句 //A: select ename, sal*12ifnull(comm,0) as 年薪 from emp order by 年薪 desc;查询到的结果: //B: select ename,…

Leetcode 剑指 Offer II 027. 回文链表

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个链表的 头节点 head ,请判断其是否为回文链表…

ROS 开发环境搭建(虚拟机版本)(一)

相关工具,以及镜像(以后有用) 链接:https://pan.baidu.com/s/1xgtp-XGFFNCACV_-0TJO2A 提取码:ar1w 1. 下载vm虚拟机(我选择的官方最新的vm虚拟机),安装好 2.安装百度网盘里面的…

办公智慧化风起云涌,华为MateBook X Pro 2023是最短距离

今年以来,我们几乎每个月,甚至每星期都可以看到大模型应用,在办公场景下推陈出新。 办公智慧化已成必然,大量智力工作正在被自动化。一个普遍共识是:AI能力范围之内的职业岌岌可危,AI 能力范围之外的职业欣…

【TES710D】基于复旦微的FMQL10S400全国产化ARM核心模块

板卡概述 TES710D是一款基于上海复旦微电子FMQL10S400的全国产化核心模块。该核心模块将复旦微的FMQL10S400(兼容FMQL20S400)的最小系统集成在了一个50*70mm的核心板上,可以作为一个核心模块,进行功能性扩展,特别是用…

第二章、认识用户体验五要素(本文作用是通俗讲解,让你更容易理解)

1.用户体验要素分五个层面,分别是战略层、范围层、结构层、框架层、表现层。 战略层:指的是产品所要解决的社会问题,和公司在这个产品上的收益目标。也就是大家所说的产品战略。 范围层:指的是我们要做的业务范围,我…

零基础学Java——基础part01

java基础第一篇 今日任务: 1、什么是软件开发 2、人机交互 3、常用的dos命令(了解) 4、什么是计算机语言 5、Java三种技术架构(了解) 6、Java语言特性(跨平台原理) (了解) 7、Java开发环境搭…

模拟运行600万年 数据0损坏!Solidigm把QLC闪存玩到了极致

不可否认的是,SLC、MLC、TLC、QLC、PLC、HLC……闪存技术一路走下来,整体的可靠性、寿命指标是逐步走低的,这也是NAND闪存架构天然属性所决定的。 当然,这不代表QLC、PLC闪存的就难堪大用,关键是看如何设计与优化&…

Carla自动驾驶仿真四:pygame渲染Camera画面及车辆控制(代码详解)

文章目录 前言一、依赖库安装1、pygame安装2、numpy安装 二、Pygame渲染Carla Camera画面1、连接Carla并初始化TrafficManager2、生成自动驾驶车辆并设置交通行为3、创建初始化pygame surface对象的函数4、创建pygame处理Carla图像的回调函数5、创建pygame键盘控制车辆运动的函…

软件设计师 试题二做题技巧

问题一:去需求分析中找相应的联系类型 问题二先看缺少的属性是不是er图中的实体,如果是实体文中就会有相关的信息,如果没有就对应的去图中找,转化为关系模式对应的联系也要转化为关系模式 如果是一对一就把联系归并到任意一方实…

JS 实现拖拽元素的功能

JS 实现拖拽元素的功能 这篇笔记比较短&#xff0c;主要过一遍 draggable 的事件。 首先简单看一下 HTML 实现&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Comp…