example - java copy constructor
El método clone() del objeto no está visible? (8)
Pregunta:
package GoodQuestions;
public class MyClass {
MyClass() throws CloneNotSupportedException {
try {
throw new CloneNotSupportedException();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
MyClass obj = new MyClass();
MyClass obj3 = (MyClass)obj.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
Aquí la clase ''MyClass'' puede clonar su propio objeto llamando al método de clonación en la clase ''Object''. Cuando intento clonar el de esta clase (''MyClass'') en otra clase (''TestSingleTon'') en el mismo paquete ''GoodQuestions'', arroja el siguiente error de tiempo de compilación.
''El método clone () del tipo Object no es visible ''
Entonces, ¿aquí está el código arrojando el error anterior?
package GoodQuestions;
public class TestSingleTon {
public static void main(String[] args) {
MyClass obj = new MyClass();
MyClass obj3 = obj.clone(); ---> here is the compile error.
}
}
Este error ocurre porque en la clase de Objeto, el método clone () está protegido. Entonces debes anular el método clone () en la clase respectiva. P.ej. Agregue el código siguiente en MyClass
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
También implemente la interfaz Cloneable. P.ej. public class MyClass implements Cloneable
Hice un código de prueba sobre esto y aquí están mis hallazgos:
Cuando un miembro protegido se hereda en un paquete, se convierte en miembro privado de la clase heredada
mientras
cuando un miembro protegido se hereda dentro del mismo paquete, se convierte en miembro predeterminado de la clase heredada.
En su ejemplo, clone () de la clase Object se hereda en MyClass en el paquete. La clase de objeto está en el paquete java.lang y MyClass está en el paquete GoodQuestions. Entonces el método clone () se convierte en un miembro privado de la clase MyClass.
Eso explica por qué no puedes acceder al método clone () desde la clase TestSingleTon.
La sutileza es que el método clone()
de MyClass
se hereda, no se define en MyClass
. Entonces MyClass
puede invocar clone()
del Object porque está protegido , pero MyClass
realmente no tiene un clone()
de sí mismo, por lo que TestSingleTon
no puede acceder a clone()
de MyClass
porque no hay un método clone()
. Aunque ambos están en un mismo paquete, necesita definir un método clone()
en MyClass
para asegurar que realmente "tiene" el clone()
. Por cierto, no te olvides de implementar la interfaz Cloneable
for MyClass
.
Para poder clonar MyClass, tiene que implementar la interfaz Cloneable
Porque clone () es un método protegido. Ver Object.clone() para más detalles.
Reemplazar clone () en MyClass y hacer que la clase implemente la interfaz Cloneable .
Solo tienes que hacer que MyClass implemente la interfaz Cloneable. No es necesario provocar la implementación de clone ().
Object.clone()
método Object.clone()
tiene acceso protegido, lo it''s visible to sub-classes and classes in the same package
significa it''s visible to sub-classes and classes in the same package
.
Es bueno tener un constructor de copia para copiar manualmente el objeto.
/**
Deep copy all the information from other to this
*/
public MyClass (MyClass other) {
this.id = other.id;
}
clone()
tiene acceso protegido. Añadir esto en MyClass
public Object clone(){
try{
return super.clone();
}catch(Exception e){
return null;
}
}
También cambiar a public class MyClass implements Cloneable