- 浏览: 216839 次
- 性别:
- 来自: 北京
文章分类
要想实现某个对象的克隆需要该对象实现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 2413简单来说就是指定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 1330import java.awt.*; import java. ... -
JVM的内存分配
2012-03-16 10:06 0Java里的堆(heap)栈(stack)和方法区(metho ... -
HashMap添加数据的过程
2012-03-14 22:18 7141当添加的元素的key为null ... -
几种classloader的加载范围
2012-02-28 12:43 1379Bootstrap class loader:最顶级的clas ... -
利用正则表达式获取网页中多处重复出现的标签数据
2012-02-21 11:21 2741public static void main(String[ ... -
标准的URLConnection请求
2012-01-13 16:39 0只写了主要的代码 URL url = new URL(urlS ... -
常用的ClassLoader的加载范围
2012-01-13 13:53 1440WebAppClassLoader装载器装作文件的范围: 会加 ... -
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 618实现数据在多线程之间的共享: 因为线程的成员变量是各个该线程实 ... -
ThreadLocal
2012-01-10 08:55 1453ThreadLocal是实现线程范围内的数据共享,即不同线程获 ... -
线程加锁优化
2012-01-08 13:19 0实际上,在某些classes中,这种instance方法的同步 ... -
实现多线程使用继承Thread类和Runnable的原因
2012-01-03 15:09 1407我们都知道实现多线程的两种方式,一种是继承Thread类,另一 ... -
一个简单的socket编程实例
2011-12-28 10:50 1639转正于http://www.cnblogs.com/linzh ...
相关推荐
在Java中,深度克隆与浅克隆的区别在于处理对象内部引用的复杂性。浅克隆只复制对象本身,而不复制它所引用的对象,而深度克隆则会递归地复制对象及其引用的所有子对象。 当对象包含复杂的数据结构,如集合或嵌套的...
1. **确保数据独立性**:深度克隆可以创建出与原对象完全独立的新对象,即使修改新对象也不会影响到原对象。 2. **避免副作用**:在多线程环境下,深度克隆有助于避免因共享对象而导致的数据竞争问题。 3. **提高...
JavaScript中的浅层克隆与深度克隆是两种不同的对象复制方式,它们主要处理对象和数组这类引用类型的数据。这两种克隆方法的区别在于处理对象内部引用值的方式,即对堆内存中对象的复制程度。 1. **浅层克隆**: ...
克隆分为两种主要类型:浅克隆(Shallow Clone)和深克隆(Deep Clone)。这篇博客文章将探讨这两种克隆方式以及如何在Java中实现它们。 首先,我们来理解一下浅克隆。浅克隆是通过调用对象的`clone()`方法创建一个...
深度克隆,也称为完全克隆,是指创建一个与原对象相同的新对象,不仅复制原对象的所有属性,还复制了原对象中引用的对象。这通常用于创建一个独立于原对象的新实例,即使原对象发生改变,新对象也不会受到影响。下面...
2. **深度克隆与浅克隆** - **浅克隆**:仅复制对象的引用,而不是对象的实例变量。这意味着,如果原对象包含其他对象的引用,克隆后的对象也会引用同一内存地址的对象,改变其中一个会影响另一个。 - **深度克隆*...
首先,我们需要理解深度克隆和浅克隆的区别。浅克隆只是复制对象的引用,而不是实际的对象内容,因此,如果对象中包含其他对象的引用,这些引用在原始对象和克隆对象之间是共享的。而深度克隆则会递归地复制对象及其...
3. 序列化与反序列化:深度克隆需要对象实现`Serializable`接口,否则无法进行序列化操作。同时,需要注意的是,序列化可能会抛出`IOException`和`ClassNotFoundException`,需要进行异常处理。 4. 性能开销:深度...
在Java中,克隆分为两种类型:浅克隆(Shallow Clone)和深度克隆(Deep Clone)。 1. 浅克隆(Shallow Clone) 浅克隆是Java克隆机制的默认行为。当一个对象被克隆时,如果它的成员变量是基本类型(如int、double...
实现深克隆通常需要自定义实现,因为Java的`clone()`方法不支持自动深度克隆。一种常见的实现方法是序列化和反序列化对象。首先,将对象序列化为字节数组,然后从字节数组反序列化为新的对象。这种方法可以保证所有...
克隆分为两种主要类型:深克隆和浅克隆。理解这两种克隆的区别是Java面向对象编程中的重要概念。 ### 1. 浅克隆(Shallow Clone) 浅克隆是通过实现`Cloneable`接口并覆盖`Object`类中的`clone()`方法来实现的。当...
相比之下,深度克隆会递归地复制所有层级的属性,包括嵌套的对象和数组,确保新副本与原对象是完全独立的。 同构(Isomorphic)意味着这个深度克隆函数可以在客户端和服务器端(如Node.js)上运行,不依赖特定的...
JavaScript对象的深度克隆是一种创建一个全新对象的过程,这个新对象与原始对象具有相同的数据结构,包括嵌套的对象和数组,但所有数据都是独立的副本,不会因为原对象的修改而受到影响。在JavaScript中,浅克隆只...
这样新对象与原对象及其所有嵌套属性在内存中都是分离的,修改新对象不会影响到原对象。在JavaScript中,可以使用JSON的`parse()`和`stringify()`方法,或者第三方库如lodash的`_.cloneDeep()`来实现深拷贝。 "deep...
当对象的属性值是复杂的数据类型(如其他对象或数组)时,浅克隆只会复制引用,而不是创建深度副本。例如: ```javascript const original = { prop: { nestedProp: 'value' } }; const cloned = shallowClone...
在JavaScript中,DOM(Document...然而,需要注意的是,深度克隆也会复制节点上的所有属性和事件监听器,可能会导致性能问题,特别是在处理大量或复杂的DOM结构时。因此,在使用时应根据具体需求权衡是否需要深度克隆。
JavaScript深度克隆是一种在编程中复制对象或数组的方式,它不仅复制了基本类型的数据,还复制了引用类型的数据,确保新复制的对象与原始对象在内存中是完全独立的。在JavaScript中,浅克隆和深克隆是两个重要的概念...