- 浏览: 211970 次
- 性别:
- 来自: 北京
文章分类
要想实现某个对象的克隆需要该对象实现java.lang.Cloneable接口。否则单纯调用super.clone()方法会抛出CloneNotSupportedException的异常(运行时异常)。
如下:
public class A {
public void someMethod() {
super.clone();
}
}
如果执行对象的someMethod方法就会抛出异常
jvm在运行java类时,如果发现super.clone()方法,会检查调用super.clone()的方法对应的类是否实现了 Cloneable接口,如果实现了就会开放对应的该对象的clone功能。
如下实例
class CloneTest implements Cloneable{
private String name;
public CloneTest(String name){
this.name = name;
}
//get、set方法
public Object clone() throws Exception{
return super.clone;
}
}
在一个main方法中执行
A a= new A("clone");
A a2= (A)a.clone();
最后结果会是 a和a2的引用指向的堆地址不一样。而里面的成员变量name的值是一样的。
这种克隆是一种浅克隆。
如果成员变量是一个复杂对象(如list,自定义对象),而不是基本数据类型,则修改克隆对象的对象成员变量会影响原有的对象。
因此要实现深度克隆需要做的是
让自定义成员变量对象也支持深度克隆,并重写clone方法
public Object clone(){
//省略try catch
A a= (A)super.clone();
接着对属性进行克隆
a.element = this.element.clone();//假设A对象含有Element自定义对象
对于list类型的成员变量可以实现
新new出一个list,然后将原有的list中的值设置到新list中
}
如下:
public class A {
public void someMethod() {
super.clone();
}
}
如果执行对象的someMethod方法就会抛出异常
jvm在运行java类时,如果发现super.clone()方法,会检查调用super.clone()的方法对应的类是否实现了 Cloneable接口,如果实现了就会开放对应的该对象的clone功能。
如下实例
class CloneTest implements Cloneable{
private String name;
public CloneTest(String name){
this.name = name;
}
//get、set方法
public Object clone() throws Exception{
return super.clone;
}
}
在一个main方法中执行
A a= new A("clone");
A a2= (A)a.clone();
最后结果会是 a和a2的引用指向的堆地址不一样。而里面的成员变量name的值是一样的。
这种克隆是一种浅克隆。
如果成员变量是一个复杂对象(如list,自定义对象),而不是基本数据类型,则修改克隆对象的对象成员变量会影响原有的对象。
因此要实现深度克隆需要做的是
让自定义成员变量对象也支持深度克隆,并重写clone方法
public Object clone(){
//省略try catch
A a= (A)super.clone();
接着对属性进行克隆
a.element = this.element.clone();//假设A对象含有Element自定义对象
对于list类型的成员变量可以实现
新new出一个list,然后将原有的list中的值设置到新list中
}
发表评论
-
JVM启动时指定-Dfile.encoding="UTF8"的作用
2013-10-17 13:50 2293简单来说就是指定JVM默认的编码方式 java io中很多方法 ... -
java多线程 小记
2012-04-15 14:49 0thread join的方法 http://blog.csdn ... -
浅析多线程
2012-04-08 22:35 0线程组 线程是被 ... -
多线程意外中断处理
2012-04-08 20:54 0本文转自:http://peirenlei.iteye.com ... -
多线程项目学习
2012-04-08 20:35 0线程组的作用: ThreadGroup类中的某些方法,可以对线 ... -
java 静态成员变量的内存分配
2012-04-06 10:28 0静态成员变量是属于类变量,即当JVM加载class文件到虚拟机 ... -
修改图片大小并添加水印
2012-03-29 13:47 1268import java.awt.*; import java. ... -
JVM的内存分配
2012-03-16 10:06 0Java里的堆(heap)栈(stack)和方法区(metho ... -
HashMap添加数据的过程
2012-03-14 22:18 7083当添加的元素的key为null ... -
几种classloader的加载范围
2012-02-28 12:43 1313Bootstrap class loader:最顶级的clas ... -
利用正则表达式获取网页中多处重复出现的标签数据
2012-02-21 11:21 2699public static void main(String[ ... -
标准的URLConnection请求
2012-01-13 16:39 0只写了主要的代码 URL url = new URL(urlS ... -
常用的ClassLoader的加载范围
2012-01-13 13:53 1397WebAppClassLoader装载器装作文件的范围: 会加 ... -
ClassLoader.getSystemClassLoader().loadClass()和Class.forName()的区别
2012-01-13 13:08 0class A { static { System.ou ... -
httpClient超时解决办法
2012-01-12 16:47 0DefaultHttpClient: 请求超时 httpcli ... -
项目中的使用技巧小记
2012-01-10 21:11 580实现数据在多线程之间的共享: 因为线程的成员变量是各个该线程实 ... -
ThreadLocal
2012-01-10 08:55 1408ThreadLocal是实现线程范围内的数据共享,即不同线程获 ... -
线程加锁优化
2012-01-08 13:19 0实际上,在某些classes中,这种instance方法的同步 ... -
实现多线程使用继承Thread类和Runnable的原因
2012-01-03 15:09 1376我们都知道实现多线程的两种方式,一种是继承Thread类,另一 ... -
一个简单的socket编程实例
2011-12-28 10:50 1607转正于http://www.cnblogs.com/linzh ...
相关推荐
NULL 博文链接:https://gegeyi.iteye.com/blog/1562016
本篇文章是对JAVA深度克隆与浅度克隆的区别进行了详细的分析介绍,需要的朋友参考下
Java克隆(Clone)是Java语言的特性之一,本篇文章主要介绍了Java中的Clone机制是如何工作的,需要的朋友可以参考下
主要给大家介绍了关于JavaScript浅层克隆与深度克隆的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
深拷贝-ts 用于 typescript/javascript 的递归深拷贝、克隆和浅拷贝函数基于 MIT 和 LGPL 许可证可用。
android 浅复制和深复制-Java Generic Deep Copy 篇
主要介绍了Java编程实现对象克隆(复制)代码详解,涉及了克隆的原因,如何实现克隆,克隆的一般步骤,深克隆与浅克隆的介绍等相关内容,具有一定借鉴价值,需要的朋友可以参考下。
今天上班在班车上和一个同事讨论有关C#拷贝效率的问题,聊到了多种深度拷贝方法,其中就提到了一种Lambda表达式拷贝的方法,这位同事说这种深度拷贝快是快但是如果对象里面再嵌入对象就不能深度拷贝了,只进行浅拷贝...
浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用. 深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.
C++对象的浅复制和深复制详解及简单实例 浅复制:两个对象复制完成后共享某些资源(内存),其中一个对象的销毁会影响另一个对象 深复制:两个对象复制完成后不会共享任何资源,其中一个对象的销毁不会影响另一个...
•深拷贝(深度克隆):不仅复制对象的值类型字段,同时也复制原对象中的对象.就是说完全是新对象产生的. 浅拷贝和深拷贝之间的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复
对象的克隆——原型模式,复杂对象的组装与创建——建造者模式,不兼容结构的协调——适配器模式,处理多维度变化——桥接模式,树形结构的处理——组合模式,扩展系统功能——装饰模式,深入浅出外观模式,实现对象...
《git权威指南》是git...第8篇介绍了git的跨平台操作,以及它的钩子和模板、稀疏检出和浅克隆、嫁接和替换等重要特性。第9篇是附录,详细给出了git的命令索引,以及cvs、svn和hg与git的比较与命令对照,方便读者查阅。
《git权威指南》是git...第8篇介绍了git的跨平台操作,以及它的钩子和模板、稀疏检出和浅克隆、嫁接和替换等重要特性。第9篇是附录,详细给出了git的命令索引,以及cvs、svn和hg与git的比较与命令对照,方便读者查阅。
浅克隆 去抖动 风门 深度平等 得到 getOr 浅相等 浅冻 deepFroze 记住 getType isTypeOf 新的 无极 无极种族 睡觉 独特 唯一的 applyMiddleware 撰写 对象创建 对象分配 种类 插入/拼接
算法的封装与切换——策略模式(四) 模板方法模式-Template Method Pattern 模板方法模式深度解析(一) 模板方法模式深度解析(二) 模板方法模式深度解析(三) 访问者模式-Visitor Pattern 操作复杂对象结构——...
深度复制ES6类型的实用程序。 以下是受支持的类型, 杰森对象 数字 细绳 布尔型 地图 放 日期 大批 所有其他类型将被浅复制。 入门 克隆仓库 使用“ npm测试”运行测试 先决条件 节点5.4.0及更高版本 ES6中的示例...
如果克隆存储库时间太长,您可以进行浅克隆或减少克隆深度,而不是克隆整个历史记录。 由于我也推送了二进制地图和活动文件的历史记录,因此历史记录变得相当大。 模型、纹理和声音资源不是这个存储库的一部分。 ...
repo init -u https://github.com/ZenX-OS/android_manifest.git -b 11.1 或者如果带宽不多,可以进行浅表克隆 repo init -u https://github.com/ZenX-OS/android_manifest.git -b 11 --depth=1 浅克隆可让您仅提取...