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 ?
- Java est-il "pass-by-reference" ou "pass-by-value" ? (5 réponses )
Réponses
Trop de publicités?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.
Les tableaux sont transmis par référence. Veuillez consulter le lien. http://mathbits.com/MathBits/Java/arrays/ArrayMethod.htm
- Réponses précédentes
- Plus de réponses