Red de conocimiento informático - Aprendizaje de programación - Método de clonación de Java cómo utilizarlo

Método de clonación de Java cómo utilizarlo

¿Qué es "clonar"?

En el proceso de programación real, a menudo nos encontramos con una situación de este tipo:

Hay un objeto A. En un momento determinado, A ya contiene algunos valores válidos. , puede ser necesario un nuevo objeto B que sea igual a A. Cualquier cambio posterior en B no afectará el valor de A. Es decir, A y B son dos objetos independientes, pero el valor inicial de B está determinado por el Un objeto. En el lenguaje Java, una simple declaración de asignación no puede satisfacer este requisito. Si bien hay muchas maneras de satisfacer esta necesidad, implementar el método clone() es una de las más simples y eficientes.

Todas las clases en Java heredan de la clase java.lang.Object de forma predeterminada. Hay un método clone() en la clase java.lang.Object. El documento API de JDK explica que este método devolverá un. copia del objeto Objeto.

Hay dos puntos a tener en cuenta:

Primero, copiar un objeto devuelve un nuevo objeto, no una referencia.

En segundo lugar, la diferencia entre una copia de un objeto y un nuevo objeto devuelto usando el nuevo operador es que la copia ya contiene cierta información sobre el 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?implements?Cloneable{?

public?int?aInt;?

public?Object?clone(){?

CloneClass?o?=?null;?

intenta{?

o?=?(CloneClass) super .clone();?

}catch(CloneNotSupportedException?e){?

e.printStackTrace();?

}?

¿regresar?

}?

}}

Hay tres puntos que vale la pena señalar:

Primero, la clase CloneClass que espera implementar la función de clonación Se implementa la interfaz Cloneable, que pertenece al paquete java.lang y se ha importado a la clase de forma predeterminada, por lo que no es necesario escribirla como java.lang.Cloneable.

En segundo lugar, la clase CloneClass implementa la interfaz Cloneable. Esta interfaz pertenece al paquete java.lang y se importa a la clase de forma predeterminada.

Otra cosa que vale la pena destacar es la sobrecarga del método clone().

La llamada final a super.clone() en el método clone() también significa que super.clone() llama directa o indirectamente al método clone() de la clase java.lang.Object, que es No es lo mismo que la clonación. La estructura de herencia de la clase es irrelevante. Estos puntos se explican con más detalle a continuación.

Debe decirse 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 tiene que preocuparse por este problema. Luego sobrecargue el método clone(). Otro punto a considerar es que para permitir que otras clases llamen al método clone() de la clase clonada, debes establecer el atributo del método clone() en público después de la sobrecarga.

Entonces, ¿por qué las clases de clonació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 (), entonces el método clone () del objeto arrojará CloneNotSupportedException.