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.
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.
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()
où
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.
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(); } }
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.
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
.
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
.