TP4

Développement Java avec NetBeans


Objectifs

Mise en place

Exercices

Moodle
Question 1.1
Le quiz concernant les site web se trouve sur la plateforme Moodle. Comme le test est individuel et en temps chronométré et limité, NE VOUS CONNECTEZ PAS tant que vous n'y êtes pas invité par un enseignant !

Dans cet exercice, nous allons écrire des classes Java et exécuter un programme utilisant des classes créées. Le programme sera d'abord exécuté classiquement puis en mode "debug".

Les captures d'écrans de cet exercice peuvent être légèrement différentes de ce que vous apercevrez sur votre écran (version de Netbeans et/ou système d'exploitation différents), mais devrez quand même vous permettre de mieux vous repérer.

Question 2.1
Créez un nouveau projet, en sélectionnant File->New Project, choisissez la catégorie Java à gauche, puis sélectionnez Java Application à droite.

Netbeans créé un nouveau projet ainsi qu'une nouvelle classe Main.java. Remarquez aussi qu'un package du même nom que votre projet a été créé par défaut dans Source Packages (qui contiendra l'ensemble des fichiers sources). Il est conseillé de mettre l'ensemble des nouveaux documents dans ce package (ou un sous de ses sous-package). La classe Main contient le point d'entrée de la chaîne des traitements. Vous pouvez ouvrir ce fichier Java pour découvrir que pour l'instant il n'y a pas d'instructions.

Pour faciliter la suite de l'exercice, effacez le fichier Main.java (dans l'onglet Projects, sélectionnez le fichier et dans le menu contextuel cliquez sur Delete).

Soit le diagramme UML permettant de représenter un point de la figure ci-dessous

un point...
Question 2.2
Ecrire le schéma XML correspondant au diagramme UML.
Question 2.3
Ecrire deux document XML valide par rapport à votre schéma XML.

La classe java ci-dessous correspond au modèle UML :

Question 2.4
Quelle est le nom du namespace ?
  • p
  • x
  • y
  • Point
  • http://polytech.ujf-grenoble.fr/point

Question 2.5
Quel est le nom de la classe ?
  • racine
  • p
  • Point
  • http://polytech.ujf-grenoble.fr/point

Point

Question 2.6
Combien y a t-il d'attributs ?
  • 1
  • 2
  • 3
  • 4
  • 5

Question 2.7
Quels sont les noms des attributs ?
  • X
  • x
  • y
  • Y
  • Point
  • double

Question 2.8
De quels types sont-ils ?
  • int
  • bool
  • double
  • String

Question 2.9
Sont-ils de type primitif ou des références ?
  • primitif
  • références

Question 2.10
Quand on écrit un instance XML valide selon le modèle défini dans ce diagramme, quelle chaîne de caractère n'apparaîtra pas dans le document XML ?
  • p
  • x
  • y
  • Point
  • http://polytech.ujf-grenoble.fr/point

Nous allons maintenant découvrir une première façon de créer une classe sous Netbeans : Dans le menu File->New File, choisissez la catégorie Java à gauche, puis sélectionnez Empty Java File à droite (voir figure ci-dessous).

création fichier java
Question 2.11
Donnez à votre classe le nom Point, et veillez à sélectionner le package approprié. Copier le code Java de la classe Point donné plus haut dans votre fichier.

Observez l'onglet correspondant à votre fichier (voir figure ci-dessous) : il y a deux indicateurs : le premier (avant le nom de la classe) est une clé, le second (après le nom de la classe) est une étoile. L'étoile indique que votre classe a été modifiée mais que le fichier n'est pas sauvegardé. Pour que la machine virtuelle prenne en compte vos modifications, il faudra bien veiller à ce que votre fichier soit sauvegardé. La clé indique que votre fichier Java n'a pas été recompilé depuis sa dernière modification. Pour que la machine virtuelle prenne en compte vos modifications, une fois sauvegardé, il faudra bien veiller à ce que votre fichier soit soit compilé.

indicateurs onglet

Appuyez sur Ctrl+S ou allez dans le menu File -> Save ou encore cliquez sur l'icône de la disquette pour sauvegardez vos fichiers.

Pour compiler un fichier Java, vous pouvez utiliser le menu Build -> Compile "Point.java".

