Table des matières
Java est-il transmis par valeur ou par référence ?
Maison Problème commun Java est-il passé par valeur ou par référence ?

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

Sep 08, 2022 pm 02:47 PM
java

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4