Compartir tecnología

Explique la diferencia entre copia profunda y copia superficial en Java. ¿Qué son las clases internas anónimas en Java? ¿Cuáles son sus escenarios de aplicación?

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Explique la diferencia entre copia profunda y copia superficial en Java.

En Java, la copia profunda y la copia superficial son dos formas de copiar objetos. Sus comportamientos al copiar objetos son esencialmente diferentes.

Copia superficial

La copia superficial se refiere a crear un nuevo objeto y luego copiar los campos no estáticos del objeto actual al nuevo objeto. Si el campo es un tipo de valor, entonces el campo se copia bit a bit; la referencia se copia pero no. El objeto referenciado no se copia. Por tanto, el objeto original y su copia se refieren al mismo objeto.

En Java, esto se puede lograr medianteCloneableInterfaz y reescrituraclone()Método para implementar copia superficial.Objecten la claseclone()Este método puede lograr una copia 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();
}
}

En este ejemplo,nums Es un tipo de referencia.siOriginalEl objeto se copia superficialmente, luego elnumsy en el objeto originalnumsapuntará al mismo objeto de matriz.

Copia profunda

Una copia profunda no solo copia el objeto en sí, sino que también copia recursivamente todas las variables miembro de tipo de referencia contenidas en el objeto, lo que significa que la copia y el objeto original no compartirán ninguna variable miembro de tipo de referencia. La modificación de cualquier variable miembro de un objeto no afectará a otro objeto.

En Java, la implementación de copias profundas a menudo requiere escribir código manualmente para garantizar que todas las variables miembro de los tipos de referencia se copien adecuadamente.

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;
}
}

En este ejemplo,numsLa matriz también se copia, por lo que el objeto original y la copia no se comparten.numsformación.

Resumir

  • Copia superficialEl objeto en sí y sus campos no estáticos se copian, pero los objetos a los que se hace referencia no se copian.
  • copia profundaNo solo se copian el objeto en sí y sus campos no estáticos, sino que también se copian de forma recursiva todas las variables miembro de tipos de referencia.

La elección de utilizar copia profunda o copia superficial depende de los escenarios y requisitos de la aplicación específicos.


¿Qué son las clases internas anónimas en Java? ¿Cuáles son sus escenarios de aplicación?