本篇文章帮大家学习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

java对象克隆的例子_Java对象克隆相关推荐

  1. java对象什么时候回收_Java对象的生命周期与垃圾回收以及四种引用

    创建对象的方式用new语句创建对象. 使用反射,调用java.lang.Class或java.lang.reflect.Constructor的newInstance()实例方法. 调用对象的clon ...

  2. java中存在对多个对象加锁的情况_Java对象锁和类锁全面解析(多线程synchronized关键字)...

    最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...

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

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

  4. java对象的内存结构_JAVA 对象内存结构

    JAVA对象内存结构 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 对象头 markWo ...

  5. java 对象池 博客_Java对象池技术的原理及其实现的小结

    一起学习 Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除.因此,对象的生命周期长度可用如下的表达式表示:T = T1 T2 T3.其中T1表示对象的创建时间,T2表示对象的 ...

  6. java对象的内存结构_Java对象在内存中的结构分析

    问题:在Hotspot JVM中,32位机器下,Integer对象的大小是int的几倍? HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头.实例数据和对齐填充,其中对象头又分为:Mark ...

  7. java 对象被回收的例子_Java对象的后事处理——垃圾回收(二)

    1 先谈Finalize() finalize()能做的所有工作,使用try-finally或者其他方式都可以做得更好.更及时,所以笔者建议大家完全可以忘掉Java语言中有这个方法的存在. --< ...

  8. java对象的初始化顺序_Java对象初始化顺序

    初始化顺序: 1.有无父类? 有: 将父类加载进内存.直到将所有的父类加载完毕.再从顶层父类按照代码的顺序执行静态代码,执行完最顶层的,在执行下一层的,依次类推,直到执行完所有的静态代码. (1)如果 ...

  9. java面向对象计算器怎么写_Java对象简单实用案例之计算器实现代码

    对 Java中的对象与属性,方法的使用,简单写了个案例 import java.util.Scanner; class Calculste { int a; //定义两个整数 int b; Strin ...

最新文章

  1. Xcode 添加代码块
  2. 用css绘制各种形状
  3. 天马行空脚踏实地,阿里巴巴有群百里挑一的天才应届生
  4. linux存储--inode详解(六)
  5. Ubunt16.04 搭建 GPU 显卡驱动 + CUDA9.0 + cuDNN7 详细教程
  6. OpenCASCADE:形状愈合之形状自定义
  7. 数据库开发——MySQL——基本操作
  8. 天才基本法_【书鱼扫文】天才基本法:天才与中国式青春
  9. mysql怎么给表设置查询语句_MySQL查询语句简单操作示例
  10. 大学生信息安全_给大学生的信息
  11. DBCC SHRINKFILE收缩日志/收缩数据库/收缩文件
  12. 学习javascript语言精粹的笔记
  13. 【礼仪大赛策划方案手段】 问穿正装的礼节是什么?到底何为正装?休闲正装?
  14. ELK logstash的grok 自带的正则匹配
  15. java实现文件上传下载功能_java文件上传下载功能实现代码
  16. C语言连连看秒杀辅助
  17. pyqt5和spyder版本对应_pyqt5 spyder 项目 记录
  18. 某农业学校python(七)
  19. 用计算机开3次方,android系统计算器开3次方
  20. 07.尚硅谷网课7-实战练习

热门文章

  1. Android音视频之AudioRecord录音(一)
  2. 文件描述符file descriptor与inode的相关知识
  3. Linux内核中断引入用户空间(异步通知机制)【转】
  4. ***linux下mysql的root密码忘记解决方法
  5. .net source code download
  6. ipad Simulator 的home 键的调用
  7. 高德,百度,Google地图定位偏移以及坐标系转换
  8. Spring高级之注解@Import注解、ImportSelector、ImportBeanDefinitionRegistrar详解(超详细)
  9. java中常用的IO,你可否分得清、流的分类
  10. 机器人softmove_ABB 工业机器人 SoftMove功能介绍