Java常用类---Object类-->Clone方法

Object类

理论上Object类是所有类的父类,所有类都直接或间接的继承java.lang.Object类。因此省略了extends Object关键字。

Object类中具体方法如下图所示:

其中,部分绿色小锁子图标,如:getClass()、notify()、notifyAll()、wait()等代表该方法被定义为final类型,故不能重写。

补充:

  1. 可以通过Alt + 7 快捷键来打开查询一个类的结构。

  2. 或通过IDEA中View --> Tool Windows --> Structure 来打开,如下图所示。

Clone方法

Clone方法的定义与创建

Clone方法是一种复制方法,当Clone方法被对象调用,就会复制对象。

复制对象的步骤:

  1. 分配内存:分配一个和源对象大小相同的内存空间。

  2. 填充域:使用原对象中的各个域。来填充新对象的域。

  3. 返回新对象:clone方法返回一个新的、与源对象相同的对象,同样得将这个新对象的引用发布到外部。

Clone方法 不是简单的复制一下参数,而是一种新的对象的创建,通过新对象的创建实现了复制对象参数值的改变不会影响源对象的参数值。Clone方法的创建,如下图所示。

其中,调用Clone方法的对象所属类必须实现Clonable接口且重写接口Clone方法。

Clone方法的调运,如下图所示。

更改Clone方法复制对象中的属性,与原对象的属性相比,如下图所示。

上示图片也进一步的说明了Clone方法 不是简单的复制一下参数,而是一种新的对象的创建。

注:在使用调用Clone方法时,要在main方法中抛出异常,如上图所示。当然在main方法中使用try-catch语句处理异常也可以,如下图所示。

关于异常详解请点击此处

浅复制与深复制

上述中,Clone方法在表层上实现了新对象的创建,保证了复制对象参数值的改变不会影响源对象的参数值。但在实际应用中,除了传递基本类型参数,还会出现所传参数为引用类型的情况,针对这种情况,Object类中默认的Clone方法(浅拷贝)显得有些捉襟见肘,因为它仅仅是简单地执行域对域的copy。故,需要采用深拷贝的方法,即除了调用父类中的Clone方法得到新的对象, 还要将该类中的引用变量也Clone出来。如下图所示。

注:上图只展示了CloneMethod1对象引用Test对象,若Test对象还要引用其他对象,以此类推。

内存中的情景图,如下图所示。

附实现代码:

public class CloneMethod1 implements Cloneable {//定义test变量public Test test;//构造方法,传入test变量的值public CloneMethod1(Test test){this.test = test;}//重写clone方法//实现深复制@Overrideprotected Object clone() throws CloneNotSupportedException {CloneMethod1 cloneMethod1 = (CloneMethod1) super.clone();//对引用变量也进行复制cloneMethod1.test = (Test) test.clone();return cloneMethod1;}
}
class Test implements Cloneable{//Test类中重写clone方法@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}

运行类:

public class Application {public static void main(String[] args) throws CloneNotSupportedException{//构造一个CloneMethod1类的新对象CloneMethod1 cloneMethod1 = new CloneMethod1(new Test());//进行深度复制CloneMethod1 cloneMethod1Copy = (CloneMethod1) cloneMethod1.clone();//输出结果//地址不同说明:复制结果产生了一个新对象System.out.println(cloneMethod1);System.out.println(cloneMethod1Copy);System.out.println("cloneMethod1 == cloneMethod1Copy : " + (cloneMethod1 == cloneMethod1Copy) );//内部引用变量的地址也不同,说明进行了深复制System.out.println(cloneMethod1.test);System.out.println(cloneMethod1Copy.test);System.out.println("cloneMethod1.head == cloneMethod1Copy.head : " +  (cloneMethod1.test == cloneMethod1Copy.test));}
}

Clone方法的保护及使用

  • 在Object中,Clone()是被声明为protected形式的。以前图中CloneMethod1类为例,通过声明为此种类型,可以保证只有在CloneMethod1类里面才能进行CloneMethod1类对象的创建。

