Java中常用API总结(5)—— Object类中的深克隆和浅克隆

news2024/11/18 8:22:17

对象克隆

  • 一、前言
  • 二、浅克隆
    • 1.概述
    • 2.实例
      • 1️⃣思路
      • 2️⃣继承cloneable接口底层原理
      • 3️⃣重写clone方法底层原理
    • 3.代码实现
  • 三、深克隆
    • 1.概述
    • 2.实例
    • 3.代码实现
  • 四、结语

一、前言

本文将详细讲述Object类中的对象克隆方法,其中包含深克隆和浅克隆,两者有一定区别;在本文中也会有具体的实例说明来验证两者之间的区别,构建的例子也会一步一步讲述

二、浅克隆

1.概述

不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来;基本数据类型拷贝过来的是具体的数据,引用数据类型拷贝过来的是地址值。在Object类中默认的克隆方式就是浅克隆

在这里插入图片描述

2.实例

1️⃣思路

  • 这里我们首先要定义一个Student类,并设计一些私有的属性:namesexage,以及一个数组用来表示该学生的成绩,然后使用Javabean插件一键生成Javabean

  • 接着定义arrToString()方法将表示成绩的字符串变成字符串形式,方法体内的代码可以通过查看源码后复制黏贴

  • 最重要的是重写clone方法并且要继承cloneable接口

  • 注意test类要抛出异常 (只需要Alt+Enter快捷键自动处理爆红处即可)

2️⃣继承cloneable接口底层原理

  • 快捷键Ctrl+N搜索clone后选择java.long包下的

在这里插入图片描述

  • 这里可以看到他是一个接口,所有我们在写Student类的时候要继承接口,即要写上implements Cloneable

在这里插入图片描述

3️⃣重写clone方法底层原理

  • 快捷键Ctrl+N搜索clone后选择java.long包下的

在这里插入图片描述

  • 选中obj后再使用快捷键Ctrl+F12搜索clone

在这里插入图片描述

  • 可以看到clone方法是protected修饰的,是受保护的,使用这个方法我们必须要重写他,所以在IDEA上直接打clone会自动跳出重写的方法

在这里插入图片描述

3.代码实现

import java.util.StringJoiner;

public class Student implements Cloneable{
    private String name;
    private String sex;
    private int age;
    private int[] score;

    public Student() {
    }

    public Student(String name, String sex, int age, int[] score) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.score = score;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return sex
     */
    public String getSex() {
        return sex;
    }