Nous définissons maintenant un segment par ses deux extrémités comme le montre le diagramme UML de la figure ci-dessous.

un segment
Question 2.12
Quel est le nom de la classe ? Combien y a t-il d'attributs ? Quels sont les noms des attributs ?
Question 2.13
Créer un schema XML définissant un segment, puis un document XML valide par rapport à votre XML schema
Question 2.14
Nous allons découvrir une seconde façon de créer une classe sous Netbeans. Dans le menu File->New File, choisissez la catégorie Java puis sélectionnez Java Class, cliquez sur Next, puis remplissez le nom de la classe et sélectionnez le package adéquat.

Vous obtenez une classe Segment vide. Notez le commentaire.

Question 2.15
Complétez la classe en déclarant les attributs a et b qui sont des références sur des instances de la classe Point définie précédemment.

Nous allons maintenant créer une classe Test contenant le programme principal, dans laquelle nous allons définir un segment, puis calculer sa longueur.

Question 2.16
Dans le menu File->New File, choisissez la catégorie Java puis sélectionnez Java Main Class, cliquez sur Next, puis nommez la classe Test et sélectionnez le package adéquat.
Question 2.17
Sélectionnez le menu Run -> Run Main Project pour lancer l'exécution. Lors de la première exécution, une fenêtre s'affiche vous proposant de définir la classe Test comme étant la classe principale (i.e. la classe contenant le programme principal). Cliquez sur Ok.

Bien sûr le programme principal étant vide, rien ne se passe. Vous devez avoir dans la fenêtre de sortie un message vous indiquant où se trouve le résultat de la compilation (où sont rangées les fichier .class)

Question 2.18
Copiez le code suivant dans le main

La classe Test est une classe un peu particulière : elle contient une méthode main qui sera la méthode appelée lors de l'exécution du programme. Les lignes du fichier commençant par le symbole // correspondent à des commentaires. Ces commentaires permettent d'expliquer ce qui est fait dans le programme. Nous avons volontairement laissé des portions incomplètes pour que vous complétiez les parties manquantes. Cette classe permet de créer un objet de la classe segment, de définir ses deux extrémités et de calculer sa longueur.

En Java, la fonction Math.sqrt(x) donne la valeur racine carée de x et la fonction Math.pow(x,n) donne la valeur de x n . Utilisez la documentation en ligne de Netbeans (générée par javadoc) pour découvrir les principales méthodes disponibles dans la classe Math. Pour cela il suffit de taper dans votre code Java :
Math.
(Math suivi d'un point) et d'attendre quelques instants...
Question 2.19
Remplacez les parties //...ajouter code... afin de faire ce qui est demandé dans les commentaires. Vérifiez régulièrement que ce que vous avez écrit est correct en compilant la classe (menu Build->Compile).

Nous allons maintenant exécuter le programme Test.

Question 2.20
Exécutez le programme Test (menu Run -> Run Main Project). Observez le résultat affiché dans la fenêtre Output Window , et vérifiez avec une calculatrice que vous obtenez le bon résultat.
N'importe quelle classe contenant un main peut être exécutée, il suffit d'aller dans le menu Run -> Run File -> Run 'Ma Classe.java' ou appuyer sur Shift+F6)
Question 2.21
Dessinez le diagramme APO correspondant après l'exécution de la ligne 13 ci-dessus. Faites valider votre diagramme APO par l'enseignant avant de cliquer ci-dessous.

Question 2.22
Dessinez le diagramme APO correspondant après l'exécution de la ligne de déclaration de la variable longueur ci-dessus. Faites valider votre diagramme APO par l'enseignant avant de cliquer ci-dessous.

Nous allons maintenant exécuter le même programme mais cette fois-ci en mode "debug". Le mode d'exécution "debug" permet de suivre l'exécution du programme pas à pas. Il est ainsi possible de suivre l'évolution des valeurs des attributs.

La première étape est de définir un point d'arrêt (breakpoint en anglais). Pour cela cliquer avec le bouton gauche sur la marge gauche de l'éditeur (là où se trouve les numéros de ligne). Vous devez obtenir le résultat de la figure ci-dessous.

