1

我有一个克隆对象的简单程序,我用谷歌搜索了错误“线程“main”java.lang.CloneNotSupportedException:中的异常:”但需要您的帮助来理解错误,为什么我无法克隆 obj1?

public class Test{
int a;
int b;
public Test(int a , int b){
    this.a=a;
    this.b=b;
    }
public static void main(String[]args) throws CloneNotSupportedException{
    Test obj1=new Test(2, 4);
    Test obj2=(Test) obj1.clone();
       }
 }
4

2 回答 2

4

出现问题是因为该类Test没有实现Cloneable接口。如API 规范中所述,

如果类 [..] 没有实现接口 Cloneable,则抛出 CloneNotSupportedException。

要修复,请尝试以下操作:

public class Test implements Cloneable { 
  ...
}

由于Cloneable接口没有声明任何方法(它被称为标记接口,就像Serializable),所以没有什么可做的。Test现在可以克隆您的类的实例。

但是,默认的克隆机制(即 of 的克隆机制Object)可能并不完全符合您的要求,您可能希望覆盖该clone()方法。默认是做一个浅拷贝,也就是说,你会得到你的类的一个新的、不同的实例,但是两个实例的字段将引用相同的对象!例如:

class C1 {
  Object o;
}
class C2 implements Cloneable {
  C1 c1;
}

... main ... {
  C2 c2 = new C2();
  c2.c1 = new C1();
  c2.c1.o = new Object();
  C2 c2clone = c2.clone();
  System.out.println(c2 == c2clone); // prints false
  System.out.println(c2.c1 == c2clone.c1); // prints true
  c2.c1.o = new Object(); // modified both c2 and c2clone!!!

最后一行将修改 c2 和 c2clone,因为它们都指向 c1 的同一个实例。如果您希望最后一行只修改 c2,那么您必须进行我们所说的deep copy

于 2011-07-07T05:33:07.603 回答
2

你必须实现 Cloneable。这是一个标记界面。

你的程序应该是

    public class Test implements Cloneable{
         //rest of the program
    }
于 2011-07-07T05:34:45.987 回答