235 votes

Les tableaux sont-ils transmis par valeur ou par référence en Java ?

Les tableaux ne sont pas une type primitif en Java, mais ils ne sont pas non plus des objets Les données sont-elles transmises par valeur ou par référence ? Cela dépend-il de ce que contient le tableau, par exemple des références ou un type primitif ?

4voto

Steven McGrath Points 1147

La discussion définitive sur les tableaux se trouve à http://docs.oracle.com/javase/specs/jls/se5.0/html/arrays.html#27803 . Cela montre clairement que les tableaux Java sont des objets. La classe de ces objets est définie en 10.8.

Section 8.4.1 de la spécification du langage, http://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#40420 décrivent comment les arguments sont transmis aux méthodes. Comme la syntaxe Java est dérivée de C et C++, le comportement est similaire. Les types primitifs sont transmis par valeur, comme en C. Lorsqu'un objet est transmis, une référence d'objet (pointeur) est transmise par valeur, reflétant la syntaxe C de transmission d'un pointeur par valeur. Voir 4.3.1, http://docs.oracle.com/javase/specs/jls/se5.0/html/typesValues.html#4.3 ,

En termes pratiques, cela signifie que la modification du contenu d'un tableau dans une méthode est reflétée dans l'objet tableau dans la portée de l'appel, mais que la réaffectation d'une nouvelle valeur à la référence dans la méthode n'a aucun effet sur la référence dans la portée de l'appel, ce qui est exactement le comportement que vous attendez d'un pointeur vers un struct en C ou un objet en C++.

Au moins une partie de la confusion terminologique provient de l'histoire des langages de haut niveau avant l'utilisation courante du C. Dans les langages de haut niveau antérieurs, populaires, la référence directe à la mémoire par adresse était à éviter autant que possible, et on considérait que le rôle du langage était de fournir une couche d'abstraction. Il était donc nécessaire que le langage supporte explicitement un mécanisme permettant de renvoyer des valeurs à partir de sous-routines (pas nécessairement de fonctions). Ce mécanisme est ce que l'on entend formellement par "passer par référence".

Lorsque le langage C a été introduit, il était accompagné d'une notion dépouillée de l'appel de procédure, où tous les arguments sont en entrée seulement, et la seule valeur renvoyée à l'appelant est un résultat de fonction. Cependant, l'objectif de passer des références pouvait être atteint par l'utilisation explicite et large de pointeurs. Puisqu'elle sert le même objectif, la pratique consistant à passer un pointeur comme référence à une valeur est souvent appelée familièrement "passage par référence". Si le sémantique d'un appel de routine pour un paramètre à passer par référence, le syntaxe du C exige du programmeur qu'il passe explicitement un pointeur. Le passage d'un pointeur par valeur est le modèle de conception pour implémenter la sémantique pass by reference en C.

Comme il semble souvent que le seul but des pointeurs bruts en C est de créer des bogues de plantage, les développements ultérieurs, en particulier Java, ont cherché à revenir à des moyens plus sûrs de passer des paramètres. Cependant, la prédominance du C a incité les développeurs à imiter le style familier du codage C. Le résultat est que les références sont passées de façon similaire aux pointeurs, mais sont implémentées avec plus de protections pour les rendre plus sûres. Une alternative aurait été la syntaxe riche d'un langage comme Ada, mais cela aurait présenté l'apparence d'une courbe d'apprentissage malvenue, et aurait diminué l'adoption probable de Java.

En bref, la conception du passage des paramètres pour les objets, y compris les tableaux, en Java, est essentiellement destinée à servir l'objectif de l'entreprise. sémantique l'intention de passer par référence, mais il est implémenté avec l'élément syntaxe de passer une référence par valeur.

1voto

Jeff Watkins Points 4388

C'est un peu un piège en réalité... Même les références sont transmises par valeur en Java, d'où un changement de la référence elle-même qui est scopée au niveau de la fonction appelée. Le compilateur et/ou la JVM transformeront souvent un type de valeur en une référence.

0voto

Gigaquad Points 158

Les tableaux sont transmis par référence. Veuillez consulter le lien. http://mathbits.com/MathBits/Java/arrays/ArrayMethod.htm

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X