Mi informacion de contacto
Correo[email protected]
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.
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 medianteCloneable
Interfaz y reescrituraclone()
Método para implementar copia superficial.Object
en 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.siOriginal
El objeto se copia superficialmente, luego elnums
y en el objeto originalnums
apuntará al mismo objeto de matriz.
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,nums
La matriz también se copia, por lo que el objeto original y la copia no se comparten.nums
formación.
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?