出现问题是因为该类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。