2011-10-25 11 views
8

Possible Duplicate:
Why is the clone() method protected in java.lang.Object?Co jest powodem Object.clone() jest chronione

Tu jest mój kod testowy do sprawdzania pracy metoda clone,

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()); 
} 
} 

Zgłasza błąd kompilacji: clone() został zabezpieczony dostęp w java.lang.Object at obj1.clone()

  1. Co robię źle tutaj?
  2. Jaki jest powód, dla którego klon() jest chroniony?

Dzięki

Edycja wraz z odpowiedź: No w końcu widzę moją uprząż test działa, kiedy wdrożyła Cloneable interfejs i nadpisane metody klonowania. To nie działa z przesłonięciem metody clone() z klasy Object. Oto zmodyfikowany kod,

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. Powód clone() metoda jest chronić: Znalazłem to w książce Rdzeń Java

Metoda Clone jest chroniony metoda obiektu, co oznacza, że Twój kod nie może tego po prostu nazwać. Tylko klasa Pracownik może klonować obiekty pracownicze.

Jest powód tego ograniczenia. Pomyśl o sposobie, w jaki klasa Object może implementować klon. W ogóle nie wie o przedmiocie, więc może wykonać tylko kopię pola pola. Jeśli wszystkie pola danych w obiekcie są liczbami lub innymi podstawowymi typami, kopiowanie pól jest w porządku.

Ale jeśli obiekt zawiera odniesienia do podobiektów, wówczas skopiowanie pola daje inne odniesienie do podobiektu, więc oryginał i sklonowane obiekty nadal udostępniają pewne informacje.

Nadzieja jest to pomocne dla innych

Odpowiedz

2

należy zastąpić metodę klonowania w klasie testowej.

Dlaczego jest on chroniony jest omawiany here, chociaż nie wydaje się, że istnieje consensus.