`
菜鸟2号
  • 浏览: 6885 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java中的Clone

    博客分类:
  • J2SE
阅读更多

Java Clone

1.克隆的概念
    A:
浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 

   注:Object类里的clone方法是浅复制(浅克隆)
    B:
深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。 

   C: Clone的公约
        1. x.clone() != x // x.clone() will return a new object

        2. x.clone().equals(x) // this is the meaning of ‘copy’

        3. x.clone().getClass() == x.getClass() 


        4. The object returned by clone method should be independent of the object (which is  
            being cloned).

 

 

 

      These are not absolute requirements but are general intends of clone method which is also recommended in Java

        Documents.

2.对象克隆的两种方式
A.我们可以利用Object类的clone()方法,必须要遵循下面三点 
     (1)
在派生类中覆盖基类的clone()方法,并声明为public Object类中的clone()方法为protected的】。 
     (2)
在派生类的clone()方法中,调用super.clone() 
     (3)
在派生类中实现Cloneable接口。

     被克隆的类必须自己实现Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。Cloneable 接口实际上是个标识接口,没有任何接口方法。实现Cloneable接口的类应该使用公共方法重写 Object.clone(它是受保护的)。某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。在Java.lang.Object类中克隆方法是这么定义的:

protected Object clone()  throws CloneNotSupportedException

创建并返回此对象的一个副本。表明是一个受保护的方法,同一个包中可见。按照惯例,返回的对象应该通过调用 super.clone 获得。

如果没有实现Cloneable 接口,调用clone()方法时会抛出CloneNotSupportedException异常。

a. Class A成员变量类型是java的基本类型时(外加String类型,因为在javaString被写成了一个不可更改的类(immutable class),在所有String类中的函数都不能更改自身的值,每次对String的操作都是生成新的对象,而这些操作如果没有赋值就不存在任何意义

public class A implements Cloneable {  
    public String name;  
  
    public Object clone() {  
        A o = null;  
        try {  
            o = (A) super.clone();  
        } catch (CloneNotSupportedException e) {  
            e.printStackTrace();  
        }  
        return o;  
    }  
  
}  

 

 

 

b. ClassA成员变量类型是对象时(包括数组(基本类型数组,数组自实现了clone方法),集合(基本类型集合))

 

public class B implements Cloneable {
public String name; 

public Object clone() {  
        B o = null;  
        try {  
            o = (B) super.clone(); //当然Class B也要实现相应clone方法  
        } catch (CloneNotSupportedException e) {  
            e.printStackTrace();  
        }  
        return o;  
    }  
}

public class A implements Cloneable { 
        public String name; 
        public String[] group = new String[2]; 
        public B b;

        public Object clone() { 
              A o = null; 
              try { 
                   o = (A) super.clone(); 
                   o.group = (String[])group.clone(); 
                   o.b = (B)b.clone();
              } catch (CloneNotSupportedException e) { 
                      e.printStackTrace(); 
              } 
              return o; 
        }
}

 

c. Class A存在更为复杂的成员变量时,如非基本类型数组和基本类型集合时。

 

 

public class B implements Cloneable {
     public String name; 

     public Object clone() {  
         B o = null;  
         try {  
               o = (B) super.clone();  
       } catch (CloneNotSupportedException e) {  
           e.printStackTrace();  
         }  
      return o;  
     }  
}

public class A implements Cloneable {  
    public String name[];  
    public Vector<B> claB;  
      
    public A(){  
        name=new String[2];  
        claB=new Vector<B>();  
    }  
  
    public Object clone() {  
        A o = null;  
        try {  
            o = (A) super.clone();  
            o.name==(String[])name.clone();//深度clone  
            o.claB=new Vector<B>();//将clone进行到底  
            for(int i=0;i<claB.size();i++){  
                B temp=(B)claB.get(i).clone();//当然Class B也要实现相应clone方法  
                o.claB.add(temp);  
            }  
        } catch (CloneNotSupportedException e) {  
            e.printStackTrace();  
        }  
                return o;  
    }  
}  

 

关于数组集合,数组的话就克隆了数组的引用,集合的话就集合容器而已,其中的元素未克隆,说的好像不太清楚,心里懂但是说不清楚真是着急。

总结一下其实克隆每次只克隆对象本身(基本类型),引用类型只克隆引用,不会克隆引用的内容。

 

B. 利用序列化来做深复制,把对象写到流里的过程是序列化(Serilization)过程,而把对象从流中读出来的过程则叫做反序列化(Deserialization)过程。应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。,利用这个特性,可以做深拷贝。

 

public class A implements Cloneable, Serializable {
public String name;

public Object deepCopy() throws IOException {
    Object obj = null;
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bos);
    oos.writeObject(this);
    ByteArrayInputStream bis = new ByteArrayInputStream (bos.toByteArray());
    ObjectInputStream ois = new ObjectInputStream(bis);
    obj = ois.readObject();
    return obj;
}

 

分享到:
评论

相关推荐

    Java中clone方法共6页.pdf.zip

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个方法来源于`java.lang.Object`类,所有Java类都默认继承了这个方法。本资料"Java中clone方法共6页.pdf.zip"可能包含了关于...

    java中clone的用法实例

    clone的用法 希望有帮助,仅供参考 通过例子的分析,可以对克隆的方法有所深入了解

    java 中clone()的使用方法

    Java 中 clone() 的使用方法 Java 中的 clone() 方法是对象的复制方法,其主要作用是创建一个与原对象相同的新对象。下面将详细介绍 Java 中 clone() 方法的使用方法。 什么是 clone() 方法? clone() 方法是 ...

    Java clone方法使用

    详细的描述了Java中 clone方法使用

    java_clone用法

    ### Java中的`clone`方法详解:浅拷贝与深拷贝 #### 一、引言 在Java中,`clone`方法提供了一种快速复制对象的方式。它属于`Object`类的一部分,但需要显式地在子类中声明并实现`Cloneable`接口才能正常使用。本文...

    Java中的clone方法详解_动力节点Java学院

    Java中的clone方法详解_动力节点Java学院,动力节点口口相传的Java黄埔军校

    Java深浅clone

    在Java编程语言中,`Cloneable`接口和`clone()`方法是两个重要的概念,它们用于对象复制。在本文中,我们将深入探讨Java中的浅克隆(shallow clone)和深克隆(deep clone),并结合测试代码进行分析。 首先,让...

    浅析Java中clone()方法浅克隆与深度克隆

    Java中的克隆(Clone)机制是面向对象编程中一种创建对象副本的方法,它允许程序员创建一个已有对象的新实例,新实例的数据与原对象相同。在Java中,克隆分为两种类型:浅克隆(Shallow Clone)和深度克隆(Deep ...

    java clone的小例子

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...

    java clone

    在Java编程语言中,`clone`是一个非常重要的概念,它涉及到对象复制和对象克隆。本文将深入探讨Java中的`clone`方法,包括其工作原理、使用场景、注意事项以及一些个人实践心得。 首先,让我们理解什么是`clone`。...

    java Clone

    Java中的`clone`方法是Java语言提供的一种复制对象的方式,它允许创建一个对象的副本,这个副本与原对象具有相同的属性值,但它们是两个独立的对象,修改副本不会影响原对象。`clone`方法存在于Java的`java.lang....

    Java中的克隆(Clone)机制

    在Java编程语言中,克隆(Clone)机制是一种创建对象副本的方法,它允许开发者创建一个已有对象的新实例,这个新实例与原对象具有相同的属性值,但却是两个独立的对象,彼此的操作不会互相影响。克隆机制在某些情况...

    java中的指针,引用及对象的clone

    Java中的对象克隆可以通过实现`Cloneable`接口并覆盖`clone()`方法来完成。对象的克隆分为浅拷贝和深拷贝两种形式。 **1. 浅拷贝** 浅拷贝是指创建一个新的对象,然后将原对象的所有非引用类型的成员变量复制到新...

    java code clone

    Java代码克隆,通常指的是在编程过程中,两个或多个代码段具有相似或完全相同的功能,这种现象被称为代码重复或代码克隆。在大型项目中,代码克隆可能会导致维护困难、增加bug出现的可能性以及降低代码的可读性和可...

    Java的clone方法[归类].pdf

    Java的`clone()`方法在软件开发中扮演着重要的角色,特别是在需要复制对象的场景下。在Java中,对象的复制并非像C++等语言中的指针复制那样简单,因为Java中没有指针的概念,而是使用引用。这导致了在默认情况下,...

    Java中的clone方法详解_动力节点Java学院整理

    Java中的clone方法详解 在Java语言中,clone方法是一个非常重要的概念,它允许对象被复制,从而创造出一个新的对象。下面我们将详细介绍Java中的clone方法,并讨论它的实现机制和应用场景。 什么是clone方法 ...

    如何通过JVM角度谈谈Java的clone操作

    Java中的对象创建主要有两种方式,即使用`new`操作符创建新对象以及通过`clone`方法复制已有对象。本文将从JVM的角度深入探讨Java的`clone`操作,揭示其工作原理及其潜在的问题。 首先,让我们理解`clone`方法的...

Global site tag (gtag.js) - Google Analytics