2011-10-25 24 views
8

Possible Duplicate:
Why is the clone() method protected in java.lang.Object?Qual è la ragione che sta dietro Object.clone() è protetto

Qui è il mio codice di prova per la verifica del metodo clone di lavoro,

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

genera un errore di compilazione: clone() ha protetto l'accesso a java.lang.Object at obj1.clone()

  1. Cosa sto facendo male qui?
  2. Qual è la ragione dietro la quale clone() è protetto?

Grazie

Modifica insieme con risposta: Beh, finalmente vedo il mio test harness sta funzionando quando ho implementato l'interfaccia Cloneable e sovrascritto il metodo clone. Non funziona semplicemente sovrascrivendo il metodo clone() dalla classe Object. Ecco il codice modificato,

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. Motivo clone() metodo è proteggere: Ho trovato questo dal libro Nucleo Java,

Il metodo clone è un metodo protetto di oggetto, il che significa che il tuo codice non può semplicemente chiamarlo. Solo la classe Employee può clonare oggetti Employee.

C'è una ragione per questa limitazione. Pensa al modo in cui la classe Object può implementare il clone. Non sa nulla dell'oggetto, quindi può fare solo una copia campo per campo. Se tutti i campi di dati nell'oggetto sono numeri o altri tipi di base, copiare i campi va bene.

Ma se l'oggetto contiene riferimenti a oggetti secondari, la copia del campo fornisce un altro riferimento al subobject, quindi gli oggetti originali e quelli clonati condividono ancora alcune informazioni.

Spero che questo è utile per gli altri

risposta

2

Si dovrebbe eseguire l'override del metodo clone nella classe di test.

perché è protetto è discusso here anche se non sembra essere un consenso.

Problemi correlati