ClassA a = new ClassA(); ClassA b = a;
上述两条语句,b对象直接引用了a对象,如果ClassA里面有其他属性,则a和b由于是同一个对象,所以属性的值也是一样的。假如现在我们需要一个和a一样的对象,即复制,这时候比较无脑的做法是new一个ClassA,然后把a对象里面的属性全部无脑拷贝到新建的对象c里面。
但是上述的方法真的有效吗?
不是的。如果a对象里面的属性全是基础类型int,byte,string等,那到时能实现这样的复制目的。但是如果a对象里面的属性也是对象,那么修改c对象的属性,则a对象的对应属性也是会被修改的。
ClassA a = new ClassA(); ClassA c = new ClassA(); c.cla=a.cla; //此时修改a.cla,那么c.cla也会被修改 class ClassA{ public ClassB cla; }
java克隆方法:深度克隆与浅层克隆
浅层克隆,不需要向上述方法那样重新new一个新对象,再把对象的属性无脑照搬。
实现方法:
1、克隆对象的类实现cloneable接口
2、重写clone方法
public class A implements Cloneable{ public B b ; //重写clone方法 public Object clone(){ Object o = null; try { o= super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return o; } }
clone方法是object类的native方法,该native方法具体是做什么并没细查,只知道该native方法实现的功能与刚才上面的实现无脑克隆方法是一样的,new一个新对象,并把属性复制过去。该方法也是没能解决问题,但是代码量也就少了很多。接下来介绍深度克隆方法。
深度克隆有两种实现方式,一种是用流的形式,另外一种是根据浅克隆,对其属性也进行克隆来达到深度克隆的效果。
1、流的形式:要复制的类要实现序列化,包括类的属性。
public class A implements Serializable{ public B b ; public A getCopy(){ ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); A o =(A) ois.readObject(); return o; } } A a = new A(); A c = a.getCopy(); //此时a对象与c对象是不同对象,包含的属性虽然值相同,但是也是不同对象。
2、clone方式
public Class B implements Cloneable{ public Object clone(){ //try catch return super.clone(); } } //同时在A的clone方法添加上属性的clone /** *A类里 */ public Object clone(){ A o =null; o=(A)super.clone; o.b=b.clone(); } //有多少属性不是基础类型的都要这样子搞,也能达到深度克隆的效果
对比深度克隆的两种实现方法的效果,两种方法都不是很方便,流的方法每个属性都要实现序列化。而clone方法不止需要实现cloneable接口,还得再clone方法里即对本身克隆,又要对属性进行克隆,十分不便。而时效性方面,clone方法要比实现流的方法快速的多,所以总结,一般不要进行深度克隆。
相关推荐
Java 深克隆与浅克隆 Java 中的克隆机制可以让我们方便地制造出一个对象的副本来,但是在克隆过程中需要注意浅克隆和深克隆的区别。 浅克隆(Shallow Clone)是指对对象的域进行简单的 copy,对象的reference变量...
在Java编程语言中,克隆是...理解深克隆和浅克隆的概念对于编写复杂的、性能敏感的Java程序至关重要,尤其是在处理大量对象或需要保持数据独立性时。根据具体需求选择合适的克隆策略,可以提高代码的灵活性和可维护性。
Java提供了两种主要的克隆方式:深克隆和浅克隆。 1. 浅克隆(Shallow Clone): 浅克隆是通过调用对象的`clone()`方法来实现的,这个方法是Object类提供的。当一个对象被浅克隆时,新创建的对象将拥有原始对象的...
测试类`Test.java`可以用来验证浅克隆和深克隆的效果,比如改变克隆对象的属性并检查原始对象是否受影响。 总结来说,Java中的克隆机制对于复制对象和维护对象状态的独立性至关重要。浅克隆适用于不涉及复杂引用...
Java提供了两种主要的克隆方式:浅克隆(Shallow Clone)和深克隆(Deep Clone)。下面我们将深入探讨这两种克隆方法。 ### 浅克隆 浅克隆是指创建一个新的对象,其成员变量的值与原对象相同,但引用类型成员变量...
首先,Java提供了两种基本的克隆方式:浅克隆(shallow clone)和深克隆。浅克隆仅仅复制对象本身,而不复制对象所引用的对象。而深克隆则会递归地复制对象及所有引用的对象,确保新创建的对象和原始对象及其引用的...
在Java中,有两种主要的克隆方式:浅克隆(Shallow Clone)和深克隆(Deep Clone)。接下来,我们将详细讨论这两种克隆方式及其区别。 1. 对象的浅克隆: 浅克隆是指创建一个新对象,这个新对象复制了原对象的所有...
浅克隆和深克隆在Java对象中的应用 在Java编程语言中,克隆(Clone)是一种常见的对象复制机制。克隆可以分为浅克隆(Shallow Clone)和深克隆(Deep Clone)两种。浅克隆仅复制对象的引用,而深克隆则完全复制对象...
在Java中,克隆分为浅克隆和深克隆。浅克隆只是复制对象的引用,而深克隆则会创建对象以及所有嵌套对象的新副本。 2. **浅克隆**:通过实现`Cloneable`接口并重写`Object`类的`clone()`方法,可以实现浅克隆。浅...
Java中的浅克隆和深克隆是对象复制的两种方式,它们主要区别在于对对象内部引用类型字段的处理。在Java中,实现克隆通常需要重写`Object`类的`clone()`方法。 **浅克隆(Shallow Clone)** 浅克隆创建一个新对象,...
- **浅克隆与深克隆的选择**:根据对象中字段的类型来决定使用哪种克隆方式。如果对象中包含引用类型字段,且这些字段的值需要独立,那么应选择深克隆。否则,如果只关心基本类型字段的复制,浅克隆就足够了。 - *...
1. **浅复制(浅克隆)**: 浅复制是指创建一个新对象,这个新对象包含了原对象的所有字段的值,但对引用类型的字段只是复制了引用,而不是复制引用的对象本身。也就是说,新对象和原对象引用了同一块内存区域。如果...
java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...
一、浅克隆与深克隆 在Java中,克隆分为两种类型:浅克隆(Shallow Clone)和深克隆(Deep Clone)。浅克隆创建的新对象只复制了原对象的引用,这意味着如果原对象中包含可变的引用类型,如数组或复杂的数据结构,...
在Java编程语言中,对象复制是一个常见的操作,...理解并正确使用浅复制和深复制对于开发高效、健壮的Java应用程序至关重要。在处理复杂的数据结构时,应根据需求选择合适的复制策略,以避免不必要的副作用和数据污染。
Java中的对象复制与克隆是程序开发中常见的需求,主要用于创建一个对象的副本,而不会影响原始对象的状态。这里主要讨论两种类型的对象拷贝:浅拷贝和深拷贝。 浅拷贝,也称为表面拷贝,是创建一个新的对象,然后将...
二、浅克隆与深克隆 1. 浅克隆:默认的`clone()`方法执行的是浅克隆,它创建的新对象只复制原始对象的基本数据类型字段,对于引用类型的字段,新对象和原始对象共享同一个引用。这意味着对引用对象的修改会影响到...
在编程领域,尤其是在Java语言中,对象的复制是常见的操作,这涉及到两个主要概念:浅拷贝(浅复制、浅克隆)和深拷贝(深复制、深克隆)。这两个概念是理解对象生命周期和内存管理的关键部分。下面将详细阐述它们的...