Java:Clonable 接口和拷贝

一 Clonable 接口

在 Java SE 中,Cloneable 是一个标记接口(Marker Interface),它位于 java.lang 包中。这个接口的主要目的是标识实现该接口的类能够被合法地克隆(即可以调用 Object 类中的 clone() 方法)。

1.当我们点入Clonable 接口的源代码中,可以发现里面什么都没有。

因为Cloneable 是一个标记接口,用来表明类的对象可以被克隆。 

2.如果不实现 Cloneable 接口而直接调用 clone() 方法,系统将抛CloneNotSupportedException 异常。 

 

3.Clonable 接口的实现

第一步

class Money{public double money=9.9;
}
public class Person {public String name;public int age;public Money m=new Money();public Person(String name,int age){this.name=name;this.age=age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", m=" + m +'}';}
}
public class Test {public static void main(String[] args) {Person person1=new Person("wang",10);Person person2=person1.}}

问题:但是我们发现 ,在person1的引用中没有发现clone() 

第二步

实现Cloneable接口,并重写Object接口的克隆方法

class Money{public double money=9.9;}
public class Person implements Comparable{public String name;public int age;public Money m=new Money();public Person(String name,int age){this.name=name;this.age=age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", m=" + m +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class Test {public static void main(String[] args) {Person person1=new Person("wang",10);Person person2=person1.clone();}}

问题:但我们发现,代码依旧报错。

第三步

由于clone()方法返回值是Object是父类,所以要将克隆方法强转为子类。

class Money{public double money=9.9;
}
public class Person implements Comparable{public String name;public int age;public Money m=new Money();public Person(String name,int age){this.name=name;this.age=age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", m=" + m +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class Test {public static void main(String[] args) {Person person1=new Person("wang",10);Person person2=(Person) person1.clone();}}

 

问题:但是代码依旧报错

第四步

因为有异常,所以得先处理 

 

class Money{public double money=9.9;
}
public class Person implements Comparable{public String name;public int age;public Money m=new Money();public Person(String name,int age){this.name=name;this.age=age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", m=" + m +'}';}@Overrideprotected Object clone()throws CloneNotSupportedException {return super.clone();}
}
public class Test {public static void main(String[] args) throws CloneNotSupportedException{Person person1=new Person("wang",10);Person person2=(Person) person1.clone();}}

 

最终运行成功 

过程如下

