Non, elle est passée par valeur, donc "en gros" par copie. La modification est purement locale à la méthode. Dis toi pour faire simple que toutes les variable en paramètre d'une méthode sont locales à la méthode (c'est le principe du passage par valeur). Les modification de n n'influencent pas l'appelant
La variable y est locale à la méthode. Mais tableau est un objet. Donc y n'est qu'une référence. De même tabn n'est qu'un référence. Ainsi y est un référence, locale à la méthode, mais qui référence le même tableau que la variable tabn. On a donc bien copié la référence, mais pas l'objet. Dis toi pour faire simple que, en java, il est très dur de faire un copie d'un objet, rien n'est prévu en standard pour ça. Donc le jour où un objet sera "copié", tu ne pourra pas ne pas le voir
Concrètement, comme tu va modifier le contenu de l'objet (valeur à l'indice 0) et non pas la référence (tu ne crée par par exemple un nouveau tableau), tu affecte aussi l'appelant.
Le String est un objet. Donc on a passé une copie de la référence vers le même objet que le main. Par contre, ici, dans ton code, on ne modifie pas le contenu de la String (les String sont particulières car immutable donc de toutes façons, ça aurait été impossible). Mais, on modifie la référence z, en lui attribuant une référence vers une nouvelle String. Comme je l'ai dit, les références, comme les autres variables, sont locale à la méthode. Si je modifie un référence, je ne fais la modification que en local dans la méthode. La variable s dans le main, elle, ne change pas.
Un schéma simple à suivre:
public void uneMethode(? a) (peu importe le ?)
- si je fais a = ..... <- changement purement local à la méthode, pas d'influence sur l'appelant, puis qu'on ne fait qu'affecter une nouvelle valeur à a
- si je fais a.xyz(...) <- affecte l'appelant si xyz fait des changement dans l'objet. Exemple la méthode add() sur un ArrayList, la méthode setNom() sur une Personne, ....
- si je fais a[...] = ... <- affecte l'appelant puisqu'on change une case du tableau
Après, c'est de la logique. Si je fait a=.... puis qu'ensuite je fait a.xyz(....) je ne change rien dans l'appelant. Le premier a = .... donne un nouvel objet comme référence à a, toutes les modification se faisant ensuite sur cet objet, ce n'est pas le même que dans l'appelant.
Partager