Previous Up

B.3.7  Passage par valeur

La règle générale de Java est que les arguments sont passés par valeur. Cela signifie que l’appel de méthode se fait par copie des valeurs passées en argument et que chaque appel de méthode dispose de sa propre version des paramètres. On doit noter que Java est ici parfaitement cohérent : si une méthode f possède un argument int x, alors l’appel f(2) revient à créer, pour la durée de l’exécution de cet appel une nouvelle variable (de nom x) qui est initialisée à 2.

Examinons un exemple.

  static void dedans(int i) {
    i = i+2 ;
    System.out.println("i=" + i)
  }

  static void dehors(int i) {
     System.out.println("i=" + i) ;
     dedans(i) ;
     System.out.println("i=" + i) ;
   }

L’appel de dehors(0) se traduira par l’affichage de trois lignes i=0, i=2, i=0. C’est très semblable à l’exemple sur la structure de bloc. Ce qui compte c’est la portée des variables. Le résultat est sans doute moins inattendu si on considère cet autre programme rigoureusement équivalent :

  static void dedans(int j) { //  change ici i -> j
    j = j+2 ;
    System.out.println("j=" + j)
  }

  static void dehors(int i) {
     System.out.println("i=" + i) ;
     dedans(i) ;
     System.out.println("i=" + i) ;
   }

Mais ce que l’on doit bien comprendre c’est que le nom de l’argument de dedans, i ou j n’a pas d’importance, c’est une variable muette et heureusement.

La règle du passage des arguments par valeur s’applique aussi aux objets, mais alors c’est une référence vers l’objet qui est copiée. Ceci concerne en particulier les tableaux.

// Affichage d'un tableau (d'entiers) passé en argument
  static void affiche(int[] t) {
    for (int i = 0 ; i < t.length ; i++)
      System.out.print ("t[" + i + "] = " + t[i] + " ") ;
    System.out.println() ; // sauter une ligne
  }

// trois façons d'ajouter deux
  static void dedans (int[] t) {
    t[0] = t[0] + 2;
    t[1] += 2;
    t[2]++ ; t[2]++ ;
  }

  static void dehors () {
    int[] a = {1,2,3} ; // déclaration et initialisation d'un tableau
    affiche (a) ;
    dedans (a) ;
    affiche (a) ;
  }

L’affichage est le suivant:

1 2 3
3 4 5

Ce qui illustre bien qu’il n’y a, tout au cours de l’exécution du programme qu’un seul tableau, a, t étant juste des noms différents de ce même tableau. On peut aussi renommer l’argument t en a ça ne change rien.


Previous Up