`

java深克隆与浅克隆

    博客分类:
  • java
 
阅读更多
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 深克隆与浅克隆 Java 中的克隆机制可以让我们方便地制造出一个对象的副本来,但是在克隆过程中需要注意浅克隆和深克隆的区别。 浅克隆(Shallow Clone)是指对对象的域进行简单的 copy,对象的reference变量...

    java 深克隆 浅克隆

    在Java编程语言中,克隆是...理解深克隆和浅克隆的概念对于编写复杂的、性能敏感的Java程序至关重要,尤其是在处理大量对象或需要保持数据独立性时。根据具体需求选择合适的克隆策略,可以提高代码的灵活性和可维护性。

    java 深克隆浅克隆

    Java提供了两种主要的克隆方式:深克隆和浅克隆。 1. 浅克隆(Shallow Clone): 浅克隆是通过调用对象的`clone()`方法来实现的,这个方法是Object类提供的。当一个对象被浅克隆时,新创建的对象将拥有原始对象的...

    JAVA浅克隆与深克隆

    测试类`Test.java`可以用来验证浅克隆和深克隆的效果,比如改变克隆对象的属性并检查原始对象是否受影响。 总结来说,Java中的克隆机制对于复制对象和维护对象状态的独立性至关重要。浅克隆适用于不涉及复杂引用...

    Java对象的深克隆与浅克隆详解.zip(wcb2003)

    Java提供了两种主要的克隆方式:浅克隆(Shallow Clone)和深克隆(Deep Clone)。下面我们将深入探讨这两种克隆方法。 ### 浅克隆 浅克隆是指创建一个新的对象,其成员变量的值与原对象相同,但引用类型成员变量...

    java的深度克隆的例子

    首先,Java提供了两种基本的克隆方式:浅克隆(shallow clone)和深克隆。浅克隆仅仅复制对象本身,而不复制对象所引用的对象。而深克隆则会递归地复制对象及所有引用的对象,确保新创建的对象和原始对象及其引用的...

    java 对象的克隆(浅克隆和深克隆)

    在Java中,有两种主要的克隆方式:浅克隆(Shallow Clone)和深克隆(Deep Clone)。接下来,我们将详细讨论这两种克隆方式及其区别。 1. 对象的浅克隆: 浅克隆是指创建一个新对象,这个新对象复制了原对象的所有...

    实例分析java对象中浅克隆和深克隆

    浅克隆和深克隆在Java对象中的应用 在Java编程语言中,克隆(Clone)是一种常见的对象复制机制。克隆可以分为浅克隆(Shallow Clone)和深克隆(Deep Clone)两种。浅克隆仅复制对象的引用,而深克隆则完全复制对象...

    克隆和序列化(Java )

    在Java中,克隆分为浅克隆和深克隆。浅克隆只是复制对象的引用,而深克隆则会创建对象以及所有嵌套对象的新副本。 2. **浅克隆**:通过实现`Cloneable`接口并重写`Object`类的`clone()`方法,可以实现浅克隆。浅...

    Java浅克隆与深克隆

    Java中的浅克隆和深克隆是对象复制的两种方式,它们主要区别在于对对象内部引用类型字段的处理。在Java中,实现克隆通常需要重写`Object`类的`clone()`方法。 **浅克隆(Shallow Clone)** 浅克隆创建一个新对象,...

    Java中的克隆(Clone)机制

    - **浅克隆与深克隆的选择**:根据对象中字段的类型来决定使用哪种克隆方式。如果对象中包含引用类型字段,且这些字段的值需要独立,那么应选择深克隆。否则,如果只关心基本类型字段的复制,浅克隆就足够了。 - *...

    Java深复制与浅复制.doc

    1. **浅复制(浅克隆)**: 浅复制是指创建一个新对象,这个新对象包含了原对象的所有字段的值,但对引用类型的字段只是复制了引用,而不是复制引用的对象本身。也就是说,新对象和原对象引用了同一块内存区域。如果...

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...

    java 对象克隆

    一、浅克隆与深克隆 在Java中,克隆分为两种类型:浅克隆(Shallow Clone)和深克隆(Deep Clone)。浅克隆创建的新对象只复制了原对象的引用,这意味着如果原对象中包含可变的引用类型,如数组或复杂的数据结构,...

    Java深复制与浅复制&Clone

    在Java编程语言中,对象复制是一个常见的操作,...理解并正确使用浅复制和深复制对于开发高效、健壮的Java应用程序至关重要。在处理复杂的数据结构时,应根据需求选择合适的复制策略,以避免不必要的副作用和数据污染。

    Java对象的复制克隆

    Java中的对象复制与克隆是程序开发中常见的需求,主要用于创建一个对象的副本,而不会影响原始对象的状态。这里主要讨论两种类型的对象拷贝:浅拷贝和深拷贝。 浅拷贝,也称为表面拷贝,是创建一个新的对象,然后将...

    JAVA_对象克隆

    二、浅克隆与深克隆 1. 浅克隆:默认的`clone()`方法执行的是浅克隆,它创建的新对象只复制原始对象的基本数据类型字段,对于引用类型的字段,新对象和原始对象共享同一个引用。这意味着对引用对象的修改会影响到...

    浅拷贝(浅复制、浅克隆)、深拷贝(深复制、深克隆)实战工程

    在编程领域,尤其是在Java语言中,对象的复制是常见的操作,这涉及到两个主要概念:浅拷贝(浅复制、浅克隆)和深拷贝(深复制、深克隆)。这两个概念是理解对象生命周期和内存管理的关键部分。下面将详细阐述它们的...

Global site tag (gtag.js) - Google Analytics