По какой причине Object.clone () защищен

Возможный дубликат:
Почему метод clone () защищен в java.lang.Object?

Вот мой тестовый код для проверки работы метода клонирования,

class Test{
  int a;
  public void setA(int value){
a = value;
  }
  public int getA(){
   return a;
  }
}
class TestClass{   
   public static void main(String args[]){
   Test obj1 = new Test();
   obj1.setA(100);
   Test obj2 = obj1.clone();
   System.out.println("obj1 A:"+obj1.getA()+" obj2 A:"+obj2.getA());
   obj2.setA(9999);
   System.out.println("obj1 A:"+obj1.getA()+" obj2 A:"+obj2.getA());
 }
}

Выдает ошибку компиляции: clone () имеет защищенный доступ в java.lang.Object в obj1.clone ()

  1. Что я здесь делаю не так?
  2. В чем причина защиты clone ()?

Спасибо

Редактировать вместе с ответом: Наконец-то я вижу, что моя тестовая оснастка работает, когда я реализовал интерфейс Cloneable и переопределил метод клонирования. Он не работает с простым переопределением метода clone () из класса Object. Вот модифицированный код,

class Test implements Cloneable{
 int a;
 public void setA(int value){
a = value;
 }
 public int getA(){
return a;
 }
@Override
protected Test clone() throws CloneNotSupportedException{    
  return(Test) super.clone();  
  }   
}
class TestClass{   
  public static void main(String args[]){
     Test obj1 = new Test();
   obj1.setA(100);
   try{
     Test obj2 = (Test)obj1.clone();
     System.out.println("obj1 A:"+obj1.getA()+" obj2 A:"+obj2.getA());
     obj2.setA(9999);
     System.out.println("obj1 A:"+obj1.getA()+" obj2 A:"+obj2.getA());       
   }catch(Exception e){
     System.out.println("ERror"+e);
     }         
    }
  }

2. Причина защиты метода clone (): я нашел это из книги Core Java,

Метод clone - это защищенный метод Object, что означает, что ваш код не может просто вызвать его. Только класс Employee может клонировать объекты Employee.

Для этого ограничения есть причина. Подумайте, как класс Object может реализовать клонирование. Он вообще ничего не знает об объекте, поэтому может делать только копию поля за полем. Если все поля данных в объекте являются числами или другими базовыми типами, копирование полей вполне нормально.

Но если объект содержит ссылки на подобъекты, то копирование поля дает вам другую ссылку на подобъект, поэтому исходный и клонированный объекты по-прежнему совместно используют некоторую информацию.

Надеюсь, это поможет другим


person droidsites    schedule 25.10.2011    source источник


Ответы (1)


Вы должны переопределить метод clone в классе Test.

Почему он защищен, обсуждается здесь, хотя, похоже, нет единого мнения.

person Jim    schedule 25.10.2011