Каква е причината зад 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,

Методът клониране е защитен метод на Object, което означава, че вашият код не може просто да го извика. Само класът Employee може да клонира обекти Employee.

Има причина за това ограничение. Помислете за начина, по който класът Object може да реализира клониране. Той изобщо не знае нищо за обекта, така че може да направи само копие поле по поле. Ако всички полета с данни в обекта са числа или други основни типове, копирането на полетата е добре.

Но ако обектът съдържа препратки към подобекти, тогава копирането на полето ви дава друга препратка към подобекта, така че оригиналът и клонираните обекти все още споделят известна информация.

Надявам се това да е полезно за други


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


Отговори (1)


Трябва да замените метода на клониране в тестовия клас.

Защо е защитено, се обсъжда тук, въпреки че изглежда няма консенсус.

person Jim    schedule 25.10.2011