java对象克隆的例子_Java对象克隆
本篇文章帮大家学习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对象克隆相关推荐
- java对象什么时候回收_Java对象的生命周期与垃圾回收以及四种引用
创建对象的方式用new语句创建对象. 使用反射,调用java.lang.Class或java.lang.reflect.Constructor的newInstance()实例方法. 调用对象的clon ...
- java中存在对多个对象加锁的情况_Java对象锁和类锁全面解析(多线程synchronized关键字)...
最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...
- java的头怎么写_JAVA对象布局之对象头(Object Header)
由于Java面向对象的思想,在JVM中需要大量存储对象,存储时为了实现一些额外的功能,需要在对象中添加一些标记字段用于增强对象功能 .在学习并发编程知识synchronized时,我们总是难以理解其实 ...
- java对象的内存结构_JAVA 对象内存结构
JAVA对象内存结构 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 对象头 markWo ...
- java 对象池 博客_Java对象池技术的原理及其实现的小结
一起学习 Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除.因此,对象的生命周期长度可用如下的表达式表示:T = T1 T2 T3.其中T1表示对象的创建时间,T2表示对象的 ...
- java对象的内存结构_Java对象在内存中的结构分析
问题:在Hotspot JVM中,32位机器下,Integer对象的大小是int的几倍? HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头.实例数据和对齐填充,其中对象头又分为:Mark ...
- java 对象被回收的例子_Java对象的后事处理——垃圾回收(二)
1 先谈Finalize() finalize()能做的所有工作,使用try-finally或者其他方式都可以做得更好.更及时,所以笔者建议大家完全可以忘掉Java语言中有这个方法的存在. --< ...
- java对象的初始化顺序_Java对象初始化顺序
初始化顺序: 1.有无父类? 有: 将父类加载进内存.直到将所有的父类加载完毕.再从顶层父类按照代码的顺序执行静态代码,执行完最顶层的,在执行下一层的,依次类推,直到执行完所有的静态代码. (1)如果 ...
- java面向对象计算器怎么写_Java对象简单实用案例之计算器实现代码
对 Java中的对象与属性,方法的使用,简单写了个案例 import java.util.Scanner; class Calculste { int a; //定义两个整数 int b; Strin ...
最新文章
- Xcode 添加代码块
- 用css绘制各种形状
- 天马行空脚踏实地,阿里巴巴有群百里挑一的天才应届生
- linux存储--inode详解(六)
- Ubunt16.04 搭建 GPU 显卡驱动 + CUDA9.0 + cuDNN7 详细教程
- OpenCASCADE:形状愈合之形状自定义
- 数据库开发——MySQL——基本操作
- 天才基本法_【书鱼扫文】天才基本法:天才与中国式青春
- mysql怎么给表设置查询语句_MySQL查询语句简单操作示例
- 大学生信息安全_给大学生的信息
- DBCC SHRINKFILE收缩日志/收缩数据库/收缩文件
- 学习javascript语言精粹的笔记
- 【礼仪大赛策划方案手段】 问穿正装的礼节是什么?到底何为正装?休闲正装?
- ELK logstash的grok 自带的正则匹配
- java实现文件上传下载功能_java文件上传下载功能实现代码
- C语言连连看秒杀辅助
- pyqt5和spyder版本对应_pyqt5 spyder 项目 记录
- 某农业学校python(七)
- 用计算机开3次方,android系统计算器开3次方
- 07.尚硅谷网课7-实战练习
热门文章
- Android音视频之AudioRecord录音(一)
- 文件描述符file descriptor与inode的相关知识
- Linux内核中断引入用户空间(异步通知机制)【转】
- ***linux下mysql的root密码忘记解决方法
- .net source code download
- ipad Simulator 的home 键的调用
- 高德,百度,Google地图定位偏移以及坐标系转换
- Spring高级之注解@Import注解、ImportSelector、ImportBeanDefinitionRegistrar详解(超详细)
- java中常用的IO,你可否分得清、流的分类
- 机器人softmove_ABB 工业机器人 SoftMove功能介绍