  • 在实际情况中,根据具体对象的域是什么情况,来选择是使用浅复制还是深复制。依据原则:基本类型使用浅复制,引用类型使用深复制。

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

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

相关文章

点云从入门到精通技术详解100篇-基于深度学习的室内场景三维点云语义分割(续)

目录 CSegNet 语义分割模型构建 3.1 引言 3.2 偏移注意机制 3.3 网络主干 3.4 边缘卷积模块

Redis的基本命令和数据类型

Redis支持多种数据类型,每种类型都有一套相应的命令来进行操作。了解和熟练使用这些基本命令和数据类型是深入学习Redis的基础,下面详细介绍这些基本数据类型和相关命令: 1. 字符串(String) 基本概念:字符…

springMVC获取请求参数的方式

文章目录 springmvc获取参数的方式1、ServletAPI获取参数(原生态)2、通过控制器的形参取值3、 RequestParam4、通过POJO获取请求参数 springmvc获取参数的方式 1、ServletAPI获取参数(原生态) 将HttpServletRequest作为控制器方…

从0开始python学习-41.requsts中session关联接口

问题:在多接口测试中,存在接口token等参数需要关联的情况,为了避免无法进行关联或者错误关联及写很多冗余代码的情况。采用session的方式进行接口关联 作用:requests库的session会话对象可以跨请求保持某些参数,Reque…

新晋程序员的2023:挫折、收获与未来展望

2023年,对我而言,是一个崭新的开端,也是一个丰富的挑战。毕业后,我跌跌撞撞走入了编程世界,虽然这年经历了很多坎坷,但也收获了许多。让我向你们介绍一下我刚毕业的这一年的编程之旅。 我与编程的故事开始…

前缀和(用于计算某数组区间的总和)

目录 前缀和思路:代码: 原题链接 前缀和 输入一个长度为 n 的整数序列。 接下来再输入 m 个询问,每个询问输入一对 l,r 。 对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。 输入格式 第一行包含两个整数 n 和 m 。 第…

SPRING BOOT发送邮件验证码(Gmail邮箱)

SPRING BOOT邮件发送验证码 一、Gmail邮箱配置 1、进入Gmail(https://mail.google.com) 2、打开谷歌右上角设置 3、启用POP/IMP 4、启用两步验证(https://myaccount.google.com/security) 5、建立应用程式密码 6、复制保存应用程式密码 二、代码 1、引入依赖 <d…

Java并发集合详解

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;在这篇博客中&#xff0c;咱们将一起深入探索Java中的并发集合。多线程编程是一个不可或缺的部分&#xff0c;它能让程序运行得更快&#xff0c;处理更多的任务。但同时&#xff0c;多线程也带来了一些挑战&…

服务器RAID管理之MegaRaid工具

一、简介 MegaCli是一款管理维护硬件RAID软件&#xff0c;可以通过它来了解当前raid卡的所有信息&#xff0c;包括 raid卡的型号&#xff0c;raid的阵列类型&#xff0c;raid 上各磁盘状态等等。通常&#xff0c;我们对硬盘当前的状态不太好确定&#xff0c;一般通过机房人员巡…

嵌入式(七)看门狗 | 看门狗工作模式 寄存器 时钟系统

文章目录 1 看门狗原理2 功能3 看门狗工作模式4 看门狗控制寄存器5 时钟系统 及其寄存器 1 看门狗原理 看门狗(Watch Dog Timer&#xff0c; WDT)是一种专门用于监测单片机程序运行状态的芯片组件。其实质是一个计数器&#xff0c;一般给看门狗初始一个比较大的数&#xff0c;…

前端效果 登入界面

文章目录 效果展示&#xff1a; 代码&#xff1a; <template><div class"login"><div class"section-1"><div class"card" mouseover"activeCard 1" mouseleave"activeCard 0" click"islogin…

Liunx安装FTP和SFTP

ftp端口&#xff1a;20/21 sftp端口&#xff1a;22 一、ftp 1、安装ftp yum install vsftpd #安装ftp 服务 &#xff08;1&#xff09;查看ftp服务的状态 命令&#xff1a;service vsftpd status PS&#xff1a;提示vsftpd: command not found&#xff0c;修改PATH的环境…

mybatis调用Oracle存储过程 带游标

目录 存储过程 调用测试 游标 Mapper.xml Mapper 调用测试 结果 存储过程 CREATE OR REPLACE PROCEDURE proc_test2(p_id IN NUMBER,v_cur OUT SYS_REFCURSOR,p_result_code OUT NUMBER,p_result_message OUT VARCHAR2) AS BEGINp_result_m…

实现在一个文件夹中找到特定名称特点格式的文件

当你要在一个文件夹中查找特定名称和格式的文件时&#xff0c;你可以使用 Python 的 os 和 fnmatch 模块。以下是一个简单的脚本示例&#xff0c;它可以在指定目录中查找文件&#xff1a; import os import fnmatchdef find_files(directory, pattern):"""在指…

你真的会用 Postman 吗?

1. 场景 提到 Postman&#xff0c;大部分的人可能只停留在使用 Postman「 模拟网络请求 」这单一功能上面。 事实上&#xff0c;Postman 的功能很强大&#xff0c;下面将罗列出几个比较少用&#xff0c;但实用的功能。 2. 抓包及拦截器 除了 Fiddler 和 Charles&#xff0c…

MySQL 8.0中新增的功能(四)

数据类型支持 MySQL现在支持在数据类型规范中将表达式用作默认值。这包括可以为以前无法分配默认值的BLOB、TEXT、GEOMETRY和JSON数据类型设置表达式作为默认值。 优化器 以下是新增的优化器改进&#xff1a; MySQL现在支持不可见索引。不可见索引在优化器中根本不被使用&a…

vmlinux, vmlinux.bin, bzImage; cmake的find_package(Clang)新增了哪些变量( 比较两次记录的所有变量差异)

vmlinux, vmlinux.bin, bzImage cd /bal/linux-stable/ file vmlinux #vmlinux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, BuildID[sha1]b99bbd9dda1ec2751da246d4a7ae4e6fcf7d789b, not stripped #文件大小 20MB, 19940148Bfile arc…

[ROS2 Foxy]#1.3 安装使用 turtlesim

官网教程: https://docs.ros.org/en/foxy/Tutorials/Turtlesim/Introducing-Turtlesim.html 1.turtlesim安装和使用 turtlesim是一个轻量级的模拟程序,用来学习ROS2 .通过turtlesim来介绍ROS2在一个基础的水平上都要做了那些事,以此让我们了解将来在真的 robot或者模拟器上使用…

【AI视野·今日Sound 声学论文速览 第四十期】Wed, 3 Jan 2024

AI视野今日CS.Sound 声学论文速览 Wed, 3 Jan 2024 Totally 4 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Auffusion: Leveraging the Power of Diffusion and Large Language Models for Text-to-Audio Generation Authors Jinlong Xue, Yayue De…

[VUE]5-TypeScript

目录 1 TypeScript 介绍2、安装3、快速上手4、TypeScript 常用类型4.1 类型标注的位置4.2 字符串、数字、布尔类型4.3 字面量类型4.4 ⭐interface 类型4.5 class 类型 ​&#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;…