pdf - e-book - archive - github.com

1.9  Objets

Dans un langage de programmation, un type est

En plus des types primitifs, il est possible en Java de créer ses propres types. On appelle type construit un type non primitif, c’est-à-dire composé de types primitifs. Certains types construits sont fournis dans les bibliothèques du langage. Si ceux-là ne vous satisfont pas, vous avez la possibilité de créer vos propres types.

1.9.1  Création d’un type

Nous souhaitons créer un type Point dans R2. Chaque variable de ce type aura deux attributs, une abscisse et une ordonnée. Le type point se compose donc à partir de deux types flottants. Un type construit s’appelle une classe. On le définit comme suit :

public class Point
{
        float abscisse;
        float ordonnee;
}

Les deux attributs d’un objet de type Point s’appelle aussi des champs. Une fois définie cette classe, le type Point est une type comme les autres, il devient donc possible d’écrire

Point p, q;

Cette instruction déclare deux variables p et q de type Point, ces variables s’appellent des objets. Chacun de ces objets a deux attributs auxquels on accède avec la notation pointée. Par exemple, l’abscisse du point p est p.abscisse et son ordonnée est p.ordonnee. Le fonctionnement est, pour le moment, le même que pour les structures en C.

1.9.2  Les méthodes

Non contents d’avoir défini ainsi un ensemble de valeurs, nous souhaiterions définir un ensembe d’opérations sur ces valeurs. Nous allons pour ce faire nous servir de méthodes. Une méthode est un sous-programme propre à chaque objet. C’est-à-dire dont le contexte d’exécution est délimité par un objet. Par exemple,

public class Point
{
    float abscisse;
    float ordonnee;

    void presenteToi()
    {
 System.out.println("Je suis un point, mes coordonnées sont (" 
      + abscisse + ", " + ordonnee + ")");
    }       
}

La méthode presenteToi s’invoque à partir d’un objet de type Point. La syntaxe est p.presenteToi()p est de type Point. p est alors le contexte de l’exécution de presenteToi et les champs auquel accèdera cette méthode seront ceux de l’objet p. Si par exemple, on ecrit q.presenteToi(), c’est q qui servira de contexte à l’exécution de presenteToi. Lorsque l’on rédige une méthode, l’objet servant de contexte à l’exécution de la méthode est appelé l’objet courant.

1.9.3  L’instanciation

Essayons maintenant, impatients et nerveux, de vérifier ce que donnerait l’exécution de

public class Point
{
    float abscisse;
    float ordonnee;
    
    void presenteToi()
    {
 System.out.println("Je suis un point, mes coordonnées sont (" 
      + abscisse + ", " + ordonnee + ")");
    }       
        
    public static void main(String[] args)
    {
 Point p;
 p.abscisse = 1;
 p.ordonnee = 2;
 p.presenteToi();
    }
}

Pas de chance, ce programme ne compile pas. Et davantage pointilleux que le C, le compilateur de Java s’arrête au moindre petit souci... Le message d’erreur à la compilation est le suivant :

Point.java:15: variable p might not have been initialized
        p.abscisse = 1;
        ^
1 error

Que peut bien signifier ce charabia ? Cela signifie que le compilateur a de très sérieuses raisons de penser que p contient pas d’objet. En Java, toutes les variables de type construit sont des pointeurs. Et les pointeurs non initialisés (avec malloc en C) sont des pointeurs ayant la valeur null. Pour faire une allocation dynamique en Java, on utilise l’instruction new. On fait alors ce que l’on appelle une instanciation. La syntaxe est donnée dans l’exemple suivant :

p = new Point();

Cette instruction crée un objet de type Point et place son adresse dans p. Ainsi p n’est pas un objet, mais juste un pointeur vers un objet de type Point qui a été crée par le new. Et à partir de ce moment-là, il devient possible d’accéder aux champs de p. new fonctionne donc de façon similaire à malloc et le programme suivant est valide :

package classes;

public class Point
{
 float abscisse;
 float ordonnee;

 void presenteToi()
 {
  System.out.println("Je suis un point, mes coordonnees sont ("
    + abscisse + ", " + ordonnee + ")");
 }

 public static void main(String[] args)
 {
  Point p;
  p = new Point();
  p.abscisse = 1;
  p.ordonnee = 2;
  p.presenteToi();
 }
}

Télécharger le fichier

Vous remarquez qu’il n’y a pas de fonction de destruction ( free() en C). Un programme appelé Garbage Collector (ramasse-miette en français) est exécuté dans la machine virtuelle et se charge d’éliminer les objets non référencés.

1.9.4  Les packages

Bon nombre de classes sont prédéfinies en Java, elles sont réparties dans des packages, pour utilisez une classe se trouvant dans un package, on l’importe au début du fichier source. Pour importer un package, on utilise l’instruction import.

1.9.5  Le mot-clé this

Dans toute méthode, vous disposez d’une référence vers l’objets servant de contexte à l’exécution de la méthode, cette référence s’appelle this.