2011-10-25 11 views
8

Possible Duplicate:
Why is the clone() method protected in java.lang.Object?¿Cuál es la razón detrás de Object.clone() está protegido

Aquí está mi código de prueba para verificar el funcionamiento método 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()); 
} 
} 

Lanza error de compilación: clone() ha protegido el acceso en java.lang.Object en obj1.clone()

  1. ¿Qué estoy haciendo mal aquí?
  2. ¿Cuál es la razón detrás de la protección del clon()?

Gracias

Editar, junto con la respuesta: Bueno, por fin veo a mi arnés de prueba está funcionando cuando he implementado la interfaz Cloneable y anulado el método de clonación. No funciona con anular el método clone() de la clase Object. Aquí está el código modificado,

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 de método clone() siendo proteger: He encontrado esto desde el libro Core Java,

El método clone es un método protegido del objeto, lo que significa que su código no puede simplemente llamarlo. Solo la clase Empleado puede clonar objetos Empleados.

Hay una razón para esta restricción. Piense en la forma en que la clase Object puede implementar clonar. No sabe nada sobre el objeto en absoluto, por lo que solo puede hacer una copia campo por campo. Si todos los campos de datos en el objeto son números u otros tipos básicos, copiar los campos está bien.

Pero si el objeto contiene referencias a subobjetos, la copia del campo le da otra referencia al subobjeto, por lo que el original y los objetos clonados aún comparten cierta información.

Esperamos que este sea de utilidad para otros

Respuesta

2

Debe reemplazar el método clon en la clase de prueba.

Por qué está protegido se discute here aunque no parece haber consenso.

Cuestiones relacionadas