Maison > Problème commun > le corps du texte

Java est-il passé par valeur ou par référence ?

WBOY
Libérer: 2022-09-08 14:47:09
original
14279 Les gens l'ont consulté

Java est un transfert de valeur ; le transfert de valeur signifie transmettre une copie des paramètres réels à la méthode lors de l'appel d'une méthode, de sorte que si les paramètres sont modifiés dans la méthode, cela n'affectera pas les paramètres réels lorsqu'un type de base est transmis ; Lorsqu'un type de référence est transmis, une copie de la valeur est transmise et les modifications apportées à la variable copiée n'affectent pas la variable d'origine. Lorsqu'un type de référence est transmis, une copie de l'adresse de référence est transmise, mais l'adresse copiée et le ; Les adresses réelles pointent toutes deux vers les mêmes données réelles, donc la valeur de la variable d'origine peut être modifiée.

Java est-il passé par valeur ou par référence ?

L'environnement d'exploitation de ce tutoriel : système Windows 10, ordinateur DELL G3.

Java est-il transmis par valeur ou par référence ?

Java est transmis par valeur.

Lorsqu'un type de base est transmis, une copie de la valeur est transmise et les modifications apportées à la variable copiée n'affectent pas la variable d'origine ; lorsqu'un type de référence est transmis, une copie de l'adresse de référence est transmise, mais la variable copiée est transmise. l'adresse est différente de la vraie Les adresses pointent vers les mêmes données réelles, donc la valeur dans la variable d'origine peut être modifiée lorsque le type String est passé, bien que l'adresse de référence soit copiée et pointe vers les mêmes données, la valeur String ne peut pas être modifié, donc la valeur de la variable d'origine ne peut pas être modifiée.

Tout d’abord, expliquons ce qui passe par référence et ce qui passe par valeur.

  • Le passage par référence fait référence au fait de transmettre l'adresse des paramètres réels directement à la méthode lors de l'appel de la méthode. Ensuite, la modification des paramètres dans la méthode affectera les paramètres réels.

  • Passer par valeur signifie transmettre une copie des paramètres réels à la méthode lors de l'appel d'une méthode, de sorte que si les paramètres sont modifiés dans la méthode, les paramètres réels ne seront pas affectés.

Donc en Java, est-ce un passage par référence ou un passage par valeur ? En fait, cette question a été débattue en permanence et le responsable n'a pas donné de réponse définitive. Mais d'après ce que je comprends, Java est un transfert de valeur.

Regardons d'abord un exemple simple :

public void test() {
    int a = 1;
    change(a);
    System.out.println("a的值:" + a);
}
private void change(int a) {
    a = a + 1;
}
// 输出
a的值:1
Copier après la connexion

définit une variable de type de base a dans la méthode test(), puis appelle la méthode change() pour essayer de modifier la variable, et la valeur d'origine est toujours affichée.

Tout d'abord, il faut être clair que les variables locales d'une méthode sont stockées sur la pile. S'il s'agit d'une variable de type basique, la valeur de cette variable est stockée directement. S'il s'agit d'une variable de type référence, l'adresse de. la valeur est stockée, pointant vers la valeur spécifique dans le tas.

Dans l'exemple ci-dessus, le a transmis lors de l'appel de la méthode change() est en fait une copie de la variable a, pas le vrai a. Ce qui est modifié dans la méthode change() est une copie, qui n'a aucun effet sur le a. vrai un.

En regardant les choses de cette façon, Java est bien un transfert de valeur, mais si nous regardons l'exemple suivant, vous serez confus

public void test() {
   User user = new User();
   user.setAge(18);
   change(user);
   System.out.println("年龄:" + user.getAge());
}
private void change(User user) {
   user.setAge(19);
}
// 输出
年龄:19
Copier après la connexion

Regardez, les propriétés de l'objet ont été modifiées, n'est-ce pas un transfert de valeur ? ne change pas, ceci À ce moment-là, quelqu'un a conclu que lorsque la valeur transmise est un type de base, elle est transmise par valeur, et lorsque la valeur transmise est un type référence, elle est transmise par référence. Est-ce vraiment le cas ?

Pour analyser ce problème, nous devons savoir comment les variables sont stockées dans jvm.

Premièrement regardez le type de base. C'est très simple. La variable stocke la valeur directement sur la pile. Ce qui est transmis à la méthode change() est une copie de la variable, donc les modifications apportées à la variable copiée n'affecteront pas la valeur. valeur de la variable d'origine.

Ensuite, regardez le type de référence. La variable stockée dans la pile est l'adresse de référence. Cette adresse pointe vers la valeur spécifique dans le tas, comme indiqué ci-dessous :

Java est-il passé par valeur ou par référence ?

Lorsque la méthode change() est appelée. passe dans la variable, la variable est également copiée, mais la copie ici n'est que l'adresse de référence dans la pile, et ne copie pas les données dans le tas, elle deviendra donc comme l'image suivante :

Java est-il passé par valeur ou par référence ?

Bien que le La variable est copiée, l'adresse pointée est la même, donc l'adresse dans la variable est Lorsque les données sont modifiées, cela affectera toujours la variable réelle d'origine. Cependant, si nous modifions l'adresse de la variable sur la pile, cela affectera. n'affecte pas la variable d'origine. Par exemple, le code suivant :

public void test() {
   User user = new User();
   user.setAge(18);
   change(user);
   System.out.println("年龄:" + user.getAge());
}
private void change(User user) {
   user = new User();
   user.setAge(19);
}
// 输出
年龄:18
Copier après la connexion

Il s'agit de modifier la variable sur la pile. L'adresse dans n'affectera pas la variable d'origine.

À ce stade, tout le monde le comprend presque, mais en repensant à la question d'origine, une variable de type String est transmise. String est un type de référence. Il va de soi que la variable d'origine sera modifiée. Pourquoi le résultat. inchangé ?

La variable String est assez spéciale. Nous pouvons voir dans le code source de String que la valeur de String est conservée via le tableau char[] interne, mais ces données sont définies comme type final. Par conséquent, la valeur de String est immuable. Lorsque nous modifions habituellement la valeur de String, nous créons en fait un nouvel objet String. Par exemple, dans le code suivant :

String a = "hello";
a = "world";
Copier après la connexion

Dans ce code, la variable a n'est pas réellement modifiée en world, mais un nouvel objet String est créé. Cet objet La valeur de est world, et l'adresse de référence de cet objet est attribuée à a. Le hello d'origine est toujours dans le tas, mais cette valeur n'est pas référencée et sera récupérée par gc après un certain temps.

Les changements dans la mémoire de la valeur passée par la variable String sont les suivants :

Java est-il passé par valeur ou par référence ?

String copie l'adresse de la variable, mais elle ne peut pas modifier la valeur de la chaîne d'origine. Étant donné que String est immuable, un nouvel objet String est créé dans la méthode change(), et ce qui change est la valeur du nouvel objet. La variable d'origine n'a aucun effet.

Pour plus de connaissances connexes, veuillez visiter la rubrique FAQ !

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!