Maison >Java >javaDidacticiel >Passage de paramètres en Java (passage de valeur uniquement, pas de passage de référence)
Pourquoi est-il possible de modifier la valeur d'attribut d'une variable de référence ? Veuillez consulter la réponse ci-dessous.
Types de données en Java
Les types de données en Java sont divisés en deux catégories : les types de base et les types de référence. De manière correspondante, les variables sont également divisées en deux types : les types de base et les types de référence.
Les variables de type de base enregistrent la valeur d'origine, c'est-à-dire que la valeur qu'elle représente est la valeur elle-même ;
La valeur enregistrée par la variable de type référence est une valeur de référence, et la "valeur de référence" " pointe vers l'adresse de l'espace mémoire, représente une référence à un objet, plutôt que l'objet lui-même. L'objet lui-même est stocké à l'adresse représentée par la valeur de référence.
Les types de base incluent : byte, short, int, long, char, float, double, Boolean, returnAddress.
Les types de référence incluent : les classes, les types d’interface et les tableaux.
Il n'y a que du transfert de valeur en java
Dans le codage quotidien, vous verrez souvent le phénomène suivant :
1 Pour les paramètres de type de base, dans la méthode, la réaffectation des paramètres dans le corps ne modifiera pas la valeur de la variable d'origine.
2. Pour les paramètres de type référence, la réaffectation d'une référence au paramètre dans le corps de la méthode ne modifiera pas la référence détenue par la variable d'origine.
3. Les paramètres sont exploités dans le corps de la méthode sans modifier la valeur de la variable d'origine.
4. Pour les paramètres de type référence, le corps de la méthode opère sur les propriétés de l'objet pointé par le paramètre, ce qui modifiera la valeur de la propriété de l'objet pointé par la variable d'origine.
Par exemple :
public class Main { private static void getMiddleOne(boolean b, Boolean boo, Boolean[] arr){ b = true; boo = new Boolean(true); arr[0] = true; } //测试 public static void main(String[] args) { boolean b = false; Boolean boo = new Boolean(false); Boolean[] arr = new Boolean[]{false}; getMiddleOne(b, boo, arr); System.out.println(b); System.out.println(boo.toString()); System.out.println(arr[0]); /** * output: * false * false * true */ } }
Nous pouvons répondre au phénomène ci-dessus à condition de comprendre les deux points suivants :
1. value est la valeur elle-même, donc la valeur de b dans l'exemple est fausse ; parce que la classe wrapper sera automatiquement emballée et déballée, elle peut être traitée de la même manière que le type de base, donc la valeur de boo dans l'exemple est fausse. ; le tableau est un type référence, donc arr La valeur est une référence au Boolean[].
2. En Java, il n'y a que le transfert de valeur et aucun transfert de référence, donc les trois paramètres passés dans la méthode getMiddleOne sont la copie de valeur de b, la copie de valeur de boo et la copie de valeur de arr.
Comme le montrent les deux points ci-dessus, b=true et boo = new Boolean(true) exécutés dans la méthode getMiddleOne attribuent de nouvelles valeurs à leurs copies, donc la valeur de la variable d'origine n'est pas modifié ; De même, arr[0] = true copie true sur le premier élément du tableau pointé par la copie de arr La valeur de arr et la valeur de la copie de arr sont toutes deux des références au tableau, donc la copie. de arr pointe vers Le tableau et le tableau pointé par arr sont les mêmes, donc changer les éléments du tableau copiés par arr affectera également la variable d'origine arr.
Résumé
Il n'y a que le transfert de valeur en Java. Les types de base transfèrent une copie de la valeur et les types de référence transfèrent une copie de la référence
.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!