TP 0 (mise en route)

Page Home (contact) Retour TPs

Support de cours


Avant de commencer ce premier TP vous devez déjà avoir installé l'environnement de travail comme il est indiqué ici.

Organisation du travail :

Important ; lisez attentivement ce qui suit avant de commencer le TP.

Rappel pour l'environnement de travail : vous ne devez pas utiliser d'IDE (NetBeans par exemple) dans ce TP ni dans les TPs 1 et 2. Utilisez un éditeur de texte qui offre une indentation automatique des sources Java ; cette année c'est VSCode qui a été choisi.

Vous enregistrerez les différents fichiers que vous créerez pour résoudre les exercices, dans un répertoire java\tp (ou poo\tp). L'emplacement exact du répertoire java (ou poo) est à votre convenance.

Chaque TP aura son propre répertoire et, sauf exceptions, chaque exercice aura aussi son propre répertoire, ce qui vous permettra de conserver différentes versions d'une même classe. Les exceptions sont les cas où, par exemple, des méthodes ou des variables seront ajoutées à une classe, sans toucher ce qui a déjà été écrit dans les exercices précédents (mais même dans ces cas, il est conseillé de copier le code des exercices précédents dans un nouveau répertoire).

Vous aurez ainsi à créer, par exemple, un fichier java\tp\tp1\exercice2\Livre.java.

Il est très important de coder entre les TPs. Les enseignants vous donneront du travail à faire seul (ou avec l'aide de vos camarades), avant la prochaine séance de TP. Vous pouvez demander de l'aide en envoyant un message électronique à un de vos enseignants si un point précis n'est trouvé par aucun étudiant.


Environnement de travail

1. Ouvrez une fenêtre "cmd" dans laquelle vous allez taper des lignes de commandes..

Tapez "java -version". Il doit s'afficher quelque chose comme ça (la version de Java doit être la version 15 ou une version plus récente) :
C:\Users\richard>java -version
openjdk version "15" 2020-09-15
OpenJDK Runtime Environment AdoptOpenJDK (build 15+36)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 15+36, mixed mode, sharing)

Si la commande java n'est pas reconnue c'est que vous n'avez pas installé correctement votre environnement. Revenez au lien indiqué en rouge au début de ce TP.

2. Sous votre répertoire "HOME" (\Users\toto si vous vous appelez toto), créez un répertoire dédié à ce cours. Pour fixer les idées je l'appelerai "java" (mkdir java). Vous pouvez placer ce répertoire à un autre endroit si vous voulez, par exemple \Users\toto\Documents\java ; le répertoire final doit s'appeler java ou bien poo (pour Programmation Orientée Objet) pour pouvoir le retrouver facilement plus tard. Tout votre travail de tous les TPs devra être placé dans ce répertoire.

Sans vous déplacer créez un répertoire pour ce TP : mkdir java\tp0.

Maintenant déplacez-vous dans le répertoire tp0 : cd java\tp0.

3. Les caractères ne sont pas encodés par défaut en UTF-8 dans une fenêtre "cmd". Pour que UTF-8 soit utilisé, il faut taper cette commande dans la fenêtre "cmd" : chcp 65001

Pensez-y si les accents ou les caractères spéciaux ne s'affichent pas correctement.


Compiler et exécuter une application

Voici le source de la classe HelloWorld :
public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello World!");
  }
}

Comme pour chaque exercice, créez un nouveau répertoire. Vous lui donnez n'importe quel nom significatif (pour pouvoir le retrouver facilement ensuite), par exemple "helloworld" pour ce premier exercice (mkdir helloworld). Déplacez-vous dans ce répertoire : "cd helloworld".

