¿Por qué Java tiene que implementar la interfaz Cloneable si se clona?
La siguiente es una explicación detallada:
Todas las clases en Java heredan por defecto De la clase java.lang.Object, y hay un método clone() en la clase java.lang.Object. Hay un método clone() en la clase Objeto. La documentación de la API de JDK explica que este método devolverá una copia del objeto Object. Hay dos puntos a tener en cuenta aquí: primero, copiar un objeto devuelve un nuevo objeto, no una referencia. En segundo lugar, la diferencia entre un objeto copiado y un objeto nuevo devuelto mediante el nuevo operador es que el objeto copiado ya contiene cierta información del objeto original, en lugar de la información inicial del objeto.
¿Cómo aplicar el método clone()?
Un código muy típico para llamar a clone() es el siguiente:
class CloneClass implementa Cloneable{
public int aInt;
clon de objeto público(){
CloneClass o = null
try{
o = (CloneClass)super.clone(); p >}catch(CloneNotSupportedException e){
e.printStackTrace (
}
return o; p >
}
Hay tres puntos que vale la pena señalar. Uno es que la clase CloneClass que se espera que implemente la función de clonación implementa la interfaz Cloneable que pertenece al paquete java.lang. Esta interfaz pertenece al paquete java.lang y el paquete java.lang se ha importado a la clase de forma predeterminada, por lo que no es necesario escribirlo como java.lang.Cloneable. Otra cosa que vale la pena señalar es que el método clone() está sobrecargado. Finalmente, el método clone () llama a super.clone (), lo que significa que super.clone () llamará directa o indirectamente al método clone () de la clase java.lang.Object, independientemente de la estructura de herencia de la clase clonada. . Estos puntos se explican con más detalle a continuación.
Cabe decir que el tercer punto es el más importante. Eche un vistazo más de cerca al método nativo clone() en la clase Object. La eficiencia de los métodos nativos es generalmente mucho mayor que la de los no nativos. métodos en Java. Esto también explica por qué necesita usar el método clone() en Object en lugar de crear primero una nueva clase y luego asignar la información del objeto original al nuevo objeto, aunque esto también implementa la función de clonación. Con respecto al segundo punto, también es importante tener en cuenta que clone() en la clase Object sigue siendo un método con un atributo protegido. Esto también significa que si desea aplicar el método clone(), debe heredar de la clase Object. En Java, todas las clases heredan de la clase Objeto de forma predeterminada, por lo que no tienes que preocuparte por este problema. Luego sobrecargue el método clone(). Otra cosa a considerar es que para permitir que otras clases llamen al método clone() de la clase clonada, debes establecer sus propiedades en públicas después de anular el método clone().
Entonces, ¿por qué las clases de clonación aún necesitan implementar la interfaz Cloneable? ¡Tenga en cuenta que la interfaz Cloneable no contiene ningún método! De hecho, la interfaz es solo una bandera, y la bandera solo se aplica al método clone () en la clase de objeto. Si la clase clonada no implementa la interfaz Cloneable y se llama al método clone() del objeto (es decir, se llama al método super.Clone()), el método clone() del objeto generará una excepción CloneNotSupportedException.