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方法
    //实现深复制
    @Override
    protected Object clone() throws CloneNotSupportedException {
        CloneMethod1 cloneMethod1 = (CloneMethod1) super.clone();
        //对引用变量也进行复制
        cloneMethod1.test = (Test) test.clone();
        return cloneMethod1;
    }
}
class Test implements Cloneable{
    //Test类中重写clone方法
    @Override
    protected 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类对象的创建。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI会完全替代Java程序员吗?

作为一个 Java 开发的从业人员,以我自己对GPT的使用来说, AI 现阶段想要完全取代程序员,那是完全不可能的。 当然,随着算力以及数据的训练越来越多,以后不好说,个人觉得大部分基础代码完全可以使用 AI 生成…

Linux内存管理:(八)页面迁移

文章说明: Linux内核版本:5.0 架构:ARM64 参考资料及图片来源:《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址: zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 可迁移页面 页面迁移机制支持两…

计算机毕业设计----Springboot超市订单管理系统

项目介绍 该超市订单管理毕业设计基于jdk8版本开发,在部署时需要使用jdk8以上的版本。使用了目前流行的框架组合springbootmybatis的框架技术, 实现了供应商管理对供应商实现增删改查、订单管理对超市订单实现增删改查、用户管理等功能,适用…

解决Windows11 “我们无法设置移动热点”

目录 问题复现解决办法①启动网络适配器②打开移动热点③共享网络连接④连接移动热点总结 问题复现 因为交换机上网口限制,开发环境暂时没有WIFI设备,只有一根网线和一台笔记本电脑。于是开启笔记本电脑的WiFi共享服务。结果提示 “我们无法设置移动热点…

机器学习+大数据项目

一、特征工程 特征清洗 特征监控 特征选择 计算每一个特征和响应变量的相关性 通过L1正则项来选择特征 训练能对特征打分的预选模型 通过特征组合后再来选择特征 通过深度学习来进行特征选择

性能测试分析案例-定位服务吞吐量下降

环境准备 预先安装 docker、curl、wrk、perf、FlameGraph 等工具 sudo yum groupinstall Development Tools # 安装火焰图工具 git clone https://github.com/brendangregg/FlameGraph # 安装wrk git clone https://github.com/wg/wrk cd wrk && make && sud…

VUE---计算属性computed

概念: 基于 现有的数据 ,计算出来的 新属性 。 依赖 的数据变化, 自动 重新计算 。 语法: ① 声明在 computed 中,一个计算属性对应一个函数 ② 使用起来和普通属性一样使用 {{ 计算属性名 }},注意不…

N-137基于springboot,vue运动会报名管理系统

开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:vueAvueElementUI 服务端技术:springbootmybatis 本项…

网站建设网络设计营销类网站模板

★安装环境要求★ 服务器:Linux / Apache / IIS PHP版本:5.4及5.4以上,完美支持php7.4 MYSQL版本:5.0以上 PS:php版本推荐5.6,mysql推荐使用5.7 ★模板安装步骤★ 1、请将源码包里面的所有文件和文件夹上…

UV机-理光G5六彩一白一光油配置

UV机-理光G5六彩一白一光油配置

统计学-R语言-3

文章目录 前言给直方图增加正态曲线的不恰当之处直方图与条形图的区别核密度图时间序列图洛伦茨曲线计算绘制洛伦茨曲线所需的各百分比数值绘制洛伦茨曲线 练习 前言 本篇文章是介绍对数据的部分图形可视化的图型展现。 给直方图增加正态曲线的不恰当之处 需要注意的是&#…

flutter封装dio请求库,让我们做前端的同学可以轻松上手使用,仿照axios的使用封装

dio是一个非常强大的网络请求库,可以支持发送各种网络请求,就像axios一样灵活强大,但是官网没有做一个demo示例,所以前端同学使用起来还是有点费劲,所以就想在这里封装一下,方便前端同学使用。 官网地址&a…

探索检索增强生成(RAG)技术的无限可能:Vector+KG RAG、Self-RAG、多向量检索器多模态RAG集成

探索检索增强生成(RAG)技术的无限可能:VectorKG RAG、Self-RAG、多向量检索器多模态RAG集成 由于 RAG 的整体思路是首先将文本切分成不同的组块,然后存储到向量数据库中。在实际使用时,将计算用户的问题和文本块的相似…

【C语言刷题每日一题#牛客网BC107】矩阵转置

目录 问题描述 思路逐步分析 完整代码实现 结果测试 问题描述 思路逐步分析 首先,根据输入的描述,第一行输入的是两个整数n和m,分别表示一个矩阵(二维数组)的行和列,并且行和列不超过10 根据要求&…

AC修炼计划(AtCoder Beginner Contest 335)A-F

传送门: AtCoder Beginner Contest 335 (Sponsored by Mynavi) - AtCoder A,B,C,D还算比较基础,没有什么思路,纯暴力就可以过。 这里来总结一下E和F E - Non-Decreasing Colorful Path 最开始以为是树形…

用笨办法-刻意练习来提高自己的编程能力

尝试了很多学习方法,企图快速提高编程能力,但最终发现,唯有老老实实刻意练习1,在辛苦与时间积累下,逐渐提升能力,才是最有效的方式。 将自己的笨办法总结了一下,主要包含7个步骤: …

Mariadb和mysql数据库的区别和相同之处

目 录 一、maridb 和mysql在linux系统中广泛应用 二、MySQL数据库 三、MariaDB数据库 四、MariaDB和MySQL有哪些相同点 五、MariaDB和MySQL的不同点 一、mariadb 和mysql在linux系统中广泛应用 用linux(包括centos和Ubuntu)的都知道&a…

构建基于RHEL7(CentOS7)的OpenSSH9.5p1的RPM包和升级回退方案

本文适用:RHEL7系列,或同类系统(CentOS7等) 文档形成时期:2023年 因软件世界之复杂和个人能力之限,难免疏漏和错误,欢迎指正。 文章目录 环境准备安装依赖openssh-9.5p1-el7.spec内容构建RPM包下载安装前注意事项开启t…

python学习笔记9(程序的描述方式、程序的组织结构、顺序结构、选择结构1)

(一)程序的描述方式 自然语言、流程图、伪代码 (二)程序的组织结构 顺序、选择、循环 (三)顺序结构 (四)选择结构1 if 1、条件写法1 2、如果只有一个判断的写法 3、注意冒号和缩进…

14、MySQL高频面试题

1、内连接和外连接的区别 内连接和外连接都是数据库进行多表联查时使用的连接方式,区别在于二者获取的数据集不同 内连接指的是使用左表中的每一条数据分别去连接右表中的每一条数据,仅仅显示出匹配成功的那部分 外连接有分为左外连接和右外连接 左外…