Проблема возникает из-за того, что класс Test
не реализует интерфейс Cloneable
.Как указано в API-спецификациях ,
, если класс [..] не реализует интерфейс Cloneable, возникает исключение CloneNotSupportedException.
Чтобы исправить, попробуйте что-то вроде:
public class Test implements Cloneable {
...
}
Поскольку интерфейс Cloneable
не объявляет методы (он называется интерфейсом marker , как и Serializable
), больше ничего не нужноделать.Экземпляры вашего класса Test
теперь можно клонировать.
Однако механизм клонирования по умолчанию (т. Е. Механизм 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, вы должны сделать то, что мы называем глубокой копией .