下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

如何用Java中的Vector进行深层复制

作者:课课家教育     来源: http://www.kokojia.com点击数:1417发布时间: 2016-02-21 16:18:54

标签: Java的继承Java的克隆Java编程

大神带你学编程,欢迎选课

  下面让我们复习一下本章早些时候提出的Vector例子。这一次Int2类是可以克隆的,所以能对Vector进行深层复制:

如何用Java中的Vector进行深层复制_Java的继承_Java的克隆_课课家

  //: AddingClone.java

  // You must go through a few gyrations to

  // add cloning to your own class.

  import java.util.*;

  class Int2 implements Cloneable {

  private int i;

  public Int2(int ii) { i = ii; }

  public void increment() { i++; }

  public String toString() {

  return Integer.toString(i);

  }

  public Object clone() {

  Object o = null;

  try {

  o = super.clone();

  } catch (CloneNotSupportedException e) {

  System.out.println("Int2 can't clone");

  }

  return o;

  }

  }

  // Once it's cloneable, inheritance

  // doesn't remove cloneability:

  class Int3 extends Int2 {

  private int j; // Automatically duplicated

  public Int3(int i) { super(i); }

  }

  public class AddingClone {

  public static void main(String[] args) {

  Int2 x = new Int2(10);

  Int2 x2 = (Int2)x.clone();

  x2.increment();

  System.out.println(

  "x = " + x + ", x2 = " + x2);

  // Anything inherited is also cloneable:

  Int3 x3 = new Int3(7);

  x3 = (Int3)x3.clone();

  Vector v = new Vector();

  for(int i = 0; i < 10; i++ )

  v.addElement(new Int2(i));

  System.out.println("v: " + v);

  Vector v2 = (Vector)v.clone();

  // Now clone each element:

  for(int i = 0; i < v.size(); i++)

  v2.setElementAt(

  ((Int2)v2.elementAt(i)).clone(), i);

  // Increment all v2's elements:

  for(Enumeration e = v2.elements();

  e.hasMoreElements(); )

  ((Int2)e.nextElement()).increment();

  // See if it changed v's elements:

  System.out.println("v: " + v);

  System.out.println("v2: " + v2);

  }

  } ///:~

  Int3自Int2继承而来,并添加了一个新的基本类型成员int j。大家也许认为自己需要再次覆盖clone(),以确保j得到复制,但实情并非如此。将Int2的clone()当作Int3的clone()调用时,它会调用Object.clone(),判断出当前操作的是Int3,并复制Int3内的所有二进制位。只要没有新增需要克隆的句柄,对Object.clone()的一个调用就能完成所有必要的复制——无论clone()是在层次结构多深的一级定义的。

  至此,大家可以总结出对Vector进行深层复制的先决条件:在克隆了Vector后,必须在其中遍历,并克隆由Vector指向的每个对象。为了对Hashtable(散列表)进行深层复制,也必须采取类似的处理。

  这个例子剩余的部分显示出克隆已实际进行——证据就是在克隆了对象以后,可以自由改变它,而原来那个对象不受任何影响。

赞(18)
踩(2)
分享到:
华为认证网络工程师 HCIE直播课视频教程