:: Enseignements :: ESIPE :: E3INFO :: 2013-2014 :: Programmation Objet avec Java ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) |
Héritage, Mutabilité, redéfinition, polymorphisme, varargs
|
À partir de ce TD nous allons utiliser un environement de
développement (IDE) un peu mieux qu'un simple éditeur.
Vous avez donc le choix entre eclipse (ex-IBM) ou NetBeans (ex-SUN).
Eclipse est plus orienté code avec moins de wizards que Netbeans
mais le compilateur vous reporte plus de warnings (ce qui est mieux).
Ces deux environnements compilent le code à la volée et générent
le bytecode lorsque l'on sauve le fichier (avec ctrl+s)
et complètent le code automatiquement (n'importe où même dans le commentaire)
avec ctrl+espace.
En terme d'organisation des fichiers sur le disque,
les deux IDE utilisent le principe de workspace qui est
un répertoire contenant un ensemble de projets. Un projet est
aussi un répertoire contenant un ensemble de sources
(dans le répertoire src) et de classes.
Sous eclipse, par défaut, le répertoire contenant les classes
s'appele bin mais on peut le changer dans les préférences
(Window > Preferences > Java > Build Path > Folders) pour l'appeller classes.
À partir de maintenant, vous utiliserez eclipse pour les TD.
Vous pouvez utiliser la version eclipse-light disponible
dans l'environnement de travail des salles machines.
Exercice 1 - Eclipse
-
Commencez par choisir un répertoire pour le workspace, par exemple ~/java/workspace.
Ce répertoire doit être vide la première fois.
-
Pour démarrer nous allons créer un projet TD4 dans votre workspace.
Ouvrez Eclipse, créez un Projet Java (New Java Project).
-
Créez un paquetage fr.umlv.geom en utilisant
le menu contextuel sur le répertoire src du projet TD4.
-
Copiez le code ci-dessous (à la souris):
Puis collez le directement sur le paquetage.
-
Qu'implique au niveau du code source et du fichier Point.java
le fait que la classe Point soit dans le paquetage
fr.umlv.geom ?
-
Créez une classe fr.umlv.geom.main.Main.
Ecrire une méthode main en utilisant le control+espace dans l'espace entre accolade de cette classe.
Dans ce main, créez un point de coordonées 2 et 4 et affichez le.
Il existe un raccourci pour System.out.println(),
sout pour Netbeans et sysout pour Eclipse.
Comment faire pour exécuter le main dans Eclipse? Et dans la console ?
-
Que fait exactement l'instruction import en Java ?
En quoi est-elle différente du #include du C ?
On verra la les différentes fonctionnalités utiles
de ces environements au fur et à mesure.
Exercice 2 - Point
Nous reprennons la classe fr.umlv.geom.Point
de l'exercice précédent.
-
Pourquoi la méthode toString()
utilise l'annotation @Override ?
-
On souhaite ajouter une méthode translate()
permettant de translater un point.
Discuter des choix d'implantations et de leurs influences
sur la signature de la méthode translate.
-
Écrire le code de la méthode translate() de la solution retenue.
Bien entendu vous testerez le code de translate()
dans la classe fr.umlv.geom.main.Main.
Exercice 3 - Circle
Pour tout l'exercice, pour vos tests, vous écrirez votre
code dans la classe
Main vue précédemment.
-
Ecrire une classe fr.umlv.geom.Circle, un cercle étant défini
par un Point correspondant au centre et un rayon de type int.
Que doit on préciser en déclarant ces deux champs?
-
Ecrire le constructeur du Circle.
-
Ecrire la méthode toString() qui affiche le centre et
le rayon.
-
Ecrire la méthode translate(int dx,int dy) qui
translate le cercle.
-
Qu'affiche le code suivant sur la console :
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);
Que doit-on faire pour que cela n'arrive pas ?
-
Quel est le problème avec l'accesseur getCenter() codé de la
façon suivante :
public Point getCenter() {
return center;
}
Pour vous aider, regardez le code suivant :
Circle c=new Circle(new Point(1,2), 1);
c.getCenter().translate(1,1);
System.out.println(c);
Que doit-on faire pour que le code soit correct ?
-
Ecrire la méthode equals() qui renvoie vrai si deux cercles
ont le même centre et le même rayon.
Rappel: cette méthode existe déjà dans java.lang.Object.
-
Ecrire la méthode surface() qui renvoie
la surface du disque.
Modifier la méthode toString() pour quelle affiche aussi
la surface.
-
Ecrire la méthode contains(Point p) qui renvoie vrai si un point est
contenu dans un disque.
-
Ecrire la méthode contains(Point p, Circle... circles) qui renvoie
vrai si un point est contenu dans un des disques.
Exercice 4 - One Ring for ...
Le but de cet exercice est de construire un anneau comme
étant un cercle dont on a évidé une zone circulaire définie
par son rayon interne.
Pour tout l'exercice, pour vos tests, réutilisez la
classe
Main vue précédemment.
-
Rappeler dans un premier temps, dans quel cas il est judicieux
de faire de l'héritage.
-
Ecrire la classe Ring qui hérite de la
classe Circle.
-
Ecrire un constructeur de la classe Ring prenant
en paramètre, un centre, un rayon et un rayon interne.
Faites attention à ce que le rayon interne soit inférieur
au rayon de l'anneau. Que faire dans le cas contraire?
Note: Tous les champs doivent être privés.
-
Ecrire la méthode equals() qui teste l'égalité
de deux anneaux.
-
On souhaite maintenant qu'un anneau soit affiché comme un cercle,
avec en plus au bout de la ligne "InternalRadius: ir" où ir est le rayon interne de l'anneau".
Modifiez ce qu'il faut pour que cela fonctionne. Essayez avec le code suivant (est ce
que tout vous semble correct? Dans le cas contraire, que doit-on faire pour corriger?):
Point p=new Point(1,2);
Circle c=new Circle(p,2);
System.out.println(c);
Ring r = new Ring(p, 2, 1);
System.out.println(r);
Ensuite,
-
Implantez une méthode contains(Point)
en évitant d'allouer des objets ou de dupliquer du code.
PS: il existe deux solutions dont une plus élégante que l'autre.
-
Ecrire la méthode contains(Point p, Ring... rings)
qui renvoie vrai si un point est contenu dans l'un des anneaux.
© Université de Marne-la-Vallée