1 objet natif protégé clone() lève CloneNotSupportedException ;
1 La méthode est modifiée par le mot-clé natif
Le mot-clé natif en java indique que cette méthode est une méthode locale, [. Description native Java 】. De plus, l’efficacité d’exécution des méthodes modifiées natives est supérieure à celle des méthodes modifiées non natives.
2. La méthode est modifiée par protected
Lorsqu'une classe remplace la méthode clone(), elle doit être modifiée en modificateur d'accès public pour garantir que toutes les autres classes peuvent accéder à cette classe. . méthode.
3. La méthode lance CloneNotSupportedException
Une classe qui souhaite remplacer la méthode clone() doit implémenter l'interface java.lang.Cloneable elle-même, sinon une CloneNotSupportedException sera levée.
2. Le rôle de clone()
Remarque : Les objets ici font spécifiquement référence à des types complexes.
1. Simple = opération
Nous savons que les objets de type complexe en Java sont des types de référence, et ils stockent souvent l'adresse mémoire de l'objet. Par conséquent, nous ne pouvons pas simplement utiliser des opérations d’affectation simples comme l’opérateur =. Lorsque nous attribuons un objet a à un autre objet b, nous attribuons simplement l'adresse mémoire de l'objet a à b, de sorte que les deux objets pointent vers la même adresse mémoire. La conséquence est que les modifications apportées à un objet affecteront l’autre objet. Comme le montre la figure ci-dessous :
Person p1 = new Person(); Person p2 = p1;
2. clone()
Utilisez la méthode clone() pour rapidement créez une copie A de l'objet et les deux objets pointent vers des adresses mémoire différentes. Comme le montre la figure ci-dessous :
Person p1 = new Person(); Person p2 = p1.clone();
3. Clone peu profond et clone profond1, clone peu profond (copie superficielle)
<🎜. > clone superficiel Il fait référence uniquement à l'objet clone lui-même, pas aux champs de l'objet clone. Appelez simplement super.clone(), juste un clone superficiel. Bien que l'objet copié pointe vers une adresse mémoire différente, les champs de l'objet pointent toujours vers la même adresse mémoire que l'objet précédent.public class ShallowClone implements Cloneable { public String name; public int age; public Person person; public ShallowClone() { } public ShallowClone(String name, int age, Person person) { this.name = name; this.age = age; this.person = person; } @Override public ShallowClone clone() { ShallowClone c = null; try { c = (ShallowClone) super.clone(); return c; } catch (CloneNotSupportedException e) { e.printStackTrace(); } return c; } public static void main(String[] args) { Person p = new Person(); p.name = "p"; p.age = 10; ShallowClone c1 = new ShallowClone("Jim", 18, p); System.out.printf("before clone: c1 = %s, c1.person = %s\n", c1, c1.person); ShallowClone c2 = c1.clone(); System.out.printf("after clone: c2 = %s, c2.person = %s\n", c2, c2.person); } }
before clone: c1 = cre.sample.test.object.ShallowClone@558385e3, c1.person = cre.sample.test.Person@2dcb25f1 after clone: c2 = cre.sample.test.object.ShallowClone@742808b3, c2.person = cre.sample.test.Person@2dcb25f1
/** * deep clone代码示例 * Created by CreGu on 2016/6/9. */ public class DeepClone implements Cloneable { public String name; public int age; public Person person; public DeepClone() { } public DeepClone(String name, int age, Person person) { this.name = name; this.age = age; this.person = person; } @Override public DeepClone clone() { DeepClone c = null; try { c = (DeepClone) super.clone(); c.person = person.clone(); return c; } catch (CloneNotSupportedException e) { e.printStackTrace(); } return c; } public static void main(String[] args) { Person p = new Person(); p.name = "p"; p.age = 10; DeepClone c1 = new DeepClone("Jim", 18, p); System.out.printf("before clone: c1 = %s, c1.person = %s\n", c1, c1.person); DeepClone c2 = c1.clone(); System.out.printf("after clone: c2 = %s, c2.person = %s\n", c2, c2.person); } }
before clone: c1 = cre.sample.test.object.DeepClone@558385e3, c1.person = cre.sample.test.Person@2dcb25f1 after clone: c2 = cre.sample.test.object.DeepClone@742808b3, c2.person = cre.sample.test.Person@70535b58