En Java, la gestion des paramètres dans les appels de méthode fonctionne principalement par copie, mais le comportement varie en fonction du type de données.
En Java, les types primitifs (comme int
, double
, char
, etc.) sont passés par valeur. Cela signifie qu'une copie de la valeur est envoyée à la méthode appelée. Toute modification de cette valeur à l'intérieur de la méthode ne modifie pas la valeur de la variable originale dans la méthode appelante.
Exemple :
public class Test {
public static void main(String[] args) {
int i = 10;
maMethode(i);
System.out.println(i); // Affiche toujours 10
}
public static void maMethode(int i) {
i = 20; // Modifie seulement la copie locale de i
}
}
Ici, i
est passé par valeur. La méthode maMethode
ne fait que modifier la copie de i
, pas la variable originale.
Lorsque l’on passe en paramètre un objet, c’est la référence de cet objet qui est envoyé (à la manière d’un pointeur). Cela signifie que la méthode peut modifier l'état de l'objet en appelant ses méthodes ou en modifiant ses attributs. Ces modifications seront visibles dans la méthode appelante.
Exemple :
public class MaClasse {
public int valeur;
public MaClasse(int v) {
this.valeur = v;
}
public void setValeur(int v) {
this.valeur = v;
}
}
public class Test {
public static void main(String[] args) {
MaClasse monObjet = new MaClasse(10);
maMethode(monObjet);
System.out.println(monObjet.valeur); // Affiche 20
}
public static void maMethode(MaClasse obj) {
obj.setValeur(20); // Modifie l'état de l'objet
}
}
Ici, la référence à monObjet
est passée à la méthode. Comme il s'agit de la même référence, les modifications faites sur obj
(via setValeur
) sont visibles dans la méthode appelante.
L'affectation d'une nouvelle référence à un objet à l'intérieur d'une méthode ne change pas la référence (et donc les attributs) dans la méthode appelante.
Exemple :
public class Test {
public static void main(String[] args) {
MaClasse monObjet = new MaClasse(10);
maMethode(monObjet);
System.out.println(monObjet.valeur); // Affiche toujours 10
}
public static void maMethode(MaClasse obj) {
obj = new MaClasse(20); // Réaffecte une nouvelle référence localement, mais ne change pas l'objet original
}
}
Dans cet exemple, même si on affecte un nouvel objet à obj
dans la méthode maMethode
, cela ne change pas la référence de monObjet
dans la méthode appelante. C'est parce que la référence passée est une copie, donc réassigner une nouvelle valeur à cette copie n'a aucun impact sur la variable originale.
String
)