Nous considérons ici la classe Point des objets qui sont des points dans un plan à deux dimensions. Les instances de cette classe disposent donc, pour décrire leur état, de deux champs, x et y, de type double.
Pour créer un point, on dispose d'un constructeur qui accepte les deux coordonnées du point que l'on veut créer.
Un constructeur est une méthode un peu
particulière puisqu'il doit avoir exactement le nom de la classe (avec
sa majuscule) et qu'il n'a pas de type de retour (en effet, lorsqu'un
tel constructeur est associé à l'opérateur new, il retourne
la référence de l'objet (l'instance) qui vient d'être alloué et
celle-ci est donc typée Point dans notre exemple.
Par ailleurs, on souhaite pouvoir effectuer deux opérations sur n'importe quel point:
Dans une classe, le mot clé
this représente la référence à l'instance courante de
cette classe. L'utilisation de ce mot-clé est donc interdite dans
toute portion de code statique.
Lorsqu'aucun constructeur n'est
explicitement défini, le compilateur
crée un constructeur implicite également appelé constructeur par
défaut. Si un constructeur explicite est défini, ce constructeur
par défaut n'est plus accessible.
On dit que ces deux constructeurs sont
surchargés: ils ont le même nom mais sont différentiables par
la liste de leurs paramètres.
La méthode toString() définie dans
la classe Point est une redéfinition de la méthode
toString() de la classe Object. En l'absence de la
première, c'est la méthode de Object, héritée dans
Point, qui est utilisée. Par défaut, elle affiche le nom de
la classe de l'objet représenté par la référence et une valeur
hexadécimale qui est un code représentant cet objet (hashcode).
Lorsque son argument n'est pas un type
primitif, mais une référence à un objet d'une classe, la méthode
println appelle automatiquement la méthode
toString() sur cette référence avant d'effectuer l'affichage
de la chaîne de caractère résultant de cet appel.
Point p1 = new Point(); Point p2 = new Point(); System.out.println(p1 == p2);
L'opérateur == agit en général sur les types
primitifs. Lorsqu'il est utilisé sur des références à des objets, il
teste l'égalité des références aux objets. En d'autre termes, il
teste les valeurs qui ont été retournées par des appels à
l'opérateur new. En ce sens, les deux points p1 et
p2 qui ont été crés correspondent à deux références
différentes, même si elles réfèrent des objets identiques
(leur état est identique).
Surchargez, dans la classe Point, la méthode public void
translate(double dx, double dy) avec une méthode public void
translate(double d) qui déplace à la fois x et
y de la valeur d. Testez cette méthode.
Tout comme les constructeurs, les méthodes
peuvent être surchargées: cela signifie que plusieurs méthodes ayant
le même nom cohabitent dans la même classe. Elle doivent se distinguer
par des listes de paramètres différents. Attention: deux méthodes ne
peuvent pas avoir le même nom et les même paramètres, même si elles
ont des types de retour différents.
On veut maintenant définir la classe des disques, un disque étant
défini par son centre, qui est un Point, et par son rayon,
que l'on représentera par un double.
Le fait qu'un disque soit construit à
partir d'un point (instance d'une classe existant déjà) s'appelle de
la composition.
Il est important ici d'utiliser la méthode
toString() de la classe Point: c'est de la
délégation (dans l'affichage d'un disque, l'affichage de son
centre qui est un point est délégué à la classe Point
qui a la responsabilité de l'affichage de n'importe laquelle de ses
instances.
Je rappelle que les exercices donnés à la fin de chaque feuille de séance doivent être effectués soit au cours de la séance, soit en travail personnel, et les fichiers source (.java) correspondant doivent m'être envoyés par mail à l'adresse Etienne.Duris[at]univ-mlv.fr avec pour sujet OP Tdn où n est le numéro de la séance. Ces exercices sont corrigés et constituent des notes de contrôle continu qui comptent dans l'évaluation du module.