Contexte : nous allons reprendre et approfondir les notions de classe d'objet et de POO (programmation orientée objet) sous Eclipse. Ce TP est accompagné d'un court document de synthèse des principaux concepts de POO: " POO - Principaux Concepts de la programmation à objets en Java.doc" Travail pratique n°1 : création d'une classe Point Enoncé: un point se caractérise par ses coordonnées, qui vont être des variables d'instance de la classe qu'on va définir. On va ajouter progressivement des méthodes, permettant: de construire un point, d'accéder et de modifier ses coordonnées, de le déplacer, de le permuter. A travers ces manipulations nous allons étudier et revoir les concepts de base de la programmation objet en Java, en utilisant l'IDE Eclipse. Etape 1: créer un nouveau projet Java. Appelez le par exemple TP SLAM2 1.1 Note: SLAM2 indique le module, 1.1 indique que c'est le 1er TP de la 1ère séquence. Etape 2: placez vous dans le répertoire src de votre projet, puis créez un nouveau package (File --> New --> Package). Appelez le espace Etape 3: créez une classe nommée Point, en se plaçant dans le package espace nouvellement créé. Cette fois ci, ne pas cocher la case "main". Etape 4:ajoutez 2 variables d'instance, qui vont représenter les coordonnées d'un objet de type Point de la classe Point. Appelez les abscisse et ordonnee. Dans un premier temps, déclarez les public. public int abscisse, ordonnee ; Etape 5: création d'un constructeur pour la classe Point Allez dans le menu Source--> Generate Constructor using Fields Vérifiez que toutes les variables d'instance sont cochées. Cliquez sur "Omit call to default constructor super()" (ceci dit, le laisser décocher ne pose pas de problème). Etape 6: utilisation de cette 1ère classe Point a. Retournez à la racine du projet b. Créez un nouveau répertoire de source, nommé "manipulation". File --> New --> Source folder c. Placez vous dans ce répertoire nouvellement créé, manipulation, puis créez une nouvelle classe, nommé Manipulation d. Creez une nouvelle classe, nommé Manipulation. File --> New --> Class Cf ci dessous la copie d'écran. remarquez qu'on n'a rien inscrit dans le champ de saisie "Package" et qu'on a coché la case à cocher "public static void main(String[] args)" Dans la partie main, tapez les instructions suivantes: cf le résultat ci dessous: public class Manipulation { public static void main(String[] args) { // TODO Auto-generated method stub Point monPoint = new Point(1,1) ; } } Question 1: la ligne apparaît avec une erreur dans la marge. Pourquoi ? Que faut il faire pour y remédier ? Corriger le problème. 1 Par exemple: sous le répertoire de sources nommé "manipulation", créez un nouveau package nommé espace (le nom doit être le même qu'à l'étape 2), puis déplacez votre classe java Manipulation.java dans ce package. Etape 7: modification des coordonnées de la Classe Point. On souhaite modifier les coordonnées de l'objet monPoint. On va modifier la classe Manipulation.java qui instance et utilise un objet de la classe Point. Enfin on souhaite afficher les coordonnées de l'objet monPoint. On va ajouter les instructions suivante: monPoint.abscisse = 3 ; monPoint.ordonnee = 3 ; // On affiche les coordonnées de l'objet monPoint System.out.println("L'abcisse est "+monPoint.abscisse); System.out.println("et l'ordonnee est "+monPoint.ordonnee); Pour utiliser un raccourci ou définir son propre raccourci pour écrire l'instruction System.out.println ... Astuce: Windows --> Preferences --> Java --> Editor --> Templates Au final, on aura le code suivant: package espace; public class Manipulation { public static void main(String[] args) { // TODO Auto-generated method stub Point monPoint = new Point(1,1) ; // On souhaite modifier les attributs abscisse et ordonnee de notre objet monPoint monPoint.abscisse = 3 ; monPoint.ordonnee = 3 ; // On affiche les coordonnées de l'objet monPoint System.out.println("L'abcisse est "+monPoint.abscisse); System.out.println("et l'ordonnee est "+monPoint.ordonnee); }} Question 2: ces instructions sont techniquement bonnes mais abominables en programmation Objet. Pourquoi n'utiliserez vous plus jamais de telles instructions ? a. Pourquoi peut on modifier directement des variables d'instance de la classe Point ? que faut il faire pour y remédier ? b. Comment accéder "proprement" aux variables d'instance de la classe Point ? c. Comment afficher "proprement" les coordonnées d'un objet de la classe point ? Etape 8: Mise au propre des classes Point.java et Manipulation.java a. Dans la classe Point.java, modifier l'accessibilité des variables abscisse et ordonnee en les passant de public à private Question 3: retournez à ce moment là dans votre classe Manipulation.java. Un certain nombre d'erreurs apparaissent. pourquoi ? b. Dans la classe Point.java, ajouter des accesseurs aux variables abscisse et ordonnee Effectuez: Source --> Generate Getters et Setters . L'écran ci dessous s'affiche. c. Ajoutez une méthode qui va: - s'appeler affichePoint - ne rien prendre en paramètre - ne rien retourner - afficher l'abscisse et l'ordonnée d. Dans la classe Manipulation.java, effacez le code qui modifiait les coordonnées et remplacez le par du code valide qui utilise les méthodes d'accès qu'on vient de définir. Afficher les coordonnées de monPoint avant le changement et après le changement. 2 Travail pratique n°2 : de l'impossibilité d'échanger (permuter) 2 valeurs de variables primitives Enoncé: nous allons examiner les difficultés que posent des méthodes traditionnelles de programmation structurée. Ici, nous allons essayer d'échanger la valeur de 2 entiers et voir le problème posé. Etape 1: créer un nouveau projet Java. Appelez le par exemple TP SLAM2_ExoEchanges Note: celui là on ne soigne pas son nom car il est pas beau on le gardera pas forcément, on se souviendra juste de ce qu'il permet de conclure. Etape 2: placez vous dans le répertoire src de votre projet, puis créez un nouveau package (File --> New --> Package). Appelez le echanges Etape 3: créez une classe nommée Util, toujours en se plaçant dans le répertoire src de votre projet. Cette fois ci, ne pas cocher la case "main". Etape 4: Entrez le code suivant: ci dessous le code intégral de la classe. package Echanges; class Util { public static void echange (int premiere_valeur, int deuxieme_valeur) // ne pas oublier static { System.out.println ("debut echange : " + premiere_valeur + " " + deuxieme_valeur) ; int intermediaire ; intermediaire = premiere_valeur ; premiere_valeur = deuxieme_valeur ; deuxieme_valeur = intermediaire ; System.out.println ("fin echange : " + premiere_valeur + " " + deuxieme_valeur) ; } } Etape 5: Remettez vous à la racine du package echanges. Créez une classe nommée Echanges. Cette fois ci, cocher la case "main". Etape 6: Dans la méthode "main", ajoutez le code suivant int ours = 100, taureau = 200 ; System.out.println ("avant appel Util.echange (ours, taureau) ; System.out.println ("apres appel : " + ours + " " + taureau) ; : " + ours + " " + taureau) ; Question 1: Exécutez le code. Que fait le programme ? Est ce le résultat attendu ? Pourquoi ? Question 2: Dans l'étape 6, il y a quelque chose de nouveau qui devrait vous interpeller. Qu'est ce que c'est ? Que pouvez vous dire sur le sujet après mes explications ? Travail pratique n°3 : méthode de permutation de Points Enoncé: nous allons utiliser des objets et voir comment en échanger (permuter) au travers de l'exemple de notre classe Point. pour se faire, nous allons ajouter une méthode à notre classe point permettant d'échanger 2 points. Etape 1: revenir dans le projet TP SLAM2 1.1et ouvrir la classe Point Etape 2: ajout d'une méthode permute On ajoute la méthode suivante dans la classe Point public void permute (Point a) // methode d'echange les coordonnees du point courant avec celles de a { Point intermediaire = new Point(0,0) ; //copie de a dans intermediaire intermediaire.abscisse = a.abscisse ; intermediaire.ordonnee = a.ordonnee ; //copie du point courant dans a a.abscisse = abscisse ; a.ordonnee = ordonnee ; //copie de intermediaire dans le point courant abscisse = intermediaire.abscisse ; ordonnee = intermediaire.ordonnee ; } Question 1: Aidez vous des commentaires dans le programme pour expliquer ce que fait cette méthode ? 3 Question 2: Ouvrez maintenant la classe Manipulation.java. a. Créez 2 objets de type Point, pointA et pointB, de coordonnées (3,4) pour le 1er Point et (5,6) pour le 2ème b. utilisez la méthode affichePoint pour afficher chacun de ces points c. Utilisez la méthode permute définie à l'étape 2 pour les permuter d. affichez à nouveau les 2 points e. exécutez le programme. Tout s'est il bien passé ? Travail pratique n°4 : ajout d'une méthode distance à la classe Point Enoncé: on souhaite ajouter une méthode appelée distance à la classe Point. La signature de cette méthode sera: public double distance(Point p) Question 1: ajouter la méthode distance à la classe Point. Astuce: on s'aidera de la méthode Math.sqrt Question 2: ajouter la méthode distance à la classe Point. Question 3: dans la classe Manipulations.java, ajoutez une (ou plusieurs) instruction pour afficher la distance entre les points pointA et pointB définis dans la partie Travail pratique n°3. Travail pratique n°5 : ajout d'une méthode deplace à la classe Point Enoncé: on souhaite ajouter une méthode appelée deplaceAuPoint à la classe Point. La signature de cette méthode sera: public Point deplaceAuPoint(Point p) Question 1: ajouter la méthode deplaceAuPoint à la classe Point. Question 2: ajouter la méthode deplaceAuPoint à la classe Point. Question 3: dans la classe Manipulations.java, créez 2 nouveaux Points, pointDepart et pointArrivee, de coordonnees (4,6) et (7,8). Ecrire les instruction pour déplacer le Point pointDepart jusqu'au Point pointArrivee. Travail pratique n°6 : surcharge de méthodes Enoncé: on souhaite manipuler des Points parfois en 1 dimension, 2 dimensions ou même en 3 dimensions, sans avoir à définir des classes différentes. Etape 1: dans la classe Point.java, ajouter une variable d'instance cote (qui correspond à la 3ème dimension, z). Etape 2: initialisez les 3 dimensions à 0 Etape 3: générez les méthodes get et set pour la 3ème dimension Etape 4: ajoutez 2 constructeurs (Source --> Generate Constructor Using Fields) , un avec la variable d'instance abscisse seulement et un avec les 3 variables d'instance. Question 1: créez 3 nouveaux points dans la classe Manipulation, nommés point1D et de coordonnées (8), point2D et de coordonnées (5,8) et point3D de coordonnées (3,5,8). Pourquoi la construction de ces 3 points est possible ? Question 3: modifier la méthode affichePoint pour tenir compte de la 3ème dimension cote Question 4: modifier la méthode permute pour tenir compte de la 3ème dimension cote Question 5: modifier la méthode distance pour tenir compte de la 3ème dimension cote Question 6: comment modifier les variables d'instance, le constructeur et les méthodes 4