Les méthodes sont analogues aux fonctions mais s'appliquent à une instance de classe. Contrairement aux fonctions, la définition d'une méthode ne commence pas par le mot-clé static.
La seule opération que l'on peut faire sur une méthode est de
l'invoquer, ou de l'appeler avec des arguments. Une
invocation, ou appel de méthode, est une expression formée
à partir d'une expression cible, d'un «
.
», du nom de la méthode invoquée et d'une liste d'arguments
placés entre « ( » et « ) », par exemple
p.translater(1,1). L'expression cible peut être un nom
(par exemple, p), et en particulier
this ; l'invocation
this.m(...) peut être simplifiée en m(...) à
l'intérieur de la classe dont m est une méthode. Comme pour
les fonctions, le nombre des arguments (dans l'expression d'invocation)
et le nombre des paramètres (dans la définition de la méthode) doivent
être identiques ; le type d'un argument doit être égal au type du
paramètre correspondant ou doit en être un sous-type.
L'évaluation d'une invocation de méthode se fait en plusieurs étapes.
Certaines étapes, fondées uniquement sur le type de l'expression cible
et sur les types des arguments sont effectuées à la compilation.
D'autres étapes nécessitent la connaissance de l'objet cible, et ne
peuvent se faire qu'à l'exécution. Plusieurs traits importants sont mis
en uvre dans ces diverses étapes : la résolution de la surcharge,
la liaison tardive, le passage des arguments par valeur.
package geometrie; class PassageParValeur { static void test(Point x) { x = new Point(); } public static void main(String[] args) { Point p = new Point(2, 3); test(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 :
package geometrie; class ModificationObjet { static void test(Point x) { x.translater(1, 1); } public static void main(String[] args) { Point p = new Point(2, 3); test(p); System.out.println("x=" + p.x + ", y=" + p.y); // x=3, y=4 } }
Dans ce cas, la procédure ModificationObjet.test 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é.