Parametres


📦 Les paramètres & le passage par valeur / par référence en Java

Quand tu appelles une méthode, tu peux lui transmettre des informations : ce sont les paramètres.

Mais comment sont-ils transmis ? Est-ce que la méthode peut modifier les variables d’origine ? C’est là qu’interviennent les notions de passage par valeur et passage par référence.


🎁 Définir et utiliser des paramètres

Une méthode peut recevoir un ou plusieurs paramètres :

public static void direBonjour(String nom) {
    System.out.println("Bonjour, " + nom + " !");
}

🧪 Utilisation :

direBonjour("Alice"); // Bonjour, Alice !

🔁 Passage de paramètres : par valeur

En Java, les paramètres sont toujours passés par valeur. Mais attention : cela ne signifie pas toujours la même chose selon le type de la donnée.


1. 📌 Types primitifs (int, double, boolean, etc.)

✅ Le contenu de la variable est copié. ⛔ La méthode ne peut pas modifier la variable d’origine.

public static void doubler(int x) {
    x = x * 2;
}

int a = 5;
doubler(a);
System.out.println(a); // Affiche 5 (pas 10)

➡️ x est une copie de a. Modifier x n’affecte pas a.


2. 📦 Objets (tableaux, String[], ArrayList, classes…)

✅ La référence vers l’objet est copiée. ⚠️ Donc la méthode peut modifier le contenu de l’objet, mais pas changer l’objet lui-même.

public static void changerPremier(int[] t) {
    t[0] = 99;
}

int[] tableau = {1, 2, 3};
changerPremier(tableau);
System.out.println(tableau[0]); // Affiche 99

➡️ On a modifié l’objet pointé, mais pas remplacé tableau.


❌ Remplacer un objet (impossible)

public static void remplacer(int[] t) {
    t = new int[]{9, 9, 9};
}

int[] monTab = {1, 2, 3};
remplacer(monTab);
System.out.println(monTab[0]); // Toujours 1

➡️ t reçoit une nouvelle référence, mais monTab ne change pas.


🧠 Résumé : valeur ou référence ?

TypePassage par…Peut modifier l’original ?
int, doubleValeur❌ Non
String[], int[], ListRéférence (copiée)✅ Oui (contenu), ❌ Non (référence)

💬 Astuce avec String

Même si String est un objet, il est immuable (immutable). Tu ne peux pas le modifier, seulement le remplacer.

public static void modifier(String s) {
    s = s + " modifié";
}

String texte = "Bonjour";
modifier(texte);
System.out.println(texte); // Affiche "Bonjour"

➡️ s est une copie de la référence. Le contenu n’est pas modifié dans l’objet d’origine.


🔥 À retenir

  • En Java, tout est passé par valeur (même les objets).
  • Pour les types primitifs : la valeur est copiée → aucun effet sur l’original.
  • Pour les objets : la référence est copiée → on peut modifier le contenu, mais pas la référence.

Exemple 1 : Type primitif (int) – aucun changement

public class Exemple1 {
    public static void ajouterUn(int n) {
        n = n + 1;
        System.out.println("Dans la méthode : " + n); // Affiche 6
    }

    public static void main(String[] args) {
        int x = 5;
        ajouterUn(x);
        System.out.println("Après la méthode : " + x); // Affiche 5
    }
}

🧠 Analyse : n est une copie de x. Modifier n ne change pas x.


Exemple 2 : Tableau (int[]) – contenu modifiable

public class Exemple2 {
    public static void mettreZero(int[] tab) {
        tab[1] = 0;
    }

    public static void main(String[] args) {
        int[] valeurs = {10, 20, 30};
        mettreZero(valeurs);
        System.out.println(valeurs[1]); // Affiche 0
    }
}

🧠 Analyse : la référence au tableau est copiée, donc on peut modifier le contenu du tableau d’origine.


Exemple 3 : Tableau – tentative de remplacement (échoue)

public class Exemple3 {
    public static void changerTableau(int[] tab) {
        tab = new int[]{99, 99, 99};
    }

    public static void main(String[] args) {
        int[] donnees = {1, 2, 3};
        changerTableau(donnees);
        System.out.println(donnees[0]); // Affiche 1
    }
}

🧠 Analyse : ici, on change la référence locale tab, mais cela n’affecte pas la variable donnees dans main.


Exemple 4 : String – pas modifié car immuable

public class Exemple4 {
    public static void ajouterSuffixe(String texte) {
        texte = texte + " ajouté";
    }

    public static void main(String[] args) {
        String message = "Bonjour";
        ajouterSuffixe(message);
        System.out.println(message); // Affiche "Bonjour"
    }
}

🧠 Analyse : String est un objet immuable. La méthode modifie une copie de la référence, mais pas le contenu.


Exemple 5 : String[] – modifiable car tableau

public class Exemple5 {
    public static void modifier(String[] mots) {
        mots[0] = "Salut";
    }

    public static void main(String[] args) {
        String[] phrases = {"Bonjour", "tout le monde"};
        modifier(phrases);
        System.out.println(phrases[0]); // Affiche "Salut"
    }
}

🧠 Analyse : Comme avec les tableaux int[], le contenu du tableau String[] peut être modifié, car on passe une copie de la référence.