1. Cópia superficial e conceito de cópia profunda
⑴SHOLLOW COPY (clonagem rasa)
Todas as variáveis do objeto copiado contêm o mesmo valor que o objeto original, enquanto todas as referências a outros objetos ainda apontam para o objeto original. Em outras palavras, cópia superficial simplesmente copia o objeto que está sendo considerado, não o objeto que ele faz referência.
⑵ Cópia profunda (clonagem profunda)
Todas as variáveis do objeto copiado contêm o mesmo valor que o objeto original, exceto as variáveis que se referem a outros objetos. As variáveis que se referem a outros objetos apontarão para o novo objeto copiado, em vez dos objetos referenciados originais. Em outras palavras, cópia profunda copia todos os objetos referenciados pelo objeto a serem copiados.
2. Método de clone () de Java
⑴ O método clone copia uma cópia do objeto e o retorna ao chamador. De um modo geral, o método clone () satisfaz:
① Para qualquer objeto x, existe x.clone ()! = X // O objeto clonado não é o mesmo objeto que o objeto original ② para qualquer objeto x, existe x.clone (). GetClass () = = x .
⑵clone de objetos em java
① Para obter uma cópia do objeto, podemos usar o método clone () da classe de objeto.
② Sobrescrever o método clone () da classe base na classe derivada e declarar -o como público.
③ No método clone () da classe derivada, ligue para Super.Clone ().
④ Implementar a interface clonável na classe derivada.
Consulte o seguinte código:
classe pública implementa o cloneable {Nome da String; Aluno) super.clone (); // clone () em objeto reconhece qual objeto você deseja copiar. } Catch (CLONENOTSUPPORTEDEXCIONENTE E) {System.out.println (E.ToString ()); S2 = (Student) S1.Clone (); System.out.println ("name ="+s1.name+","+"AGE ="+S1.AGE); +s2.age); ilustrar:
① Por que temos que chamar super.clone () ao substituir o método clone () do objeto na classe derivada? No tempo de execução, o clone () no objeto reconhece qual objeto você deseja copiar e aloca espaço para esse objeto e copia o objeto, copiando o conteúdo do objeto original um por um no espaço de armazenamento do novo objeto.
② O método clone () herdado da classe java.lang.Object é uma cópia rasa. O código a seguir pode provar isso.
Classe Professor {Nome da String; Int Age; Estudante (Nome da String, Int Age, Professor P) {this.name = Nome; .clone (); ) {Professor P = NOVO PROFESSOR (Wangwu ", 50); "; s2.p.age = 30; System.out.println (" name = "+s1.p.name+", "+" Age = "+s1.p.age); system.out.println (" nome = "+s2.p.name+", "+" AGE = "+s2.p.age); // Os resultados de saída dos professores dos alunos 1 e 2 se tornam lisi, e a idade é 30. }} Então, como devemos implementar a clonagem profunda, ou seja, o professor que modificou S2 não afetará o professor que S1? O código é aprimorado da seguinte forma.
Melhorias para tornar o professor do aluno 1 inalterado (clone profundo)
O Professor da classe implementa o nome da String; clone (); Int Age, Professor P) {this.name = Name; } Catch (CLONENOTSUPPORTEDEXCIONENTE E) {System.out.println (E.ToString ()); ] args) {Professor P = Professor (Wangwu ", 50); "Lisi"; System.out.println ("name ="+s1.p.name+","+"AGE ="+s1.p.age); "+" Age = "+s2.p.age);}} 3. Use a serialização para fazer cópias profundas (principalmente para evitar a reescrita do método clone () de cópia profunda de objetos mais complexos e também pode implementar a transmissão contínua e outras funções)
O processo de escrever objetos em riachos é um processo de serialização, mas é muito chamado de processo "congelado" ou "escolher" nos círculos dos programadores Java; processo.
Deve -se ressaltar que o que está escrito no fluxo é uma cópia do objeto, e o objeto original ainda existe na JVM, então o que é "em conserva em picles" é apenas uma cópia do objeto, e os picles java ainda podem ser fresco.
Copiar profundamente um objeto na linguagem Java geralmente pode fazer com que o objeto implemente a interface serializável e depois escreva o objeto (na verdade apenas uma cópia do objeto) em um fluxo (em conserva em picles) e depois leia -o do fluxo (coloque os picles de volta) podem reconstruir o objeto.
A seguir, é apresentado o código fonte de cópia profunda.
Public Object DeepClone () {// Escreva o objeto no fluxo BYTEARRAYOUTOUTSTREAM BO = NOVO Bo.TobyTeartray (); A premissa de fazer isso é que o objeto e todos os objetos referenciados dentro do objeto são serializáveis. . fora. O código de exemplo acima é aprimorado da seguinte maneira.
classe implementa o Nome da String; idade; Public Void Student (Nome da String, Int Age, Professor T) {this.name = Nome; Vá para o fluxo BYTEARSOUTOUTSTREM BO = novo ByteArrayOutputStream (); novo objectInputStream (BI); 18, T); name = "+s1.t.name+", "+" Age = "+s1.t.age);}}