Avec votre éditeur de texte (pas d'IDE, je le répète), dans le répertoire helloworld, créez un fichier HelloWorld.java (attention à bien respecter les majuscules/minuscules) qui contient le source ci-dessus.

Important : pour faciliter la lecture du code et vous aider à repérer le plus tôt possible les fautes de frappe, indentez correctement votre code source. Pour indenter avec VSCode, tapez Alt+Shift+F dans la fenêtre qui contient le code (tout le code de la classe est mis en forme et donc, en particulier, correctement indenté).

Compilez cette classe à l'aide de la commande : javac HelloWorld.java (tapée dans la fenêtre "cmd"). Corrigez les erreurs éventuelles signalées par le compilateur. Pour voir le fichier HelloWorld.class créé par la compilation, listez les fichiers du répertoire en tapant la commande "dir".

Exécutez la classe HelloWorld à l'aide de la commande : java HelloWorld


Une première "vraie" classe

Voici le source de la classe Livre :
public class Livre {
  // Variables d'instance
  private String titre, auteur;
  private int nbPages

  // Constructeur
  public Livre(String unAuteur, String unTitre) {
    auteur = unAuteur;
    titre = unTitre;
  }

  // Accesseur
  public String getAuteur() {
    return auteur;
  }

  // Modificateur
  public void setNbPages(int n) {
    nbPages = nb;
}

Si vous n'avez jamais programmé avec un langage orienté objet, lisez cette rapide introduction à la programmation objet et à la notion de classe. Vous aurez plus d'informations dans le cours.

1. Créez un nouveau répertoire pour cet exercice (par exemple livre1 : "cd .." pour se déplacer dans le répertoire au-dessus, c'est-à-dire le répertoire "java", puis "mkdir livre1" ; vous auriez aussi pu taper plus simplement "mkdir ..\livre1" sans vous déplacer dans le répertoire "java"). Déplacez vous dans ce nouveau répertoire (cd livre1, ou cd ..\livre1 si vous ne vous étiez pas déjà déplacé dans le répertoire "java").

2. Copiez le code ci-dessus de la classe Livre dans le fichier Livre.java avec votre éditeur de texte.

Corrigez quelques petites erreurs (si vous ne les trouvez pas, une première compilation vous y aidera).

Ajoutez ensuite une méthode main (attention à bien écrire l'en-tête de cette méthode) pour

  • Créer 2 livres,
  • Faire afficher les auteurs de ces 2 livres.
  • Compilez. Lancez l'exécution de la classe Livre ; vérifiez que les auteurs des 2 livres sont bien affichés.

    3. Est-ce que vous avez besoin du fichier Livre.java pour faire exécuter la classe Livre ? Vérifiez en renommant (commande "ren" pour rename) provisoirement le fichier Livre.java : "ren Livre.java machin". Lancez ensuite l'exécution de la classe Livre.

    Redonnez le nom Livre.java au fichier que vous avez renommé.

    Correction :

    Classe Livre

    Accesseurs et modificateurs

    Créez un nouveau répertoire pour cet exercice (c'est la dernière fois que je le rappelle mais il faudra le faire pour tous les exercices) et déplacez vous dans ce nouveau répertoire. Copiez le fichier Livre.java dans le nouveau répertoire : "copy ..\livre1\Livre.java ." (le "." final désigne le répertoire courant, là où vous vous trouvez ; c'est dans le répertoire courant que vous voulez copier le Livre.java).

    Avec le menu de votre éditeur de texte, ouvrez le nouveau fichier Livre.java (attention à bien modifier le bon Livre.java qui est dans le nouveau répertoire, pas celui qui est sous le répertoire livre1) et modifiez-le :

    Lancez l'exécution de la classe Livre.

    Correction :

    Classe Livre

    2 classes dans 2 fichiers source pour une application

    1. Écrivez une classe TestLivre dans un fichier TestLivre.java. Cette classe a une seule méthode main qui fait ce que fait la méthode main de la classe Livre.

    Compilez avec la commande javac TestLivre.java Livre.java

    Faites exécuter la méthode main de la classe TestLivre.

    2. Supprimez les fichiers ".class" du répertoire courant (del *.class ; "del" pour "delete") ; vérifiez en tapant dir. Compilez avec la commande javac TestLivre.java. Vérifiez (avec dir) que Livre.class a bien été créé avec TestLivre.class. Pourquoi ?

    Correction :

    Classe TestLivre

    2 classes dans un seul fichier source

    1. Déplacez vous dans le nouveau répertoire de cet exercice (appelons-le "2classes2sources" pour fixer les idées). Copiez les fichiers ".java" de l'exercice précédent dans ce nouveau répertoire : "copy ..\2classes2sources\*.java .".

    Avec l'éditeur de texte copiez le code de la classe TestLivre dans le fichier Livre.java et supprimez la méthode main de la classe Livre (si ce n'est déjà fait). Supprimez ensuite le fichier TestLivre.java.

    2. Compilez le fichier Livre.java. Vérifiez que le compilateur a créé 2 fichiers ".class" et faites exécuter la méthode main de la classe TestLivre ; quelle commande devez-vous taper pour cela ?

    Correction :

    Fichier Livre.java

    En général il vaut mieux avoir un fichier .java par classe. Vous terminerez donc ce TP avec les 2 classes Livre et TestLivre dans 2 fichiers séparés.

    Méthode toString() ; recherche dans la javadoc

    1. Dans la classe Livre, ajoutez une méthode afficheToi() qui affiche une description du livre (auteur, titre et nombre de pages). Utilisez afficheToi() dans la méthode main de TestLivre. Compilez et testez.
    2. Dans la méthode main de TestLivre, ajoutez l'instruction System.out.println(livre)livre désigne un des livres que vous avez créés. Lancez l'exécution de la classe TestLivre. Vous essaierez de comprendre ce qui est affiché après avoir fait les 2 questions suivantes.
    3. Ajoutez une méthode toString() qui renvoie une chaîne de caractères qui décrit le livre. Donnez à la méthode toString() le même profil que la méthode de même nom de la classe java.lang.Object (cherchez dans les API du JDK ; javadoc à l'adresse qui vous avez mise dans les signets de votre navigateur. Voici une aide pour retrouver ce profil. Exécutez à nouveau la classe TestLivre. Voyez ce qui est affiché maintenant par l'instruction System.out.println(livre). Miracle ! println() utilise automatiquement la méthode toString() de la classe de l'objet qu'il a à imprimer. Une explication rationnelle vous est donnée dans la question suivante.
    4. Le but de cette question est donc de comprendre pourquoi System.out.println(livre) affiche ce que retourne la méthode toString() de la classe de livre.
      Le plus souvent il est très rapide de trouver une information dans la javadoc (un seul clic de souris suffit). Pour cet exercice il a été choisi un des rares cas où l'information est difficile à trouver, afin de vous faire découvrir différentes possibilités de la javadoc.
      Pour l'exercice, commencez par faire afficher le module java.base si ça n'est pas déjà fait (voir l'aide que vous avez déjà utilisée à la question précédente). Ensuite, choisir le paquetage "java.lang" en cliquant dessus dans le volet "Packages" (les paquetages sont rangés par ordre alphabétique). Dans le volet des classes ("Package Summary"), cliquez sur la classe System. Rappel : le champ SEARCH vous aurez aussi permis de trouver directement la classe System.
      En partant de la classe java.lang.System et en cliquant sur les liens, retrouvez dans la documentation que System.out.println(objet) affiche ce que retourne la méthode toString de la classe de objet. Voici les étapes (n'essayez pas de tout comprendre ce qui est écrit dans la javadoc ; vous comprendrez certains concepts seulement à la fin du cours) :
      1. Allez dans la classe System puis cliquer sur out (dans "Field Summary"). out est une variable static de la classe System. Cliquez sur le type de out (classe PrintStream).
      2. Ensuite cliquez sur la méthode println de PrintStream qui prend un Object en paramètre (en effet, un livre est un Object, et, par exemple pas un double ou un int).
        Il est dit que la méthode String.valueOf est appelée pour obtenir ce qui sera affiché.
      3. Il faut donc maintenant aller dans la javadoc classe java.lang.String et trouver la méthode valueOf qui prend un Object en paramètre. Vous arrivez (enfin !) à ce que vous cherchez : si obj n'est pas null, valueOf(obj) affiche obj.toString(). Ce qui veut dire, en langage simple, que System.out.println(livre) est équivalent à System.out.println(livre.toString()) et affiche donc ce que retourne la méthode toString() de la classe de l'objet livre (ici la classe Livre).
    5. Modifiez la méthode afficheToi() pour utiliser toString().
    6. Vérifiez le bon fonctionnement de la méthode en lançant l'exécution de la classe TestLivre.

    Correction :

    Fichier Livre.java
    Fichier TestLivre.java


    Constructeurs

    1. Enlevez (provisoirement ; vous pouvez le mettre en commentaire) le seul constructeur de la classe Livre. Sans ajouter de nouveau constructeur, peut-on quand même créer un nouveau livre dans la méthode main ? Si c'est possible faite-le et arrangez-vous pour que son auteur soit "Victor Hugo". Dans la méthode main faites afficher son titre et son auteur.
    2. Remettez le constructeur que vous avez enlevé. Est-ce que le code de la méthode main de la question précédente fonctionne toujours (testez) ?
    3. Ajoutez 2 constructeurs pour avoir 3 constructeurs dans la classe : Utilisez les 3 constructeurs (et éventuellement d'autres méthodes) pour créer 3 livres de 300 pages dans la méthode main de TestLivre.
    4. Testez en lançant l'exécution.

    Correction :

    Questions 1 et 2
    Fichier Livre.java avec les 3 constructeurs
    Fichier TestLivre.java


    Pour ceux qui ont déjà fini :

    Ajoutez des méthodes à la classe Livre et testez-les.

    Retour TPs

    Modifié le 17/10/20