java 如何实现对象克隆_Java对象克隆

Java不提供克隆(复制)对象的自动机制。克隆对象意味着逐位复制对象的内容。要支持克隆操作,请在类中实现clone()方法。Object类中的clone()方法的声明如下:

protected Object clone() throws CloneNotSupportedException

clone()方法声明为protected。 因此,不能从客户端代码调用它。以下代码无效:

Object obj = new Object();

Object clone = obj.clone(); // Error. Cannot access protected clone() method

需要在类中声明clone()方法为public来克隆类的对象。

它的返回类型是Object。 这意味着将需要使用clone()方法转换返回值。

假设MyClass是可克隆的。 克隆代码将如下所示

MyClass mc = new MyClass();

MyClass clone = (MyClass)mc.clone(); // Need to use a cast

Object类中的clone()方法会抛出CloneNotSupportedException。要调用clone()方法,需要将调用放在try-catch块中,或者重新抛出异常。

示例

以下代码显示了如何实现克隆方法。

class MyClass implements Cloneable {

private double value;

public MyClass(double value) {

this.value = value;

}

public void setValue(double value) {

this.value = value;

}

public double getValue() {

return this.value;

}

public Object clone() {

MyClass copy = null;

try {

copy = (MyClass) super.clone();

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

return copy;

}

}

public class Main {

public static void main(String[] args) {

MyClass dh = new MyClass(100.00);

MyClass dhClone = (MyClass) dh.clone();

System.out.println("Original:" + dh.getValue());

System.out.println("Clone :" + dhClone.getValue());

dh.setValue(100.00);

dhClone.setValue(200.00);

System.out.println("Original:" + dh.getValue());

System.out.println("Clone :" + dhClone.getValue());

}

}

上面的代码生成以下结果。

Original:100.0

Clone :100.0

Original:100.0

Clone :200.0

实例-2

以下代码不从clone()方法返回对象类型,该方法仅在Java5或更高版本中编译。

class MyClass implements Cloneable {

public MyClass clone() {

Object copy = null;

return (MyClass)copy;

}

}

下面的代码展示了如何做浅克隆。

class MyClass implements Cloneable {

private double value;

public MyClass(double value) {

this.value = value;

}

public void setValue(double value) {

this.value = value;

}

public double getValue() {

return this.value;

}

public Object clone() {

MyClass copy = null;

try {

copy = (MyClass) super.clone();

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

return copy;

}

}

class ShallowClone implements Cloneable {

private MyClass holder = new MyClass(0.0);

public ShallowClone(double value) {

this.holder.setValue(value);

}

public void setValue(double value) {

this.holder.setValue(value);

}

public double getValue() {

return this.holder.getValue();

}

public Object clone() {

ShallowClone copy = null;

try {

copy = (ShallowClone) super.clone();

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

return copy;

}

}

public class Main {

public static void main(String[] args) {

ShallowClone sc = new ShallowClone(100.00);

ShallowClone scClone = (ShallowClone) sc.clone();

System.out.println("Original:" + sc.getValue());

System.out.println("Clone :" + scClone.getValue());

sc.setValue(200.00);

System.out.println("Original:" + sc.getValue());

System.out.println("Clone :" + scClone.getValue());

}

}

上面的代码生成以下结果。

Original:100.0

Clone :100.0

Original:200.0

Clone :200.0

实例-3

ShallowClone类的clone()方法中的代码与MyClass类的clone()方法相同。当ShallowClone类使用super.clone()调用Object类的clone()方法时,它会接收自身的浅拷贝。也就是说,它与其克隆共享其实例变量中使用的DoubleHolder对象。

在深克隆中,需要克隆对象的所有引用实例变量。

class MyClass implements Cloneable {

private double value;

public MyClass(double value) {

this.value = value;

}

public void setValue(double value) {

this.value = value;

}

public double getValue() {

return this.value;

}

public Object clone() {

MyClass copy = null;

try {

copy = (MyClass) super.clone();

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

return copy;

}

}

class DeepClone implements Cloneable {

private MyClass holder = new MyClass(0.0);

public DeepClone(double value) {

this.holder.setValue(value);

}

public void setValue(double value) {

this.holder.setValue(value);

}

public double getValue() {

return this.holder.getValue();

}

public Object clone() {

DeepClone copy = null;

try {

copy = (DeepClone) super.clone();

copy.holder = (MyClass) this.holder.clone();

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

return copy;

}

}

public class Main {

public static void main(String[] args) {

DeepClone sc = new DeepClone(100.00);

DeepClone scClone = (DeepClone) sc.clone();

System.out.println("Original:" + sc.getValue());

System.out.println("Clone :" + scClone.getValue());

sc.setValue(200.00);

System.out.println("Original:" + sc.getValue());

System.out.println("Clone :" + scClone.getValue());

}

}

执行上面的代码,将生成以下结果 -

Original:100.0

Clone :100.0

Original:200.0

Clone :100.0

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

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

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

相关文章

python 默认配置文件_python各类配置文件写法

1. csv文件csv:Comma-Separated Values半结构化数据逗号分割值,可以使用office或者wps打开。模块:csvcsv.reader(csvfile,dialect’excel’,**fmtparams)csv.writer(csvfile,dialect’excel’,**fmtparams)返回一个DictWriter实例。主要支持的…

java mvc建包结构_Java SSM框架的配置方法、MVC结构的分析、响应的流程

今天头一次配置成功一个SSM框架,兴奋之余,还应该从使用的角度,将整个ssm配置的方法,配置的原因,认真的分析一下。在结束了对SSM框架简单的分析之后,就要开始回归基础,全面的认真复习。所以这个文…

英特尔显示器音频_英特尔也玩马甲?有关USB TypeC的冷知识你了解多少

随着Type-C接口的不断发展,这个接口也成为越来越多设备的标配,除了出现在手机、平板电脑和笔记本电脑等移动设备上,显卡这样的设备也开始配备Type-C接口了,本周末,小编为大家收集了一些有关Type-C接口的冷知识&#xf…

java drawingpanel_Java DrawingPanel.getHeight方法代码示例

import org.opensourcephysics.display.DrawingPanel; //导入方法依赖的package包/类/*** Paint the contour.* param g*/public synchronized void draw(DrawingPanel panel, Graphics g) {if(!visible||(griddatanull)) {return;}if(!autoscaleZ && showColoredLevel…

python激活虚拟环境source不是内部或外部_激活虚拟环境的问题

F:\sdk\imooc_request>virtualenv envname --no-setuptools --no-pip --no-wheelUsing base prefix f:\\编程\\pycharmNew python executable in F:\sdk\imooc_request\envname\Scripts\python.exeF:\sdk\imooc_request>source .env/bin/activatesource 不是内部或外部命…

如何允许网页中的编辑器访问剪切板_Vditor下一代的 Markdown 编辑器,为未来而构建...

❝Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得(富文本)、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React、Angular,提供桌面版❞Markdown背景随着 Markdown 排版方式的普及&…

java ocsp请求_java – 客户端证书上的OCSP吊销

如果仅使用客户端的java.security.cert.X509Certificate,如何使用OCSP手动检查java中的证书撤销状态?我看不清楚这样做的明确方法.或者,我可以让tomcat自动为我做,你怎么知道你的解决方案是真的?解决方法:我发现了一个最优秀的解决方案/**54 * This is a…

java模型给泛型_【一天一个基础系列】- java之泛型篇

java 5以后,java引入了“参数化类型”的概念,允许程序在创建集合时指定集合元素的类型java 7之前,如果使用带泛型的接口、类定义变量,那么调用构造器创建对象时构造器的后面也必须带泛型比如//java 7之前List list new ArrayList…

mpython掌控板作品_第1课 Arduino micro:bit 掌控板 创客教育常用的3类主控板

有很多朋友想学习创客,问我怎么学习。我建议他先百度一下“创客”,看看有什么感觉。结果还是很懵,五花八门,什么都有,找不到核心。简单理解,就是以前讲的DIY,自己动手,制作一个东西。…

redis启动没反应_Promethues如何针对Redis进行监控

需求:采用redis_exporter 收集数据,promethus采集redis_exporter数据,granfana展示数据一、简易安装redisyum install -y redisrpm -qa |grep redislsof -i :6379rpm -ql redissystemctl start redis找到配置文件/etc/redis.conf,修改 requir…

网上书店管理系统java部分代码_网上书店管理系统 java语言

【实例简介】整个系统,包括数据库,安装上就能用,非常适合做课程设计的作业或者毕业设计的作业【实例截图】【核心代码】OnLineBookStore└── OnLineBookStore├── WebRoot│ ├── META-INF│ │ └── MANIFEST.MF│ ├── W…

java自定义标签遍历_自定义标签 - CarlDing的个人页面 - OSCHINA - 中文开源技术交流社区...

EL的不足,由JSTL来加强 -> 自定义标签来实现。1:自定义标签1:自定义标签也是类。2:让用户在JSP页面使用,不引用Java代码的情况下,调用Java代码。2:标签开的类的继承关系3:快速的…

python宏替换_简单的宏替换

简单的宏替换1.宏定义必须写在第一次使用该宏定义的代码之前;2.宏定义不是以分号结束的3.#define string1 string2 之间至少要有一个空格4.string 1称为宏,string2 称为宏扩展5. 宏名用大写的字母表示是一个习惯6.使用宏的好处:a 简化程序的书…

python逆序数怎么求_怎么算逆序数?急~~~!!!

展开全部可使用直bai接计数法,计算一个du排列的逆序数的直接zhi方法是逐个dao枚举逆序,同时统计个内数。举个例子:标准列是容1 2 3 4 5,那么 5 4 3 2 1 的逆序数算法:看第二个,4之前有一个5,在标…

java解析xml中文字符乱码_Eclipse读取xml中文乱码问题解决

【mysql】高可用集群之MMM一.复制的常用拓扑结构 复制的体系结构有以下一些基本原则: (1) 每个slave只能有一个master: (2) 每个slave只能有一个唯一的服务器ID: (3) 每个maste ...公钥私钥 ssl/tsl的概念一,公钥私钥1,公钥和私钥成对出现2,公开的密钥叫公钥,…

springboot整合rocketmq_面试官:简单说一下RocketMQ整合SpringBoot吧

前言在使用SpringBoot的starter集成包时,要特别注意版本。因为SpringBoot集成RocketMQ的starter依赖是由Spring社区提供的,目前正在快速迭代的过程当中,不同版本之间的差距非常大,甚至基础的底层对象都会经常有改动。例如如果使用…

java面试常考_JAVA面试常考系列十

JAVA面试常考系列十题目一Servlet是什么?Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是用Java编写的服务器端程序,主要的作用是处理客户端请求并生成动态Web内容。一般情况下,Servlet主要…

的ui在vs中显示没有成员_在电脑桌面使用敬业签团队便签怎么设置新增内容在上面显示?...

实时跟进小组成员的各项任务的完成情况,及时将工作任务安排下去,是提高团队工作效率的较为有效的方法。在监督小组成员任务状况以及及时安排工作方面,选择一款支持多人同步在线协作的软件是非常有必要的。敬业签团队便签是一款不受系统、设备…

Java利用二维数组判断节假日_《剑指offer》面试题3 二维数组中的查找 Java版

(二维数组,每行递增,每列递增。输入二维数组和一个整数,判断数组中是否含有此数。)我的方法:拿到题目,根据题目条件我提取出这样一个特性:一个数的右边和下面的数都比它大。于是就可以写出一种递归的方法&a…

多表关联查询_【函数007】 EXCEL多表关联查询实战

继续函数实战系列教程,今天要分享的案例是根据填写的表名自动提取对应表中的数据数据准备:需求说明:我们希望实现,我们选择不同月份,显示对应月份表中的数据!处理方案:1、构建下拉列表(菜单)数据…