- 写在前面的话
- 引言
- 第 1 章 对象入门
- 第 2 章 一切都是对象
- 第 3 章 控制程序流程
- 第 4 章 初始化和清除
- 第 5 章 隐藏实施过程
- 第 6 章 类再生
- 第 7 章 多形性
- 第 8 章 对象的容纳
- 第 9 章 违例差错控制
- 第 10 章 Java IO 系统
- 第 11 章 运行期类型鉴定
- 第 12 章 传递和返回对象
- 第 十三 章 创建窗口和程序片
- 第 14 章 多线程
- 第 15 章 网络编程
- 第 16 章 设计范式
- 第 17 章 项目
- 附录 A 使用非 JAVA 代码
- 附录 B 对比 C++和 Java
- 附录 C Java 编程规则
- 附录 D 性能
- 附录 E 关于垃圾收集的一些话
- 附录 F 推荐读物
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
12.2.7 用 Vector 进行深层复制
下面让我们复习一下本章早些时候提出的 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 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(散列表)进行深层复制,也必须采取类似的处理。
这个例子剩余的部分显示出克隆已实际进行——证据就是在克隆了对象以后,可以自由改变它,而原来那个对象不受任何影响。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论