Невозможно понять клон - PullRequest
1 голос
/ 07 июля 2011

У меня есть простая программа для клонирования объекта, я погуглил ошибку «Exception in thread» 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();
       }
 }

Ответы [ 2 ]

4 голосов
/ 07 июля 2011

Проблема возникает из-за того, что класс 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, вы должны сделать то, что мы называем глубокой копией .

2 голосов
/ 07 июля 2011

Вы должны реализовать Cloneable.Это интерфейс маркера.

Ваша программа должна быть

    public class Test implements Cloneable{
         //rest of the program
    }
...