1 Clone d'objet natif protégé () lève ClonenotsupportedException;
1. Méthode modifiée par les mots clés natifs
Le mot-clé natif de Java indique que cette méthode est une méthode locale, [description native de Java]. De plus, l'efficacité d'exécution des méthodes de modification native est supérieure à celle des modifications non natives .
2. La méthode est modifiée par
Lorsqu'une classe remplace la méthode clone (), elle doit être modifiée en un modificateur d'accès public, afin de s'assurer que toutes les autres classes peuvent accéder à cette méthode de cette classe.
3. La méthode lance ClonenotsupportedException à l'exception
Si une classe souhaite remplacer la méthode clone (), elle doit implémenter l'interface java.lang.clonable elle-même, sinon un clonenotsupportedException sera lancé.
2. Le rôle de clone ()
Remarque: les objets ici se réfèrent spécifiquement à des types complexes.
1. Simple = opération
Nous savons que les objets de types complexes en Java sont tous des types de référence, et ils stockent souvent les adresses mémoire des objets. Par conséquent, nous ne pouvons pas simplement attribuer l'opération de valeur comme l'opérateur = . Nous attribuons un objet A à un autre objet B, et nous attribuons simplement l'adresse mémoire de l'objet A à B afin que les deux pointent vers la même adresse mémoire. La conséquence de cela est que les modifications de l'un des objets affecteront l'autre objet. La figure suivante montre:
Personne P1 = new personne (); personne P2 = P1;
2. Clone ()
À l'aide de la méthode clone (), vous pouvez rapidement créer une copie d'un objet et les deux objets pointent vers différentes adresses mémoire. La figure suivante montre:
Personne p1 = new personne (); personne p2 = p1.clone ();
3. Clone peu profond et clone profond 1, clone peu profond (copie peu profonde)
Le clone peu profond fait référence aux champs de l'objet de clone lui-même, pas à l'objet clone. Appelez uniquement Super.clone (), juste un clone peu profond. Bien que l'objet copié pointe vers différentes adresses de mémoire, les champs de l'objet pointent toujours vers la même adresse mémoire que l'objet précédent.
classe publique ShallowClone implémente clonable {nom de chaîne publique; L'âge public; personne publique; public shallowclone () {} public shallowclone (nom de chaîne, int Âge, personne personne) {this.name = name; this.age = âge; this.person = personne; } @Override public shallowclone clone () {shallowclone c = null; essayez {c = (shallowclone) super.clone (); Retour C; } catch (clonenotsupportEdException e) {e.printStackTrace (); } return c; } public static void main (String [] args) {personne p = new personne (); P.Name = "P"; p.age = 10; Shallowclone C1 = New Shallowclone ("Jim", 18, p); System.out.printf ("Avant le clone: C1 =% S, C1.Serson =% S / N", C1, C1.Serson); Shallowclone C2 = C1.clone (); System.out.printf ("After Clone: C2 =% S, C2.Person =% S / N", C2, C2.Person); }}Exécuter la sortie Main ():
avant clone: c1 = cre.sample.test.object.shallowclone@558385e3, c1.person = cre.sample.test.person@2dcb25f1after Clone: C2 = Cre.sample.test.object.shallowclone@742808b3, C2.Person = cre.sample.test.person@2dcb25f1
De cette façon, l'adresse mémoire de l'objet ShallowClone a changé, mais l'adresse mémoire du champ de personne dans l'objet n'a pas changé;
2. Clone profond (copie profonde)
Deep Clone fait référence aux champs de l'objet Clone lui-même et également de l'objet Clone.
/ ** * Exemple de code de clone profond * créé par Cregu sur 2016/6/9. * / classe publique DeepClone implémente clonable {nom de chaîne publique; L'âge public; personne publique; public DeepClone () {} public DeepClone (nom de chaîne, int Âge, personne personne) {this.name = name; this.age = âge; this.person = personne; } @Override public DeepClone clone () {DeepClone c = null; essayez {c = (deepclone) super.clone (); C.Serson = personne.clone (); Retour C; } catch (clonenotsupportEdException e) {e.printStackTrace (); } return c; } public static void main (String [] args) {personne p = new personne (); P.Name = "P"; p.age = 10; Deepclone C1 = new Deepclone ("Jim", 18, p); System.out.printf ("Avant le clone: C1 =% S, C1.Serson =% S / N", C1, C1.Serson); DeepClone C2 = C1.clone (); System.out.printf ("After Clone: C2 =% S, C2.Person =% S / N", C2, C2.Person); }}Exécuter la sortie Main ():
Avant clone: c1 = cre.sample.test.object.deepclone@558385e3, c1.person = cre.sample.test.person@2dcb25f1after Clone: C2 = Cre.sample.test.Object.deepclone@742808B3, C2.Person = Cre.Sample.stest.Person.
Dans ce cas, l'adresse mémoire de l'objet DeepClone a changé, mais l'adresse mémoire du champ de personne dans l'objet a également changé.
L'analyse complète ci-dessus de la méthode de clone de l'objet Java est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.