English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Elclonar() El método se utiliza para crear una copia de un objeto de una clase que ha implementadoCloneable La interfaz. Por defecto,它会Se realiza una copia por campo, Porque la clase Object no tiene conocimiento de los miembros específicos de la clase que llama a este método para objetos. Por lo tanto, si la clase solo tiene miembros de tipos de datos primitivos, se creará una nueva copia del objeto y se devolverá una referencia a la copia del objeto nueva. Sin embargo, si la clase contiene cualquier miembro de tipo de clase, solo se copiarán las referencias a esos miembros, por lo que las referencias de los miembros en el objeto original y el objeto clonado apuntan al mismo objeto.
si intenta en el que no se ha implementadoCloneable la interfaz en la que se llama el objeto de la claseclone()método, se obtendráCloneNotSupportedException . Esta interfaz esetiqueta de interfaz,y que estainterfazla implementación de este método solo indica que se puede llamarObject.clone()método.
protected Object clone() throws CloneNotSupportedException
podemos hacerlo a través declone()
dos formas de implementar este método
si la clase también tiene miembros de tipo no primitivo, esto esObject.clone()el resultado de la función de clonado predeterminada proporcionada por el método. En el caso de la "copia superficial", el objeto clonado aún referencia el mismo objeto que el objeto original, porque se copian las referencias del objeto y no el objeto en sí.
public class ShallowCopyTest { public static void main(String args[]) { A a1 = new A(); A a2 = (A) a1.clone(); a1.sb.append(" w3codebox!"); System.out.println(a1); System.out.println(a2); } } class A implements Cloneable { public StringBuffer sb = new StringBuffer("Welcome to "); public String toString() { return sb.toString(); } public Object clone() { try { return super.clone(); } catch(CloneNotSupportedException e) { } return null; } }
Resultado de salida
Bienvenido a w3codebox! Bienvenido a w3codebox!
para las clases que tienen miembros de tipo no primitivo, necesitamos sobrescribirclone() métodos para implementarCopia profundaporque también necesita clonar los objetos miembros, y el mecanismo de clonado predeterminado no puede lograr esto.
public class DeepCopyTest { public static void main(String args[]) { A a1 = new A(); A a2 = (A) a1.clone(); a1.sb.append(" w3codebox!"); System.out.println(a1); System.out.println(a2); } } class A implements Cloneable { public StringBuffer sb = new StringBuffer("Welcome to "); public String toString() { return sb.toString(); } public Object clone() { try { A a = (A) super.clone(); a.sb = new StringBuffer(sb.toString()); return a; } catch(CloneNotSupportedException e) { } return null; } }
Resultado de salida
Bienvenido a w3codebox! Bienvenido a