1 objeto nativo protegido clone () arroja clonenotsupportedException;
1. Método modificado por palabras clave nativas
La palabra clave nativa en Java indica que este método es un método local, [Descripción nativa de Java]. Además, la eficiencia de ejecución de los métodos de modificación nativos es mayor que la de las modificaciones no nativas .
2. El método está modificado por protegido
Cuando una clase anula el método Clone (), debe modificarse en un modificador de acceso público, para garantizar que todas las demás clases puedan acceder a este método de esta clase.
3. Método arroja excepción de clonenotsupportedException
Si una clase quiere anular el método Clone (), debe implementar la interfaz java.lang.clonable en sí misma, de lo contrario se lanzará una clonenotsupportedException .
2. El papel de clon ()
Nota: Los objetos aquí se refieren específicamente a tipos complejos.
1. Simple = operación
Sabemos que los objetos de tipos complejos en Java son todos tipos de referencia, y a menudo almacenan las direcciones de memoria de los objetos. Por lo tanto, no podemos simplemente asignar la operación de valor como el operador = . Asignamos un objeto A a otro objeto B, y simplemente asignamos la dirección de memoria del objeto A a B para que ambos apunten a la misma dirección de memoria. La consecuencia de esto es que las modificaciones a uno de los objetos afectarán al otro objeto. La siguiente figura muestra:
Persona p1 = nueva persona (); persona p2 = p1;
2. Clon ()
Usando el método Clone (), puede crear rápidamente una copia de un objeto, y los dos objetos apuntan a diferentes direcciones de memoria. La siguiente figura muestra:
Persona p1 = nueva persona (); persona p2 = p1.clone ();
3. Clon poco profundo y clon de profundidad1, clon poco profundo (copia poco profunda)
El clon poco profundo se refiere a los campos en el objeto clon en sí, no al objeto clon. Solo llame a Super.Clone (), solo clon poco profundo. Aunque el objeto copiado apunta a diferentes direcciones de memoria, los campos en el objeto aún apuntan a la misma dirección de memoria que el objeto anterior.
Public Class ShallowClone implementa clonable {nombre de cadena pública; Public int Age; persona pública; public showOWCLONE () {} public showoWClone (nombre de cadena, int Age, persona persona) {this.name = name; this.age = edad; this.person = persona; } @Override public showoWclone clone () {showoWclone c = null; intente {c = (showoWClone) super.clone (); regreso c; } Catch (ClonenotsupportedException e) {E.PrintStackTrace (); } return c; } public static void main (string [] args) {persona p = nueva persona (); p.name = "P"; p.age = 10; ShallowClone C1 = New ShallowClone ("Jim", 18, P); System.out.printf ("Antes del clon: c1 = %s, c1.person = %s/n", c1, c1.person); Showowclone c2 = c1.clone (); System.out.printf ("Después del clon: c2 = %s, c2.person = %s/n", c2, c2.person); }}Ejecutar la salida Main ():
Antes del clon: c1 = cre.sample.test.object.shallowclone@558385e3, c1.person = cre.sample.test.person@2dcb25f1after clon: c2 = cre.sample.test.object.shallowclone@742808b3, c2.person = cre.sample.test.person@2dcb25f1
De esta manera, la dirección de memoria del objeto ShlowClone ha cambiado, pero la dirección de memoria del campo de la persona en el objeto no ha cambiado;
2. Clon profundo (copia profunda)
El clon profundo se refiere a los campos en el objeto clon en sí y también al objeto clon.
/*** Ejemplo de código de clon profundo* creado por CREGU el 2016/6/9. */public class DeepClone implementa clonable {nombre de cadena public; Public int Age; persona pública; public DeepClone () {} public DeepClone (nombre de cadena, int Age, persona persona) {this.name = name; this.age = edad; this.person = persona; } @Override public DeepClone clone () {DeepClone c = null; intente {c = (profundo) super.clone (); C.person = persona.clone (); regreso c; } Catch (ClonenotsupportedException e) {E.PrintStackTrace (); } return c; } public static void main (string [] args) {persona p = nueva persona (); p.name = "P"; p.age = 10; DeepClone C1 = nuevo DeepClone ("Jim", 18, P); System.out.printf ("Antes del clon: c1 = %s, c1.person = %s/n", c1, c1.person); DeepClone c2 = c1.clone (); System.out.printf ("Después del clon: c2 = %s, c2.person = %s/n", c2, c2.person); }}Ejecutar la salida Main ():
Antes del clon: c1 = cre.sample.test.object.deepclone@558385e3, c1.person = cre.sample.test.person@2dcb25f1after clon: c2 = cre.sample.test.object.deepclone@742808b3, c2.person = cre.sample.pers.pers.pers.pers.pers.pers.
En este caso, la dirección de memoria del objeto DeepClone ha cambiado, pero la dirección de memoria del campo de la persona en el objeto también ha cambiado.
El análisis completo anterior del método clon del objeto Java es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.