8
votes

Quelle est la différence entre Pass par référence et appelez par référence?

Quelle est la différence entre Pass par référence et appelez par référence en Java?


5 commentaires

"Pass" et "appel" sont des choses différentes, pas des versions différentes de la même chose. Voulez-vous dire «passer par référence» et «passer par valeur»?


@Jim Garrison - apparemment "appel par référence" est un synonyme de réussite par référence, sinon dit Wikipedia .


@RICHARD - Si vous faites une réponse, je vais le remettre.


@StriPlingwarrior - hahahaha ne s'est même pas arrivé à moi: P Je passerai tout ce vote (merci néanmoins: D)


Dupliqué possible de passe Java par référence?


3 Réponses :


11
votes

Java n'accumule aucune variables par référence.

Il est tentant de penser aux objets adoptés par référence à Java - mais nocif. Les variables de type d'objet sont des références. Lorsqu'ils sont passés, ils sont passés par la valeur.

Dans d'autres langues, la transmission-référence et l'appel-par-référence sont la même chose.

edit: Plus de détails est fourni dans la question Stackoverflow existante " Est-ce que Java passe par référence? " (spoiler: no.)


17 commentaires

Les objets ne sont-ils pas passés par référence?


Techniquement, ils sont transmis par la valeur, mais leur valeur est une référence. Si vous avez passé un objet FOO dans une méthode, puis "FOO = nouvel objet ()", la variable de méthode d'appel qui a été transmise dans la méthode resterait inchangée.


En Java, tout est passé par la valeur. passer par la valeur. passer par la valeur. Il est précis de dire que les références Java sont transmises par la valeur. Cela signifie que si vous avez une référence à un objet, A et vous transmettez cette référence à un appel de méthode, la référence A est copiée en b. Maintenant b et un point sur le même objet.


Non, une variable "objet" est une variable contenant une référence à un objet. Lorsqu'une telle variable est transmise en tant que paramètre, elle est transmise par la valeur. La valeur, dans ce cas, est une référence. Ceci est très différent de transmettre en fait l'objet par référence, car si vous, par exemple, réaffecter le paramètre à pointer vers quelque chose de différent, cela n'aura aucun effet sur l'objet transmis. Cela ne serait pas vrai si l'objet était réellement adopté par référence.


@StriPlingwarrior @ hvgotcodes @jacobm - Je vois ... donc le . sert à désaffectiver ainsi que d'accéder à un membre de l'objet?


Que diriez-vous du tableau? Je pense que c'est adopté par référence


@Jagan: Aucun dépassement d'une copie d'une référence n'est adopté par la valeur. C'est une copie!


@Jancrot: Le même principe s'applique avec des tableaux: il est vrai que votre variable est une référence à la structure de données réelle, mais lorsque vous le transmettez, copiez cette référence, et personne ne peut rediriger la référence que vous tenez toujours.


@Michael Clerex: Passez ensuite par référence et appelez par référence sont identiques ......? Si oui, pourquoi deux noms différents .....?


@jagan, c'est ce que j'ai dit. Les références sont transmises par la valeur. Ce n'est que parce que Java appelle des références aux références, cela ne signifie pas que la transmission d'une référence à une méthode est «pass-référence». S'ils les ont appelés les pointeurs, cela ne le ferait pas passer par le pointeur. Java n'est passé que par la valeur.


@Jagan: Je ne sais pas, je n'ai jamais rencontré le terme "appel par référence" auparavant. Pardon!


Pour ce que ça vaut la peine, mon article de blog est à ce sujet: whiteboxcomputing.com/java/references_and_integrity


@Michael Clerex: En C ++, nous avons appelé référence ... Ceci est écrit dans la référence complète pour C ++ par Herbert Schildt Text Book


@jagan, passe par référence, ce serait le scénario suivant - vous faites obj = nouvel objet (); Ensuite, vous passez obj à une fonction. Si, dans la fonction, vous avez fait obj = nouvel objet (), puis obj dans la portée où vous avez appelé la fonction indiquerait le 2e objet. En Java, l'OBJ dans les fonctions d'appel de la portée pointe sur le premier objet. La référence dans la fonction, qui a été transmise par valeur, pointe vers le deuxième objet après le nouvel objet () appel


@Jagan, j'ai vu le terme appelé-référence utilisé et défini dans un texte sur les langages de programmation. J'utilise personnellement "passe-passe-référence", ce qui évoque mieux passer un paramètre. Quant à la raison pour laquelle nous avons plusieurs termes pour le même concept, je ne pouvais que spéculer / conjecturer / deviner. :)


Donc, l'appel-par-référence est la même chose que celle-ci? Que signifie cette réponse?


@Athergranite - Non, Call-By-Référence est pas la même chose que la valeur de passage, dans n'importe quelle langue. L'OP demande à Java, dans lequel des arguments sont toujours passés par la valeur.



9
votes

Concept important - Java n'a pas de concept de "passe par référence". Tout dans Java est passé par la valeur. Lorsque vous passez une référence d'objet à un paramètre dans un appel de méthode, ce que vous faites vraiment, cela passe une valeur qui pointe vers la référence de votre objet.

Les URL suivantes expliquent cela plus en détail: http://www.javaworld.com/javaworld /javaqa/2000-05/03-qa-0526-pass.html et http://javadade.com/articles/passbyvalue.htm?repost

Apparemment (comme indiqué dans les commentaires de votre question), les termes "pass par référence" et "appel par référence" signifient la même chose.


0 commentaires

1
votes

Vous avez demandé mais «passer par référence» et «appelez par référence» sont la même chose.

Si vous recherchez une différence entre Pass par référence et passe par valeur, vérifiez les réponses à

passe par référence ou passe par valeur?

mais rappelez-vous, Java passe le paramètre par valeur.

http://javadade.com/articles/passbyvalue.htm

http://academic.regis.edu/dbahr/generalpages/introtoprogrammation /Javapassbyvalue.htm


0 commentaires