克隆对象

2014-11-23 23:19:09 · 作者: · 浏览: 0
假设在你的应用中使用一些对象,你如何拷贝你的对象呢?最明显的方法是讲一个对象简单的赋值给另一个,就像这样:

obj2 = obj1;

但是这个方法实际上没有拷贝对象而仅仅是拷贝了一个对象引用,换换言之,在你执行这个操作后仍然只有一个对象,但是多出了一个对该对象的引用。

如果这个看似明显的方法不能正常工作,那么如何实际的拷贝一个对象呢?为什么不试试Object.clone呢?这个方法对Object的所有子类都是可用的。例如:
  1. class A {
  2. private int x;
  3. public A(int i) {
  4. x = i;
  5. }
  6. }
  7. public class CloneDemo1 {
  8. public static void main(String args[])
  9. throws CloneNotSupportedException {
  10. A obj1 = new A(37);
  11. A obj2 = (A)obj1.clone();
  12. }
  13. }

这个代码引发一个编译错误,因为Object.clone是一个protected方法。那么再试一次,换一种方法:
  1. class A {
  2. private int x;
  3. public A(int i) {
  4. x = i;
  5. }
  6. public Object clone() {
  7. try {
  8. return super.clone();
  9. }
  10. catch (CloneNotSupportedException e) {
  11. throw new InternalError(e.toString());
  12. }
  13. }
  14. }
  15. public class CloneDemo2 {
  16. public static void main(String args[])
  17. throws CloneNotSupportedException {
  18. A obj1 = new A(37);
  19. A obj2 = (A)obj1.clone();
  20. }
  21. }

在这个方法中,呢定义自己的clone方法,它扩展Object.clone方法,CloneDemo2可以编译,但是当你运行它时会抛出一个CloneNotSupportedException异常。

这里仍然缺少一些东西,你必须让那些包含clone方法的类实现Cloneable接口,就像这样:
  1. class A implements Cloneable {
  2. private int x;
  3. public A(int i) {
  4. x = i;
  5. }
  6. public Object clone() {
  7. try {
  8. return super.clone();
  9. }
  10. catch (CloneNotSupportedException e) {
  11. throw new InternalError(e.toString());
  12. }
  13. }
  14. public<