用Vector进行深层复制2007-05-29 yycnet.yeah.net yyc译下面让我们复习一下本章早些时候提出的Vector例子。这一次Int2类是可以克隆的,所以能对Vector进行深层复制:
//: 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 duplicatedpublic 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(散列表)进行深层复制,也必须采取类似的处理。
这个例子剩余的部分显示出克隆已实际进行——证据就是在克隆了对象以后,可以自由改变它,而原来那个对象不受任何影响。