Compartilhamento de tecnologia

Explique a diferença entre cópia profunda e cópia superficial em Java. O que são classes internas anônimas em Java? Quais são seus cenários de aplicação?

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

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 porCloneableInterface e reescritaclone()Método para implementar cópia superficial.Objectem 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.seOriginalO objeto é copiado superficialmente, então onumse no objeto originalnumsapontará para o mesmo objeto de array.

Cópia profunda

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,numsA matriz também é copiada, portanto o objeto original e a cópia não são compartilhadosnumsvariedade.

Resumir

  • Cópia superficialO próprio objeto e seus campos não estáticos são copiados, mas os objetos referenciados não são copiados.
  • cópia profundaNão apenas o próprio objeto e seus campos não estáticos são copiados, mas também todas as variáveis ​​de membro dos tipos de referência são copiadas recursivamente.

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?