next up previous contents index
suivant: 3.3 Membres statiques monter: 3. Classes d'objets précédent: 3.1 Classes et instances,   Table des matières   Index


3.2 Méthodes

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.


3.2.0.0.1 Invocation

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 \oeuvre dans ces diverses étapes : la résolution de la surcharge, la liaison tardive, le passage des arguments par valeur.

3.2.0.0.2 Passage par valeur

Dans le cas d'un type de références (tableau, classe ou interface), la valeur de l'argument n'est pas l'objet lui-même, mais une référence à cet objet. Par exemple, la procédure PassageParValeur.test 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 test :

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é.


next up previous contents index
suivant: 3.3 Membres statiques monter: 3. Classes d'objets précédent: 3.1 Classes et instances,   Table des matières   Index
Rene' LALEMENT 2001-11-07