 二 拷贝

1.浅拷贝

class Money{public double money=9.9;
}
public class Person implements Cloneable{public String name;public int age;public Money m=new Money();public Person(String name,int age){this.name=name;this.age=age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", m=" + m +'}';}@Overrideprotected Object clone()throws CloneNotSupportedException {return super.clone();}
}
public class Test {public static void main(String[] args)throws CloneNotSupportedException{Person person1=new Person("wang",10);Person person2=(Person) person1.clone();
/*        System.out.println(person1);System.out.println(person2);*/System.out.println("修改前"+person1.m.money);System.out.println("修改前"+person2.m.money);person1.m.money=100;System.out.println("修改后"+person1.m.money);System.out.println("修改后"+person2.m.money);}}

 

我们可以看出,只克隆了Person对象,没有克隆Money对象 ,这种现象就叫做浅拷贝。

2.深拷贝

如何让Money也进行克隆呢?

接下来就是深拷贝过程

class Money implements Cloneable{public double money=9.9;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class Person implements Cloneable{public String name;public int age;public Money m=new Money();public Person(String name,int age){this.name=name;this.age=age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", m=" + m +'}';}@Overrideprotected Object clone()throws CloneNotSupportedException {//return super.clone();Person tem=(Person) super.clone();tem.m=(Money) this.m.clone();return tem;}
}
public class Test {public static void main(String[] args)throws CloneNotSupportedException{Person person1=new Person("wang",10);Person person2=(Person) person1.clone();
/*        System.out.println(person1);System.out.println(person2);*/System.out.println("修改前"+person1.m.money);System.out.println("修改前"+person2.m.money);person2.m.money=100;System.out.println("修改后"+person1.m.money);System.out.println("修改后"+person2.m.money);}}

 

过程如下:

 

注:clone() 默认执行浅拷贝,若需要深拷贝,需要手动处理。 

希望能对大家有所帮助!!! 

 

 

 

 

 

 

 

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

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

相关文章

重生之我们在ES顶端相遇第14 章 - ES 节点类型

文章目录 前言Coordinating nodeMaster-eligible nodeData nodeCoordinating only nodeRemote-eligible nodeMachine learning node 前言 通过前面的学习,我们已经初步的掌握了 ES 的大部分用法。 后面的篇章会介绍 ES 集群相关的内容。 本文着重介绍 ES 节点类型&…

vue3-05-Element-plus中表单校验:校验对象中的对象的属性,校验对象中的数组中的对象的属性,校验嵌套对象

目录 一、校验对象中的普通属性二、校验对象中对象的属性三、校验对象中的数组中的对象的属性 这两天写vue3项目,用了element-plus库,到了表单规则验证的环节,我发现我只会校验对象中的普通属性,如果校验嵌套对象,我就…

Java笔试面试题AI答之设计模式(2)

文章目录 6. 什么是单例模式,以及他解决的问题,应用的环境 ?解决的问题应用的环境实现方式 7. 什么是工厂模式,以及他解决的问题,应用的环境 ?工厂模式简述工厂模式解决的问题工厂模式的应用环境工厂模式的…

React组件如何暴露自身的方法

一、研究背景 最近遇到一个如何暴露React组件自身方法的问题。在某些时候,我们需要调用某个组件内部的方法以实现某个功能,因此我们需要了解如何暴露组件内部API的方法。 二、实践过程 本文主要介绍React组件暴露子组件API的方法,以下是实…

基于协同过滤推荐算法的食品推荐系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏:Java精选实战项目源码、Python精…

并查集LRU cache

并查集的定义 将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(unio…

尚品汇-秒杀成功下单接口、秒杀结束定时任务-清空缓存数据(五十四)

目录: (1)下单页面 (2)service-activity-client添加接口 (3)web-all 编写去下单控制器 (4)service-order模块提供秒杀下单接口 (5)service-or…

2024年最新 Python 大数据网络爬虫技术基础案例详细教程(更新中)

网络爬虫概述 网络爬虫(Web Crawler),又称为网页蜘蛛(Web Spider)或网络机器人(Web Robot),是一种自动化程序或脚本,用于浏览万维网(World Wide Web&#xf…

通过UV快速计算品牌独立站网络流量

背景: 品牌独立站项目交付过程中,我们需要为客户提供“云资源” 成本报价,其中“计算资源” 及CPU、内存、存储 参数相对固定,而互联网网络成本需要进行评估报价,以海外TOP云平台 AWS、AZURE、GCP 为例都是以“不限带…

【学术会议:中国厦门,为全球的计算机科学与管理科技研究者提供一个国际交流平台】第五届计算机科学与管理科技国际学术会议(ICCSMT 2024)

您的学术研究值得被更多人看到! 在这里,我为您提供精准的会议推荐,包括计算机科学、管理科技、信息系统、人工智能、供应链管理等领域的国际会议。高效的稿件录用流程和优质的检索服务将确保您的研究成果迅速传播。关注我,寻找与…

java(2)方法的使用

目录 1.前言 2.正文 2.1方法的定义 2.2方法的调用过程 2.3方法的实参与形参 2.3.1形参 2.3.2实参 2.3.3参数传递 2.4方法的重载 3.小结 1.前言 哈喽大家好啊,今天博主继续带领大家学习java的基本语法,java的基础语法部分打算用六到七篇博文完…

828华为云征文——使用Flexus云服务器X实例CentOS镜像下创建MySQL服务器教程

一、概述 1.1 前言 当前正值华为云盛大的828 B2B企业庆典,其中Flexus X实例的特惠活动尤为吸引人眼球。对于追求极致算力表现,并期望在自建MySQL数据库、Redis缓存系统及Nginx服务器部署上获得卓越性能的企业用户而言,这无疑是一个不可多得的…

[Linux] Linux进程PCB内部信息的深入理解

标题:[Linux] Linux进程PCB内部信息的深入理解 个人主页:水墨不写bug (图片来自网络) 目录 一.查看进程 二.认识并了解进程的关键信息 I,PID/PPID II,exe III,cwd 三、fork(&…

设置文件夹用VSCODE右键打开,自己修改注册表不管用,该怎么办

设置文件夹用VSCODE右键打开,自己修改注册表不管用;试了好几次,自己修改注册表的方法不管用。所幸直接下个新版本,覆盖安装,把这两个选项勾上就可以了。

linux-基础知识4

网络连接性测试 ping ping可以用来测试本机与目标主机的连通速度网络稳定性 ping -c 5 -s 1024 目标主机ip地址 -c 表示ping包的个数,linux如果缺省-c会一直ping下去,windows平台的选项是-n -s指定ping发送数据的字节数默认是84字节。windows的是-l 没有问题时会之…

2023国赛C题 蔬菜类商品的自动定价与补货决策(上)

2023国赛C题 蔬菜类商品的自动定价与补货决策(上) 符号说明: 问题1 问题1主要的代码和思路在上一篇文章“数学建模实战块速入门”中已经进行了较为详细的展示,在问题一种要求我们从蔬菜单品和品类两个维度去分析各自之间的关系。…

2024年中国研究生数学建模竞赛C题——解题思路

2024年中国研究生数学建模竞赛C题——解题思路 数据驱动下磁性元件的磁芯损耗建模——解决思路 二、问题描述 为解决磁性元件磁芯材料损耗精确计算问题,通过实测磁性元件在给定工况(不同温度、频率、磁通密度)下磁芯材料损耗的数据&#xf…

学习笔记——MMSR 自适应多模态融合的序列推荐

Adaptive Multi-Modalities Fusion in Sequential Recommendation Systems 前几天当我在阅读这篇论文的时候,在网上找到的相关资料很少,所以当时我读这篇论文的时候特别痛苦,精读了两天半.....所以现在我将自己学习笔记分享出来,…

服务器安全,你必须知道的六个知识点

服务器安全 如今没有什么是安全的。各种系统安全漏洞的数量呈爆炸式增长。令人担忧的主要原因之一是服务器安全性。 接下来,就如何提升服务器安全,写几点见解。 虽然很多企业在服务器的安全性方面做了足够多,但是,黑客仍然能够…

Python数据分析与可视化(Python绘图详解)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…