1. Copia poco profunda y concepto de copia profunda
⑴Phallow Copy (clonación superficial)
Todas las variables del objeto copiado contienen el mismo valor que el objeto original, mientras que todas las referencias a otros objetos aún apuntan al objeto original. En otras palabras, la copia superficial simplemente copia el objeto que se está considerando, no el objeto al que hace referencia.
⑵ Copia profunda (clonación profunda)
Todas las variables del objeto copiado contienen el mismo valor que el objeto original, excepto aquellas variables que se refieren a otros objetos. Esas variables que se refieren a otros objetos apuntarán al nuevo objeto copiado, en lugar de los objetos referenciados originales. En otras palabras, la copia profunda copia todos los objetos referenciados por el objeto a copiar.
2. Método Clone () de Java
⑴ El método Clone copia una copia del objeto y la devuelve a la persona que llama. En términos generales, el método clon () satisface:
① Para cualquier objeto x, hay x.clone ()! = X // El objeto clonado no es el mismo objeto que el objeto original ② para cualquier objeto x, hay x.clone (). GetClass () = = x .
⑵ clon de objetos en Java
① Para obtener una copia del objeto, podemos usar el método clone () de la clase de objeto.
② Sobrescribe el método clone () de la clase base en la clase derivada y lo declara como público.
③ En el método Clone () de la clase derivada, llame a Super.Clone ().
④ Implemente la interfaz clonable en la clase derivada.
Consulte el siguiente código:
El estudiante de la clase pública clonable {Nombre de la cadena; Estudiante) super.clone (); // clone () en el objeto reconoce qué objeto desea copiar. } Catch (ClonEnTsupportedException e) {System.out.println (e.ToString ()); s2 = (estudiante) S1.Clone (); System.out.println ("name ="+s1.name+","+"age ="+s1.age); +s2.age); ilustrar:
① ¿Por qué tenemos que llamar a Super.Clone () al sobrescribir el método clon () del objeto en la clase derivada? En el momento de ejecución, clone () en el objeto reconoce qué objeto desea copiar, luego asigna espacio para este objeto y copia el objeto, copiando el contenido del objeto original uno por uno en el espacio de almacenamiento del nuevo objeto.
② El método clone () heredado de la clase java.lang.object es una copia superficial. El siguiente código puede probarlo.
Class Profesor {Nombre de la cadena; int Age; Estudiante (Nombre de la cadena, int Age, Profesor P) {this.name = name; .Clone (); ) {Profesor P = nuevo Profesor ("Wangwu", 50); "; s2.p.age = 30; system.out.println (" name = "+s1.p.name+", "+" age = "+s1.p.age); system.out.println (" nombre = "+s2.p.name+", "+" edad = "+s2.p.age); // Los resultados de salida de los profesores de los estudiantes 1 y 2 se convierten en LISI, y la edad es 30. }} Entonces, ¿cómo debemos implementar una clonación profunda, es decir, el profesor que modifica S2 no afectará al profesor que S1? El código se mejora de la siguiente manera.
Mejoras para hacer que el profesor de Student 1 no cambie (clon profundo)
Class Profesor Implementa Clonable {String Name; clone (); int Age, profesor p) {this.name = name; } Catch (ClonEnTsupportedException e) {System.out.println (e.ToString ()); ] args) {Profesor P = nuevo Profesor ("Wangwu", 50); "Lisi"; System.out.println ("name ="+s1.p.name+","+"age ="+s1.p.age); "+" edad = "+s2.p.age);}} 3. Use la serialización para hacer una copia profunda (principalmente para evitar reescribir el método clone () de copia profunda de objetos más complejos, y también puede implementar la transmisión continua de punto de interrupción y otras funciones)
El proceso de escribir objetos en las transmisiones es un proceso de serialización, pero se llama muy vívidamente el proceso "congelado" o de "selección" en los círculos de programadores de Java; proceso.
Cabe señalar que lo que se escribe en la transmisión es una copia del objeto, y el objeto original todavía existe en el JVM, por lo que lo que se "encurra" es solo una copia del objeto, y los encurtidos de Java aún pueden estar fresco.
Copiar profundamente un objeto en el lenguaje Java a menudo puede hacer que el objeto implementa primero la interfaz serializable, y luego escriba el objeto (en realidad solo una copia del objeto) en una secuencia (en encurtidos), y luego lea desde la transmisión (poner Los encurtidos hacia atrás) pueden reconstruir el objeto.
El siguiente es el código fuente de copia profunda.
Public Object DeepClone () {// Escribe el objeto en la transmisión ByteArRayOutStream bo = new ByteArrayOutputStream (); Bo.tobyTearray ()); La premisa de hacer esto es que el objeto y todos los objetos referenciados dentro del objeto son serializables. . afuera. El código de ejemplo anterior se mejora de la siguiente manera.
El maestro de clases implementa serializable {Nombre de la cadena; edad; Public Void Student (Nombre de cadena, int Age, maestro t) {this.name = name; Vaya a la transmisión ByteArTeAutStream bo = new ByTearReututStream (); nuevo ObjectInputStream (BI); 18, t); nombre = "+S1.T.Name+", "+" Age = "+S1.T.AGE);}}