Maison  >  Article  >  Java  >  Explication détaillée de la référence et du passage de valeur en Java

Explication détaillée de la référence et du passage de valeur en Java

巴扎黑
巴扎黑original
2017-07-20 13:11:201398parcourir

Examinons d'abord un morceau de code, qui est une question d'entretien écrite que j'ai rencontrée :

 1 /** 2  * ***面试题 3  */ 4 public class StringBufferTest { 5     public static void main(String[] args) { 6         int i = 10; 7         test(i); 8         System.out.println(i);//10 9         StringBuffer str = new StringBuffer("str");10         test2(str);11         System.out.println(str.toString());//str_add12         test3(str);13         System.out.println(str.toString());//str_add14     }15 16     public static int test(int m) {17         m = 30;18         return m;19     }20 21     public static StringBuffer test2(StringBuffer str2) {22         str2.append("_add");23         return str2;24     }25 26     public static StringBuffer test3(StringBuffer str3) {27         str3 = new StringBuffer("java");28         return str3;29     }30 31 }
Afficher le code

Transfert de valeur :

La valeur de i ne deviendra pas 30 car le paramètre d'entrée se voit attribuer une valeur de 30 dans la méthode de test

Donc le test de méthode est exécuté (i) Après impression, la valeur de i est toujours la valeur précédente 10

Le processus spécifique est le suivant :

Variable i---->[Valeur de stockage 10]

Exécuter l'appel Lors de l'utilisation de la méthode test(i), la situation en mémoire est la suivante : i copie sa propre valeur dans la mémoire, puis la variable m pointe vers le 10 copié.

variable i ---- & gt; [Valeur de stockage 10]

↓ Effectuer une copie de valeur

variable m --- & gt;

🎜> A ce moment, lorsque l'exécution atteint la ligne 17, la variable m se voit attribuer une valeur de 30, et le fonctionnement de cette étape n'a rien à voir avec i.

Variable m--->[Valeur de stockage 30]

Passage par référence : (Lorsque vous utilisez des variables globales, faites particulièrement attention à savoir si le changement affectera d'autres lieux)

Str passé à la méthode test2 est une référence à str, donc les changements dans str2 affecteront la valeur de str

Par conséquent, après avoir exécuté la méthode test2(str), la valeur de str imprimé devient str_add

Le processus spécifique est le suivant :

Variable str---->[Valeur de stockage "str"]

Exécuter test2(str). Notez que ceci est essentiellement différent du transfert de valeur. : lors de l'appel de test2(str), la variable str2 pointe également vers l'espace mémoire pointé par str, plutôt que vers une copie de str.

                                                                                                     ugaatch `` par la méthode append sur str2 , en changeant la mémoire pointée par str2 La valeur de l'espace et la valeur de str seront changent également en conséquence.


Chaîne variable
                                                                                                                                                                                                La valeur n'est pas java mais str_add ?

La raison principale est : str3 = new StringBuffer("java"); Cette ligne de code

Il y a un changement similaire à la copie de la valeur entrante : la nouvelle méthode ne change pas le contenu de la mémoire pointé par str, mais Un nouvel espace est ouvert pour stocker la chaîne "java", et str3 pointe vers cet espace.

Le processus spécifique est le suivant :

Le programme s'exécute jusqu'à la ligne 12, str pointe vers un espace mémoire où "str_add" est stocké.

Variable str---->[Valeur de stockage "str_add"]

Appelez test3(str) et pointez str3 vers l'espace mémoire pointé par str, qui est la référence du passé dans la rue.

Chaîne variable

                                                                                                                                                                                                        ; ouvre un nouvel espace pour stocker la chaîne "java", et str3 pointe vers cet espace. >   . ]

 

 

 

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn