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

news/2024/11/27 23:42:48/

对象克隆

  • 一、前言
  • 二、浅克隆
    • 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();}@Overrideprotected 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.ppmy.cn/news/10934.html

相关文章

产线工控安全之现状分析及方案应对

产线安全现状 工业控制系统是支撑国民经济的重要设施&#xff0c;是工业领域的神经中枢。现在工业控制系统已经广泛应用于电力、通信、化工、交通、航天等工业领域&#xff0c;支撑起国计民生的关键基础设施。 随着传统的工业转型&#xff0c;数字化、网络化和智能化的工业控…

Apache与Nginx虚拟机的三种访问+非简单请求+跨域知识点整理

Apache 在D:\project\web\index.html中写入 <h1>welcome useing apache!</h1>基于ip访问 打开phpstudy_pro\Extensions\Apache2.4.39\conf\extra\httpd-vhosts.conf写入 <VirtualHost 192.168.1.4:80>ServerAdmin 88888888163.com #管理员邮箱DocumentRoo…

【Linux】进程信号万字详解(上)

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…

若依分离版解决单个账号多设备登录问题

若依分离版解决单个账号多设备登录问题 1.application.yml添加相关配置&#xff0c;用于灵活控制单个账号多设备登录的情况 #token配置 token: # 这个是若依框架本身存在的配置 # 是否允许并多设备登录 true:允许 false:不允许 这个是新增的配置singleLogin: false2.Cach…

测试开发 | 跨平台设备管理方案 Selenium Grid

Selenium Grid 是 Selenium 的三大组件之一&#xff0c;它可以在多台机器上并行运行测试&#xff0c;集中管理不同的浏览器版本和浏览器配置。通过将客户端命令发送到远程浏览器的实例, Selenium Grid 允许在远程计算机 (虚拟或真实) 上执行 WebDriver 脚本. 它旨在提供一种在多…

【Python】python深拷贝和浅拷贝(二)

【Python】python深拷贝和浅拷贝&#xff08;二&#xff09; 前言 上一期我们介绍了Python中深拷贝和浅拷贝的定义以及它们在执行过程中内存结构&#xff0c;同时也给出了深拷贝和浅拷贝的方法。&#xff08;没有看上一期的朋友看这里&#xff0c;python深拷贝和浅拷贝&#…

基于javascript专题一总结(2023年版)

目录 函数柯里化 定义 #实现 #应用场景 #参数复用 Nodejs的EventEmitter #Api #基本使用 #手动实现EventEmitter #JavaScript自定义事件 防抖 浅拷贝和深拷贝 数组去重&#xff0c;扁平&#xff0c;最值 去重 #Object #indexOf filter #Set #排序 #去除重复…

canvas入门教学(5)运动小球屏保特效与下雪特效渲染

本节我们来学习两个例子,第一个例子是如下图这样的,全屏各色各样的小球随机运动,碰撞到屏幕边缘再反弹回来的特效,我们一步一步带着大家来学习这个canvas应用。 首先呢,基于上一个教程的例子,我们需要基础的构建圆, 上节教程在这里 并且呢我们要重复的多次的构建半径…