Référence, objet, sous-typage, accesseur, égalité
Exercice 1 - Point
On cherche à écrire une classe Point stockant un point graphique
en coordonnées cartésiennes (appelons les x et y).
-
Dans un premier temps, n'écrivez pas de constructeur mais seulement
une méthode String toString() permettant d'afficher
sous forme textuelle les coordonnées d'un point.
Puis essayer le code suivant :
Point p=new Point();
System.out.println(p);
Expliquer.
Note: il est possible d'utiliser la commande javap pour
voir ce que le compilateur génère comme byte-code.
-
Ajouter un constructeur initialisant les coordonés du point
avec deux paramètres.
Essayer de réexecuter le code ci-dessus. Expliquer.
-
Écrire deux accesseurs permettant d'obtenir les valeurs des coordonnées
(getX() et getY()).
Quel est l'intérêt d'utiliser des accesseurs plutôt que de mettre
les champs publics ?
-
Pourquoi est-ce qu'il ne faut pas obligatoirement
mettre des accesseurs lorsque l'on crée une classe ?
-
Écrire un autre constructeur permettant d'initialiser un point sans
passer de paramètre. Le point aura pour coordonnées (0,0).
Écrire un troisième constructeur qui prend un point en paramètre et
et utilise les coordonnées de celui-ci pour s'initialiser.
-
Écrire une méthode translate(int dx,int dy) qui permette
de translater un point d'une valeur de décalage en x et y.
-
Que fait le programme suivant ?
Point p=new Point(2,3);
Point p2=p;
p.translate(1,1);
System.out.println(p);
System.out.println(p2);
Expliquer.
Exercice 2 - Test d'égalité
En utilisant la classe Point de l'exercice précédent.
Qu'affiche le code ci-dessous :
Point p=new Point(1,2);
Point p2=p;
Point p3=new Point(1,2);
System.out.println(p1==p2);
System.out.println(p1==p3);
-
Écrire dans la classe Point une méthode isSameAs()
(à vous de trouver la signature exacte de la méthode)
qui renvoie true si deux points ont les mêmes coordonnées.
-
Remarquons qu'il existe déjà une méthode nommé equals()
dans la classe Object dont le rôle est de tester si
deux objets sont égaux sémantiquement.
Transformer la méthode isSameAs() en méthode
equals().
-
Qu'affiche le code suivant :
Object p=new Point(1,2);
Object p2=new Point(1,2);
System.out.println(p.equals(p2));
Expliquer ce résultat. Comment obtenir un résultat plus
logique ?
-
Dans quel cas utilise t'on l'annotation @Override ?
Exercice 3 - Circle
Écrire une classe Circle, un cercle étant définie
par un point correspondant au centre et un rayon.
-
Écrire le constructeur du Circle.
-
Écrire la méthode toString qui affiche le centre et
la rayon.
-
Écrire la méthode translate(int dx,int dy) qui
translate le cercle.
Qu'affiche le code suivant :
Point p=new Point(1,2);
Circle c=new Circle(p,1);
Circle c2=new Circle(p,2);
c2.translate(1,1);
System.out.println(c+' '+c2);
Expliquer.
-
Écrire la méthode equals() qui renvoie vrai si deux cercles
ont le même centre et le même rayon.
-
Écrire la méthode contains() qui renvoie vrai si un point est
contenu dans un cercle.
-
Écrire la méthode contains(Point p,Circle... circles) qui renvoie
vrai si un point est contenu dans un des cercles.
Rémi Forax - Université de Marne La Vallée