JavaRush /Blog Java /Random-FR /Passer des paramètres en Java
vincent_vega
Niveau 24
Gainesville

Passer des paramètres en Java

Publié dans le groupe Random-FR
Une variable en Java est un conteneur contenant une valeur. Alors, que signifie « passer » une variable ? Et quelle est la différence entre les types de données primitifs et de référence.
Passer des paramètres en Java - 1
Nous y reviendrons plus tard. Commençons par un devoir simple. Ce que fait ce code :

int х = 3;
int у = х;
À la ligne 1, une variable x de type int est créée et reçoit la valeur 3. Sur la ligne 2, une variable y de type int est créée et reçoit la valeur de la variable x . À l'avenir, la variable x n'affectera en aucune façon y . Java copie la valeur de x (3) et place cette copie dans y . Ceci passe un paramètre par valeur. Vous n'écrivez pas une variable dans une autre. La valeur est copiée et affectée à une nouvelle variable. Expression y = x ; Cela ne signifie PAS "écrire x dans y ". Cela signifie "copiez la valeur à l'intérieur de x et écrivez cette copie dans y ". Si plus tard je change y :

у = 34;
Cela affectera-t- il x ? Bien sûr que non. x a toujours la valeur 3. Si je change x plus tard :

х = 90;
Comment cela va-t-il vous affecter ? Certainement pas. Ils ne sont en aucun cas liés une fois l'affectation effectuée (COPIE de la valeur). Qu’en est-il des types de référence ? Comment travaillent-ils? Ce n’est pas si difficile, en fait la règle est la même. Les liens font la même chose : vous obtenez une copie du lien. Alors si je dis :

Cat A = new Cat ();
Cat B = A;
Le lien A est copié vers le lien B. Cela ne s'applique pas à l'objet - vous n'avez toujours qu'un seul objet. Mais vous disposez désormais de deux références différentes contrôlant le même objet Cat . Voyons maintenant comment passer des paramètres aux méthodes. Java transmet les paramètres par valeur. Toujours. Cela signifie « copier la valeur et transmettre la copie ». Pour les types primitifs, c'est simple :

int х = 5;
doStuff (х); / / Передать копию х (meaning 5) в метод doStuff
La méthode doStuff ressemble à ceci :

void doStuff (int у) {
 
   / / Действия с 'y'
}
Une copie de la valeur de x , c'est-à-dire 5, est transmise à la méthode doStuff() . La méthode doStuff() possède sa propre variable appelée y . La variable y est une nouvelle variable différente. Avec une copie de ce qui se trouvait dans x au moment de le transmettre à la méthode. Désormais, y et x n’ont plus d’effet l’un sur l’autre. Lorsque vous modifiez y , vous n'affectez pas x .

void doStuff (int у) {
 
   у = 27; / / Это не влияет на 'х'
}
Et vice versa : si vous changez x , vous ne changerez pas y . La seule chose que x a fait dans ce cas a été de copier sa valeur et de la transmettre à la méthode doStuff() . Comment fonctionne le « passage par valeur » avec les références ? Trop de gens disent : « Java transmet les types primitifs par valeur et les objets par référence ». Ce n'est pas ce qu'ils disent. Java transmet tout par valeur. Avec les primitives, vous obtenez une copie du contenu. Avec les liens, vous obtenez également une copie du contenu. Mais quel est le contenu du lien ? Télécommande. Installations pour gérer/accéder à l’installation. Lorsque vous transmettez une référence à un objet à une méthode, vous transmettez une copie de la référence. Clone de la télécommande. L’objet est toujours dans la pile où il a été créé, attendant que quelqu’un utilise la télécommande. L'établissement ne se soucie pas du nombre de télécommandes « programmées » pour le contrôler. Les seules personnes qui s'en soucient sont le ramasse-miettes et vous, le programmeur. Alors quand tu dis :

Cat A = new Cat ();
doStuff (А);
 
void doStuff (Cat B) {
 
   / / Использование B
}
Il n'y a qu'un seul objet Cat . Mais désormais, deux télécommandes (liens) peuvent accéder au même objet Cat . Alors maintenant, tout ce que B fait à l' objet Cat affectera le Cat pointé par A , mais cela n'affectera pas le contenu de A ! Vous pouvez modifier Cat en utilisant le nouveau lien B (copié directement depuis A ), mais vous ne pouvez pas modifier A. Qu'est-ce que ça veut dire ? Vous pouvez modifier l'objet auquel A fait référence , mais vous ne pouvez pas modifier la référence de A - redirigez-le vers un autre objet ou null . Donc, si vous modifiez la référence de B (pas l'objet Cat réel auquel B fait référence , mais la valeur de la référence elle-même), vous ne modifierez pas la valeur de A . Et vice versa. Donc:

Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {
 
   B = new Cat (); / / Не повлияет на ссылку A
}
Cela signifie simplement que B pointe vers un autre objet. A est toujours heureux. Alors répétez après moi : Java transmet tout par valeur. (D'accord, encore une fois... avec émotion.) Java transmet tout par valeur. Pour les types primitifs, vous transmettez une copie de la valeur actuelle, pour les références d'objet, vous transmettez une copie de la référence (télécommande). Vous ne passez jamais l'objet. Tous les objets sont stockés sur le tas. Toujours. Maintenant, préparez une bonne tasse de café et écrivez du code ! Article original .
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION