java克隆(Clone)

来源:互联网 发布:胡雅婷 知乎 编辑:程序博客网 时间:2024/05/05 16:12

          一直以来,都是只知道java有这么个东西,就是在实际应用中没有使用过。写了个小东西 再次掌握一下Clone,包括基本数据类型的Clone和非基本类型的深层Clone.

//Class A 简单数据类型拷贝.

      class A implements java.lang.Cloneable        
{
  int iCount;
  String data;
  public A()
  {
   
  }
  public void set(int icount,String str)
  {
    iCount=icount;
    data=str;
   
  }
  public void print()
  {
    System.out.println(iCount+" String data:"+data);
  }
  public Object clone()
  {
    try
    {
      Object o=super.clone();
      return o;
    }catch(Exception ex)
    {
      ex.printStackTrace();
    }
    return null;
  }

}

//Class B 带Vector 的深层拷贝

class B implements Cloneable
{
  String sData;
  Vector vData;
 
  public B()
  {
    sData=new String("Class B");
    vData=new Vector(3);
    vData.add(null);
    vData.add(null);
    vData.add(null);
  }
 
  public void setVectorData(String str)
  {
    for(int i=0;i<3;i++)
    {
      vData.set(i,str);
    }
  }
 
  public void print()
  {
    System.out.println("----------------------------");
    System.out.println("Class name:"+ sData);
    for (int i = 0; i < vData.size(); i++) {
      System.out.println((String)vData.elementAt(i));
    }
    System.out.println("----------------------------");
  }
 
  public Object clone()
  {
    Object o=null;
    B b=null;
    try
    {
      Vector v=new Vector();
      for(int i=0;i<vData.size();i++)
      {
        v.add(vData.elementAt(i));   
      }
      o=super.clone();
      b=(B)o;
      b.vData=v;
    }catch(Exception ex)
    {
      ex.printStackTrace();
    }
    return b;
  }

}

//Class C 内部元素是类的深层拷贝,与B 原理一致只是加深理解.哈哈

class C implements Cloneable
{
  A a;
  B b;
 
  public C()
  {
  }
  public void set(A a1,B b1)
  {
    a=a1;
    b=b1;
  }
  public void print()
  {
    System.out.println("******  print Class c'data   **********");
    a.print();
    b.print();
  }
 
  public Object clone()
  {
    Object o = null;
    try {
      o = super.clone();
      A clonedA=(A)a.clone();
      B clonedB=(B)b.clone();
      C c=(C)o;
      c.a=clonedA;
      c.b=clonedB;
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
    return o;

}
 

//测试用类

package testclone;
import java.util.Vector;
/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2007</p>
 * <p>Company: </p>
 * @author 阿笨

 * @version 1.0
 */

public class mainApp {
  public mainApp() {
  }

  public static void main(String[] args)
  {

//以下为测试 类A 和B  拷贝成功与否
    A a=new A();
    a.set(10,"Hello");
    A b=a;
    a.print();
    b.print();
    
    A c=(A)a.clone();
    b.set(20,"World");
    c.set(30,"Clone Class");
   
    a.print();
    b.print();
    c.print();
     B  b1=new B();
     B  b2;
     B  b3;
     b2=b1;
     b1.print();
     b2.print();
     b2.setVectorData("SSSS");
     b1.print();
     b2.print();
   
     b3=(B)b1.clone();
     System.out.println("Clone data");
     b3.sData="Class B Cloned";
     b3.print();
    
     System.out.println("Change Data in Vector! ");
     b2.setVectorData("DDDDD");
     b1.print();
     b2.print();
     b3.print();
//以下为测试C 成功与否的代码
//    A a=new A();
//    a.set(10,"Hello");
//    B  b=new B();
//    b.setVectorData("BBBBBBBB");
//   
//    C c1=new C();
//    c1.set(a,b);
//   
//    C c2=(C)c1.clone();
//    c1.print();
//    c2.print();
//   
//    b.setVectorData("CCCCCCCCC");
//    c1.print();
//    c2.print();
  }
}
}

哈哈....

Source Code 就是如此了.

不知道有没有问题.等读者纠正吧!

 

原创粉丝点击