La description des opérations réalisées lors de l'invocation d'une méthode spécifie la relation entre l'argument, qui figure dans l'expression d'invocation, et le paramètre correspondant, qui figure dans la définition de la méthode : pour chaque paramètre d'une méthode, et pour chaque invocation, il y a création d'une variable dans son cadre d'invocation et initialisation de cette variable par la valeur de l'argument correspondant. Les affectations à un paramètre ne peuvent donc pas modifier la valeur de l'argument correspondant. Par exemple, la procédure f() suivante, après avoir initialisé le paramètre x à la valeur de l'argument n, lui affecte 0 (et n'en fait rien d'utilisable), mais ne modifie évidemment pas la variable n :
class Test { static void f(int x) { x = 0; } public static void main(String[] args) { int n = 4; f(n); System.out.println("n = " + n); // --> n = 4 } }
Dans le cas d'un type de références (tableau, classe ou interface), la valeur n'est bien sûr pas l'objet lui-même, mais une référence à cet objet. Par exemple, la procédure f() suivante, après avoir initialisé le paramètre x à la valeur de p (qui est une référence au point (2,3)), lui affecte une référence au point (0,0), ce qui ne modifie pas la variable p, utilisée comme argument de f().
class Test { static void f(Point x) { x = new Point(); } public static void main(String[] args) { Point p = new Point(2, 3); f(p); System.out.println("x=" + p.x + ", y=" + p.y); // x=2, y=3 } }
Cependant, à la différence d'une valeur d'un type primitif, une méthode ou l'accès à un champ peut être appliqué à une référence, et l'objet référencé peut être modifié de cette façon :
class Test { static void f(Point x) { x.translater(1, 1); } public static void main(String[] args) { Point p = new Point(2, 3); f(p); System.out.println("x=" + p.x + ", y=" + p.y); // x=3, y=4 } }
Dans ce cas, la méthode f() ne modifie pas la valeur de son argument, qui reste une référence au même objet, mais elle modifie l'objet référencé. Signalons que certains langages, comme Pascal ou C++, disposent d'un autre mode de passage des arguments, le passage par référence, qui permet de modifier la valeur de l'argument.
Comme les données des types primitifs (int, double, etc) ne sont par référencées, il n'est pas possible d'écrire de méthodes qui aient le même effet pour les types primitifs. Par exemple, les expressions x++ et ++x qui incrémentent de 1 la valeur de la variable x ne peuvent être définies par des méthodes ; signalons au passage que la première a comme valeur celle de x avant l'incrémentation, et la seconde, après l'incrémentation1.3.