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.

1. Passage par valeur (types primitifs)

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.

2. Passage par référence (objets)

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.

3. Changement de la référence (attention aux affectations)

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.

4. Les chaînes de caractères (String)