minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Explique a diferença entre cópia profunda e cópia superficial em Java.
Em Java, Deep Copy e Shallow Copy são dois métodos de cópia de objetos e seus comportamentos ao copiar objetos são essencialmente diferentes.
Cópia superficial refere-se à criação de um novo objeto e, em seguida, à cópia dos campos não estáticos do objeto atual para o novo objeto. Se o campo for um tipo de valor, copie o campo bit por bit, se o campo for um tipo de referência, copie; a referência, mas não O objeto referenciado não é copiado. Portanto, o objeto original e sua cópia referem-se ao mesmo objeto.
Em Java, isso pode ser alcançado porCloneable
Interface e reescritaclone()
Método para implementar cópia superficial.Object
em aulaclone()
Este método pode obter uma cópia superficial.
class Original implements Cloneable { | |
private int[] nums; | |
public Original() { | |
nums = new int[5]; | |
} | |
public void setNums(int[] nums) { | |
this.nums = nums; | |
} | |
public Object clone() throws CloneNotSupportedException { | |
return super.clone(); | |
} | |
} |
Neste exemplo,nums
É um tipo de referência.seOriginal
O objeto é copiado superficialmente, então onums
e no objeto originalnums
apontará para o mesmo objeto de array.
Uma cópia profunda não apenas copia o próprio objeto, mas também copia recursivamente todas as variáveis de membro do tipo de referência contidas no objeto, o que significa que a cópia e o objeto original não compartilharão nenhuma variável de membro do tipo de referência. A modificação de quaisquer variáveis de membro de um objeto não afetará outro objeto.
Em Java, a implementação de cópias profundas geralmente requer a escrita manual do código para garantir que todas as variáveis de membro dos tipos de referência sejam copiadas adequadamente.
class DeepCopied implements Cloneable { | |
private int[] nums; | |
public DeepCopied() { | |
nums = new int[5]; | |
} | |
public void setNums(int[] nums) { | |
this.nums = nums; | |
} | |
@Override | |
public Object clone() throws CloneNotSupportedException { | |
DeepCopied copied = (DeepCopied) super.clone(); | |
copied.nums = nums.clone(); // 对引用类型的成员变量也进行拷贝 | |
return copied; | |
} | |
} |
Neste exemplo,nums
A matriz também é copiada, portanto o objeto original e a cópia não são compartilhadosnums
variedade.
A escolha de usar cópia profunda ou cópia superficial depende dos cenários e requisitos específicos da aplicação.
O que são classes internas anônimas em Java? Quais são seus cenários de aplicação?