Définition d'un breakpoint
Question 2.23
Définissez un point d'arrêt sur la première ligne du programme et Exécutez le programme Test en mode debug (menu Run puis Debug Main Project ou touche F5)

Le mode "debug" permet de faire exécuter les instructions du programme en mode pas à pas (une instruction après l'autre). Pour cela il faut utiliser le bouton entouré en rouge ( Step Into ou touche F7) sur la figure ci-dessous.

Mode debug
Question 2.24
Exécutez les instructions du programme en mode pas à pas.

A tout moment vous pouvez relancer le programme au début en recliquant sur Debug Main Project. En cours d'exécution, vous pouvez regarder les informations concernant les variables (onglet Local Variables en bas à droite), cf figure ci-dessous.

Local Variables

Redémarrez le programme en mode debug et observez la liste des variables.

Question 2.25
Les variables p1, p2 et longueur sont visibles dans la fenêtre au début du programme principal (avant l'exécution de la première instruction)
  • vrai
  • faux

Question 2.26
Pourquoi ?
Question 2.27
Exécutez l'ensemble du programme en mode pas à pas. Regardez bien l'évolution des instances (p1, p2 et votre segment), en cliquant sur le "+" à gauche. Notez aussi les différentes icônes.
Question 2.28
Explorez également les possibilités par le mode debug (utilisation des autres boutons, ajout de plusieurs points d'arrêt...).
Le mode debug vous permet l'exécution pas à pas d'un programme. Il pourra être très utile par la suite lorsque nous écrirons des algorithmes afin de vérifier que le comportement de l'exécution correspond bien à nos attentes.

Nous allons maintenant définir un rectangle et écrire un programme permettant de calculer son aire. Un rectangle est défini par deux vecteurs (c-à-d deux segments) v1 et v2.

Question 2.29
En utilisant le modèle de Segment, créez une classe Rectangle.
Question 2.30
Créez une classe Test2 dans laquelle vous ajouterez le code suivant (à compléter) :
Question 2.31
Compilez puis exécutez la classe Test2. Le résultat obtenu est-il correct ? Exécutez également la classe Test2 en mode debug.

Dans cet exercice nous allons ajouter des méthodes à la classe Point et manipuler des instances

Question 3.1
Créez un nouveau package appelé "premiereclasse" dans votre projet (appelé Java Package dans la catégorie Java).
Question 3.2
Créez une nouvelle classe Point qui contient deux attributs privés abscisse et ordonnee, tous deux de type int et de modificateur d'accès private.
Question 3.3
Créez une nouvelle classe Test qui contient un programme principal qui permet de déclarer et de créer une nouvelle instance de la classe Point référencée par la variable p
Question 3.4
Est-il possible de remplir les valeurs de abscisse et ordonnee de l'instance référencée par p depuis le programme principal ? Pourquoi ?
  • Non
  • Oui

Question 3.5
Ajouter à la classe Point la méthode publique affiche() sans paramètre, de type de retour void, de sorte que p.affiche(); affiche à l’écran sur la sortie standard les valeurs de l’abscisse et l’ordonnée de p. Testez votre méthode en ajoutant l'appel à la méthode dans le programme principal.
Question 3.6
Ajouter un constructeur par défaut qui initialise les attributs à la valeur 1. Testez en relançant l'exécution du programme principal.
Question 3.7
Dans le programme principal, déclarer et de créer une nouvelle instance de la classe Point référencée par la variable q et afficher le contenu de l'instance.
Question 3.8
Dessinez le diagramme APO correspondant à votre programme principal . Faites valider votre diagramme APO par l'enseignant avant de cliquer ci-dessous.

Question 3.9
Dans la classe Point ajouter la méthode +set(u:int,v:int):void (attention la définition ci-contre est en UML, il faut la traduire en Java), qui permet de changer les coordonnées d’un point. Testez votre méthode dans le programme principal en modifiant l'instance référencée par p pour que le point modélisé soit en (10,-2).
Question 3.10
Dans la classe Point ajouter la méthode +translate(du:int,dv:int):void (attention la définition ci-contre est en UML, il faut la traduire en Java), qui permet de translater un point de du selon l'abscisse et dv selon l'ordonnée. Testez votre méthode en translatant l'instance référencée par q de (-1,3).
Question 3.11
Dessinez le diagramme APO correspondant à votre programme principal. Faites valider votre diagramme APO par l'enseignant avant de cliquer ci-dessous.

Question 3.12
Lancer le debogueur pour vérifier la correspondance avec votre diagramme.
Question 3.13
(A traiter que si le chapitre "instruction conditionnelle" a été vu en cours). Ajouter à la classe Point la méthode publique origine():boolean qui teste si les coordonnées du point sont nulles (le point est à l'origine du repère). Cette méthode renvoie true si et seulement si le point est bien à l'origine. Tester votre méthode en translatant p
Question 3.14
(A traiter que si le chapitre "instruction conditionnelle" a été vu en cours). Ajouter une méthode +egale(p:Point):boolean telle que p.egale(q) renvoie true si et seulement si les abscisses et ordonnées des points p et q sont égaux (avec p et q des variables de type référence sur des instances de la classe Point). Testez votre méthode.
Question 3.15
Ecrire un deuxième constructeur publique de la classe Point dont la signature est +Point(u:int,v:int) qui permet d’initialiser directement l’abscisse et l’ordonnée avec u et v.
Question 3.16
Même question que ci-dessus mais avec la signature suivante : +Point(abscisse:int,ordonnée:int). Comment s'appelle le principe qui nous permet d'utiliser des paramètres qui ont le même nom que des attributs ?

On aimerait créer une méthode set qui permettrait d'obtenir :

Question 3.17
Écrire une méthode public void set(Point q), prenant en argument une référence sur une instance de la classe Point, et qui utilise les valeurs des attributs de l'instance référencée par q pour valoriser les attributs de l'instance courante.

Remarquez qu'on écrit une deuxième méthode set mais avec des paramètres différents.

On aimerait créer une méthode symetrie qui permettrait d'obtenir :

Question 3.18
Ajouter à la classe Point une méthode publique symetrie telle que p.symetrie() renvoie une nouvelle instance> de la classe Point qui représente le symétrique du point p, dans une symétrie centrale par rapport à l’origine du repère sans modifier l'instance référencée par p.

Remarquez que l'instanciation de cette nouvelle référence n'est pas visible dans le code de la méthode main. Il faudra bien documenter la méthode symetrie pour indiquer qu'elle renvoie une nouvelle instance (c'est à l'intérieur du code de la méthode symetrie que ce fait l'instanciation).

Dans cet exercice nous allons programmer une classe simple et manipuler des instances

Question 4.1
Sans utiliser votre PC, simulez le programme suivant sur l'OPC : évolution de la mémoire, et affichages obtenus à l'aide d'un diagramme APO qui exécute pas à pas les instructions de la méthode main. Faites valider votre diagramme APO par l'enseignant avant de cliquer ci-dessous.

Question 4.2
Coder sous netbeans ce programme et lancer le debogueur pour vérifier la correspondance avec votre diagramme.

Dans cet exercice, nous allons partir de classes Java et d'un programme principal pour retrouver l'équivalence avec XML Schema et les instances XML.

Question 5.1
Créez un nouveau package Java (menu New File, catégorie Java, type de fichier Java Package) que vous nommerez patient et qu'il faut mettre dans l'emplacement "Source Packages".

Cliquez avec le bouton droit sur les liens suivants et enregistrez-les dans le répertoire correspondant au package patient :

Les fichiers sources sont dans le sous-répertoire src du disque dur.
Question 5.2
Examinez ces classes et lancez le programme principal de TestPatient afin de bien comprendre les différents liens.
Question 5.3
Complétez le programme principal afin d'afficher les informations concernant le 2eme patient, y compris son age.
Question 5.4
Créez un nouveau XML Schema qui reflète l'organisation des données des classes Java Patient et Adresse.

La racine du document doit s'appeler patientJava, le nom du vocabulaire sera patient.

Question 5.5
Créez deux nouvelles instances XML de votre XML Schema qui reflète les données présentes dans le programme principal.
Question 5.6
Quelles sont les instructions du programme principal que l'on ne peut pas écrire en XML ?
  • Le remplissage des valeurs des attributs
  • Les instructions d'affichage à l'écran

Références

  1. Le manuel "penser en java"
  2. Nombre complexe
  3. Espace de noms W3C