    /**
     * 设置
     * @param sex
     */
    public void setSex(String sex) {
        this.sex = sex;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     * @return score
     */
    public int[] getScore() {
        return score;
    }

    /**
     * 设置
     * @param score
     */
    public void setScore(int[] score) {
        this.score = score;
    }

    public String toString() {
        return "Student{name = " + name + ", sex = " + sex + ", age = " + age + ", score = " +  arrToString();
    }

    public String arrToString() {
        StringJoiner sj = new StringJoiner(", ", "[", "]");

        for (int i = 0; i < score.length; i++) {
            sj.add(score[i] + "");
        }
        return sj.toString();
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

package TestArrCopy;

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        
        int[] score = {96,84,79,88,91,80,73};
        Student s1 = new Student("张三","男",20,score);

        Student s2 = (Student)s1.clone();

        System.out.println(s1);
        System.out.println(s2);

    }
}

Student{name = 张三, sex = 男, age = 20, score = [96, 84, 79, 88, 91, 80, 73]
Student{name = 张三, sex = 男, age = 20, score = [96, 84, 79, 88, 91, 80, 73]

在这里插入图片描述

三、深克隆

1.概述

基本数据类型拷贝过来,字符串复用,引用数据类型会重新创建新的

在这里插入图片描述

2.实例

一般要使用第三方工具才能实现深克隆,这里就简单的介绍一下使用第三方工具实现深克隆的步骤:1️⃣将第三方写的代码导入项目中(jar包)2️⃣编写代码:将对象变为字符串后再变为对象输出即可

3.代码实现

Gson gson = new Gson();
String s3 = gson.toJson(u1)
User u = gson.fromJson(s3, Student,class);
System.out.println(u);

四、结语

接下来将讲述Object类相关知识点以及一些常用方法

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

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

相关文章

算法竞赛100天第2天——STL IN C++(算法竞赛必备知识总结汇总)

本文已收录于专栏 &#x1f332;《百日算法竞赛》&#x1f332; 目录 前言&#xff1a; 序列容器 序列的要求&#xff1a; 1.vector vector常用方法 vector遍历 2、deque 头文件 方法 3、list 头文件 方法 4、queue 方法&#xff1a; 关联容器 1、map 2、se…

SWPUCTF 2022新生赛部分wp

&#x1f60b;大家好&#xff0c;我是YAy_17&#xff0c;是一枚爱好网安的小白。 本人水平有限&#xff0c;欢迎各位大佬指点&#xff0c;一起学习&#x1f497;&#xff0c;一起进步⭐️。⭐️此后如竟没有炬火&#xff0c;我便是唯一的光。⭐️[SWPUCTF 2022 新生赛]ez_ez_ph…

【算法】链表

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录链表数组转链表链表转数组往链表的前面增加一个节点获得指定位置的值在链表的末尾增加一个节点在…

我最近发现的一些问题。

‍‍ 大家好&#xff0c;我是小z&#xff0c;也可以叫我阿粥~这段时间看了不少分析报告&#xff0c;启发颇多。也发现有一些普遍存在且很容易误导分析师的问题。在聊问题之前&#xff0c;先给大家分享一个&#xff08;我刚写的&#xff09;小故事&#xff1a;有一个学生…

Pytorch 多项式拟合

目录 1、训练误差和泛化误差 2、独立同分布假设 3、欠拟合和过拟合 4、多项式回归 1、训练误差和泛化误差 训练误差&#xff08;training error&#xff09;是指&#xff0c; 模型在训练数据集上计算得到的误差。 泛化误差&#xff08;generalization error&#xff09;是指…

【OpenCV 例程 300篇】255.OpenCV 实现图像拼接

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】255.OpenCV 实现图像拼接 6.2 OpenCV 实现图像拼接 OpenCV中图像的数据结构是Numpy数组&#xff0c;使用切片方法可以实现图像的裁剪&#xff0c;使用数组堆叠方法可以实现图像的拼接。 Numpy 函数…

K8S Replication Controller 示例

K8S Replication Controller Replication Controller可确保在任何时间运行指定数量的pod副本。换句话说&#xff0c;ReplicationController确保一个pod或一组同类pod始终处于可用状态。 可以理解为Replication Controller &#xff08;RC&#xff09;是基于 K8S Pod对象之上的…

PR采购申请启用灵活工作流配置

目录 1. 检查系统基础工作流配置 2. 激活标准场景模版 WS02000458 3. 维护收件箱操作按钮文本 4. 维护任务代理及激活事件 5. 配置Inbox审批页面 6. PR灵活工作流启动配置 7. 为流程设置代理人 8. 配置工作流场景 9. 可扩展部分 官方Help文档路径&#xff1a; SAP He…

算法_杨氏矩阵_杨氏矩阵算法_剑指offer

目录 一、问题描述 二、问题分析 三、算法设计 ​四、代码实现 一、问题描述 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 要求&#xff1a;时间复杂度小于O(N);…

【目标检测】Cascade RCNN中的两个常见问题

一、关于mismatch问题 在training阶段和inference阶段使用不同的阈值很容易导致mismatch&#xff0c;什么意思呢&#xff1f; 在training阶段&#xff0c;由于给定了GT&#xff0c;所以可以把与GT的IoU大于阈值的proposals作为正样本&#xff0c;这些正样本参与之后的bbox回归…

【C语言】深入浅出讲解函数栈帧(超详解 | 建议收藏)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;凡人修C传 &#x1f4ac;总结&#xff1a;希望你看完之后&…

基于机器学习与协同过滤的图书管理推荐系统

基于机器学习与协同过滤的图书推荐系统 一、系统结构图 二、Demo示例 完整源码可联系博主微信【1257309054】 点我跳转 三、K-means聚类机器学习推荐算法 1、原理 从数据库中 1、首先获取书籍类别 2、获取用户注册时勾选喜欢的类别&#xff0c;勾选的为1&#xff0c;否则…

让 Java Agent 在 Dragonwell 上更好用

本文是《容器中的Java》系列文章之 3/n&#xff0c;欢迎关注后续连载 &#x1f603; 。1 背景 随着越来越多的云原生微服务应用的大规模部署&#xff0c;大家对微服务治理的能力需求越来越强。 Java Agent技术能够让业务专注于业务逻辑&#xff0c;与此同时&#xff0c;中间…

kali渗透测试到底该如何学?

1、渗透测试是什么&#xff1f; 渗透测试&#xff0c;是为了证明网络防御按照预期计划正常运行而提供的一种机制。渗透测试是通过各种手段对目标进行一次渗透&#xff08;攻击&#xff09;&#xff0c;通过渗透来测试目标的安全防护能力和安全防护意识。打个比方&#xff1a;比…

手写spring12(把aop动态代理整合到spring生命周期)

文章目录目标设计项目结构四、实现1、定义Advice拦截器链2、定义Advisor访问者3、方法前置拦截器——MethodBeforeAdviceInterceptor4、代理工厂——ProxyFactory5、融入Bean生命周期的自动代理创建者——InstantiationAwareBeanPostProcessor 、DefaultAdvisorAutoProxyCreato…

什么是3dMax中的“块”?如何在3dMax中使用“块”?

3dMax 块简介 3dMax 是一款用于设计 3d 模型的软件,在 3d 建模图形专业人士中最受欢迎。我们可以在此软件中导入不同类型的预设计 3d 模型,以简化我们的工作。块是不同类型的 3d 模型,您可以从互联网上下载,然后将它们导入到 3dMax 软件的项目工作中,以节省您的时间。在本…

Python和OpenCV创建超快的“for”像素循环

这篇博客将介绍如何使用Python和OpenCV创建超快的“for”像素循环&#xff08;逐像素循环&#xff09;&#xff0c;即Cython快速优化for循环&#xff1b; 使用Python和OpenCV逐像素循环图像是一个非常缓慢的操作&#xff0c;即使图像在内部由NumPy数组表示。 为什么会这样&am…

C语言-指针进阶-qsort函数的学习与模拟实现(9.3)

目录 思维导图&#xff1a; 回调函数 qsort函数介绍 模拟实现qsort 写在最后&#xff1a; 思维导图&#xff1a; 回调函数 什么是回调函数&#xff1f; 回调函数是一个通过函数指针调用的函数。 将一个函数指针作为参数传递给一个函数&#xff0c;当这个指针被用来调用…

57、JDBC和连接池

目录 一、JDBC基本介绍 二、JDBC快速入门 三、JDBC API 1、ResultSet [结果集] 2、Statement 3、PreparedStatement 4、DriverManager 四、封闭JDBCUtils 五、事务 六、批处理 七、数据库连接池 4、数据库连接池种类 &#xff08;1&#xff09; c3p0数据库连接池&…

MacBookPro 遇到pip: command not found问题的解决

学习Pyhton的时候&#xff0c;需要安装第三方插件pyecharts,执行以下命令&#xff1a; pip install pyecharts总是报错 pip: command not found 我很郁闷&#xff0c;于是上网搜索尝试各种命令&#xff0c; 命令1:curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 命…