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 个群。

java 如何实现对象克隆_Java对象克隆相关推荐

  1. java浅度克隆_java对象 深度克隆(不实现Cloneable接口)和浅度克隆

    为什么需要克隆: 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说 ...

  2. java 子类克隆_Java对象克隆了解

    1.java接口中有一种空的接口叫标识接口,这种接口值起到标识作用. 2.要实现java对象克隆需要用到Object类的 protected Object clone() throws CloneNo ...

  3. java 对象复活_Java对象复活

    java 对象复活 总览 收集覆盖了finalize()的对象之后,将其添加到终结处理队列中,以在调用每个对象的finalize()方法之后进行清理. 如果您复活了物体,会发生什么? 何时定案? fi ...

  4. java开源对象池_JAVA 对象池

    GenericObjectPool利用一个org.apache.commons.collections.CursorableLinkedList对象来保存对象池里的对象.这种对象池的特色是: 可以设定 ...

  5. java 对象引用 弱引用吗_Java对象的强引用、软引用、弱引用和虚引用 笔记

    从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用 使用最普遍的引用.如果一个对象具有强 ...

  6. java的头怎么写_JAVA对象布局之对象头(Object Header)

    由于Java面向对象的思想,在JVM中需要大量存储对象,存储时为了实现一些额外的功能,需要在对象中添加一些标记字段用于增强对象功能 .在学习并发编程知识synchronized时,我们总是难以理解其实 ...

  7. java中对象类型转换_Java 对象类型的转换

    对象类型的转换在Java编程中经常遇到,主要分为向上转型和向下转型,但一定要记住,无论是向上转型还是向下转型,两个类之间必须有继承关系.先来看看基本概念. 向上转型又被称作自动类型转换,就是子类引用的 ...

  8. java list对象排序_Java 对象集合List排序的5种方式

    目标明确 排序对象类 public class Student{ private String name; private Integer age; public Student(String nam ...

  9. java对象序列化克隆_JAVA 对象克隆和序列化

    先用一个例子来说明假克隆吧,也就是用"="之后的效果.. [运行结果]: [运行结果] 姓名:rollen年龄:20 姓名:hello world年龄:100 姓名:hello w ...

最新文章

  1. 【每日DP】day13、P3147 [USACO16OPEN]262144 (区间DP,2048游戏)难度⭐⭐⭐★
  2. [转]通过脚本添加登陆/注销/开机/关机脚本
  3. 突袭HTML5之SVG 2D入门1 - SVG综述
  4. 使用STM32CubeMX,生成STM32F103ZE SPI3 HAL 工程
  5. pdf在html中加载不出来,在网页中打开显示PDF
  6. 像程序员一样思考_如何像程序员一样思考-解决问题的经验教训
  7. html标签 .doc,HTML标签.doc
  8. FormData对象
  9. 大咖来信 | 轮值董事长徐直军,复盘华为AI战略出台始末
  10. 使用include实现布局(layout)复用
  11. JAVASSM框架面试题
  12. 防止sql拼接的Java方法_JAVA程序防止SQL注入的方法
  13. 《杂记》- 之- 使用windows终端命令查看文件的MD5
  14. 硬盘扩容linux重新检查,Linux 无损扩容磁盘
  15. html标题居中加背景色,如何设置CSS背景宽度后让文字居中?
  16. 免费的股票成交额查询接口要到哪里找?
  17. 【python实战】三:古典问题—兔子繁衍
  18. 关闭谷歌更新提示“若要接收后续 google chrome 更新,您需使用 windows 10或更高版本”
  19. 专业的直播APP开发,直播源码讲解
  20. 基于Python的DELMIA二次开发(二):创建产品

热门文章

  1. 解决我的windows不是正版的方法?
  2. lvs mysql 端口_LVS配置及多端口服务配置
  3. vivado 如何创建工程模式_基于Vivado的FPGA高性能开发研修班2019年8月30日上海举行...
  4. python中元祖 字典 列表的区别_Python中元祖,列表,字典的区别
  5. Mybatis源码阅读(二):动态节点解析2.2 —— SqlSourceBuilder与三种SqlSource
  6. c#输入三个数选出最大的_C#写一个输入三个整数,按大到小顺序输出的小程序...
  7. unix环境高级编程 pdf_UNIX环境高级编程——记录锁
  8. c 连接mysql错误信息_使用C语言访问MySQL数据 —— 连接和错误处理
  9. Java LocalDate类| isSupported()方法与示例
  10. 量子物理 詹班 计算机,(电气系计算机系詹班)量子物理作业答案