Java est-il passé par valeur ou par référence ?
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.
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
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
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 :
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 :
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
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";
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 :
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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.

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.

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.

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.

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.

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

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.

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