Ce que cet article vous apporte est une introduction au passage de valeurs et au passage de références des paramètres Java (avec des exemples). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Transfert de valeur : lorsque la méthode est appelée, le paramètre réel transmet sa valeur au paramètre formel correspondant. Les modifications de la valeur du paramètre formel lors de l'exécution de la méthode n'affectent pas la valeur du paramètre réel.
Passer par référence : également appelé passer par adresse. Lorsqu'une méthode est appelée, la référence (l'adresse, pas la valeur du paramètre) du paramètre réel est transmise au paramètre formel correspondant dans la méthode. Lors de l'exécution de la méthode, l'opération sur le paramètre formel est en fait l'opération sur le paramètre réel. paramètre. Pendant l'exécution de la méthode, les modifications des valeurs des paramètres formels affecteront les valeurs réelles des paramètres.
a. Types de données des valeurs transmises : huit types de données de base et String (cela peut être compris, mais en fait String est aussi l'adresse transmise, mais l'objet chaîne est différent des autres objets, et l'objet chaîne ne peut pas être Si le contenu change, un nouvel objet sera généré. Alors StringBuffer sera ok, mais seul son contenu ne peut pas être modifié).
b. Type de données pour transmettre la valeur d'adresse : tous les types de données composites à l'exception de String, y compris les tableaux, les classes et les interfaces.
Exemple de transfert de valeur :
package com.other.test; public class Test { public static void change(int i, int j) { int temp = i; i = j; j = temp; } public static void main(String[] args) { int a = 3; int b = 4; change(a, b); System.out.println("a=" + a); System.out.println("b=" + b); } }
Le résultat de sortie est a=3 b=4, la valeur transmise ne changera pas la valeur d'origine
Citation Exemple de passage : (tableau)
package com.other.test; public class Test { public static void change(int[] counts) { counts[0] = 6; System.out.println(counts[0]); } public static void main(String[] args) { int[] count = { 1, 2, 3, 4, 5 }; change(count); System.out.println(count[0]); } }
Le résultat de sortie est 6 6, c'est-à-dire que la valeur de la référence a modifié la valeur d'origine : (objet)
<.>Définir un objet A :package com.other.test; public class A { int i = 0; }La classe qui opère sur l'objet ci-dessus :
package com.other.test; public class Test { public static void add(A a) { //a = new A(); ① a.i++; } public static void main(String args[]) { A a = new A(); add(a); System.out.println(a.i ); } }Lorsque ① est annoté, le résultat de sortie est 1, lorsque ① n'est pas annoté, le résultat de sortie est 0, la raison est que c'est un =new A(); le nouvel objet A construit n'est pas l'objet passé. Regardez la situation de String
package com.other.test; public class Test { String str = new String("old"); char[] ch = { 'a', 'b', 'c' }; public static void main(String args[]) { Test ex = new Test(); ex.change(ex.str, ex.ch); System.out.print(ex.str + " and "); System.out.println(ex.ch); } public void change(String str, char ch[]) { str = "new"; ch[0] = 'd'; } }
Le résultat de sortie est ancien et dbc, c'est-à-dire que passer String ne change pas la valeur d'origine, mais crée une nouvelle valeur.
ch[] est un simple transfert de tableau. (L'objet inclut la référence de l'objet, c'est-à-dire l'adresse et le contenu de l'objet) String est spécial Quiconque a lu le code String sait que String est final. La valeur est donc inchangée. La copie de la référence de l'objet String dans la fonction pointe vers un autre nouvel objet String, tandis que la copie de la référence de l'objet tableau ne change pas, mais change le contenu des données dans l'objet.
Pour les types d'objet, c'est également une sous-classe d'Object. Si vous modifiez la valeur de ses membres dans une méthode, la modification prendra effet une fois l'appel de la méthode terminé, ses membres auront de nouvelles valeurs. pointez-le vers un autre objet, la méthode Une fois l'appel terminé, la référence originale à celui-ci ne pointe pas vers le nouvel objet.
Les paramètres Java, qu'ils soient de types primitifs ou de types référence, sont passés en copies (il existe une autre façon de dire que c'est par valeur, mais il vaut mieux dire que c'est plus simple à comprendre en passant par valeur. Le passage par valeur est généralement relatif à l'adresse).
Si le type de paramètre est un type primitif, alors ce qui est transmis est une copie du paramètre, qui est la valeur du paramètre d'origine. C'est la même chose que la valeur transmise. discuté auparavant. Si la valeur de la copie est modifiée dans la fonction, la valeur d'origine ne sera pas modifiée. Si le type de paramètre est un type référence, alors ce qui est transmis est une copie du paramètre de référence, et cette copie stocke l'adresse du paramètre. . Si l'adresse de cette copie n'est pas modifiée dans la fonction, mais que la valeur de l'adresse est modifiée, alors la modification dans la fonction affectera les paramètres transmis. Si l'adresse de la copie est modifiée dans la fonction, par exemple new, alors la copie pointe vers une nouvelle adresse. À ce moment, le paramètre transmis pointe toujours vers l'adresse d'origine, donc la valeur du paramètre ne sera pas modifiée. .
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!