BE Chapitre #1 - Classes et composition

S7 Appro – Inf A3 EG - Applications concurrentes, mobiles et réparties en Java

Objectifs :

  • Découverte de Java et de l’IDE VSCodium
  • Classes et attributs
  • Composition de classes
  • Héritage
  • Interfaces

Comment créer un projet avec VSCodium ?

Pour créer un nouveau projet Java, utiliser Command+Shift+P sous Mac, ou Control+Shift+P sous Windows pour accéder à la Palette. Tapez dans la barre create java et sélectionnez le menu Java: Create Java Project, puis No build tools. Sélectionnez un répertoire de travail dans lequel le projet sera déposé (il vous sera possible de créer plusieurs projets dans le même répertoire de travail), et donnez un nom à votre projet (p. ex. HelloWorld). Par défaut, votre projet contient un fichier appelé App.java, avec

public class App {
    public static void main(String[] args) throws Exception {
        System.out.println("Hello, World!");
    }
}

Vous pouvez le renommer en HelloWorld.java. Vérifiez que le nom de la classe principale change également avec le même nom (en validant la demande de confirmation).

L’exécution du projet peut se faire soit par la barre d’outils verticale-gauche (menu contextuel sur le fichier HelloWorld.java), soit par la barre d’outils horizontale-haute (la petite fleche à droite). Après exécution, vous devriez voir apparaître le texte Hello, World dans le terminal de l’application.

La barre d’outils verticale-gauche vous donne accès, de haut en bas:

  • à la création/l’édition des fichiers.
  • à la recherche d’information (variables, méthode…) dans votre dossier.
  • à la gestion de versions (git) de votre projet.
  • à l’exécution et le débogage.
  • à la gestion des packages d’extension.

Exercice 1 : classe Point

Dans le même répertoire de travail, créez un nouveau projet appelé TestPoint, comme cela a été fait précédemment. La classe crée lors de la création du projet contiendra le programme principal. Créez une seconde classe java appelée Point (accéder à la Palette, et tapez new java class). Ainsi vous avez un projet constitué de 2 fichiers (et donc de 2 classes).

Un point est caractérisé par deux coordonnées, représentées par deux nombres de type double.

  • Déclarez les deux coordonnées comme des attributs privés (on pourra les appeler x et y).
  • Créez un constructeur qui affecte les valeurs qui lui sont transmises (arguments du constructeur) aux deux attributs de l’objet en cours de création.
  • Programmez un méthode affiche(…) qui affiche sur la console le texte suivant par exemple : Coordonnées actuelles du point : 3 et 5_.
  • Dans le programme principal de la classe principale, créez un premier point P1 de coordonnées 3 et 4, et un second point P2 de coordonnées -1 et 2. Utilisez la méthode affiche(…) sur les deux points.
  • Constatez ce que produit sur la console l’instruction suivante System.out.println( P1 ); (instruction à taper dans le programme principal). Ajouter maintenant une méthode toString() dans votre classe Point (ça peut se faire automatiquement en utilisant le menu contextuel sur votre fichier Point.java, puis Action de la source… (mauvaise traduction de source action…) et sélectionnez toString…), et constatez la différence ! La méthode affiche() n’est donc plus nécessaire.
  • Programmez une méthode symetrique(…) qui transforme l’objet courant en son symétrique par rapport à l’origine. Testez sur P1 et vérifiez le résultat en affichant à nouveau le point.
  • Programmez une méthode distance(…) qui retourne la distance entre le point et l’origine. La racine-carrée d’un nombre réel a se calcule grâce à l’instruction Math.sqrt(a). Vérifiez votre méthode en affichant, dans le programme principal, le résultat récupéré dans une variable.
  • Créez finalement, dans le programme principal, un tableau de 3 points, que vous initialiserez comme bon vous semble, et affichez tous les points à l’aide d’une boucle for (…).

Exercice 2 : classe Individu

Décrire une classe Individu qui caractérise une personne par son prénom (une variable de type String) et son âge. La classe sera dotée

  • d’un constructeur qui initialise les paramètres internes de l’objet.
  • de deux méthodes pour changer le prénom et l’âge de l’Individu (les setter, qui peuvent être générer automatiquement par VSCodium en utilisant action de la source… vu précédemment).
  • de deux méthodes pour obtenir de l’objet le prénom et l’âge de l’Individu (les getter, kif-kif ci-dessus).
  • d’une méthode d’affichage des informations sur l’individu (toString(…)).
  1. Donner la représentation graphique de la classe sous forme de boite UML.

  2. Écrire un programme principal utilisant les capacités dont la classe est dotée.


Exercice 3 : classe Segment - Composition

Un segment du plan est formé de 2 points. La classe Point est celle décrite dans l’exercice 2. La classe Segment sera dotée

  • D’un constructeur sans argument : les deux points seront initialisés à (0,0) et (1,1).
  • D’un constructeur prenant en argument les deux points support du segment.
  • De la redéfinition de la méthode toString de telle sorte que l’affichage affiche les coordonnées des points du segment.
  • D’une méthode qui renvoie la longueur du segment.
  1. Donner la représentation UML de la classe Segment.

  2. Dessiner la représentation graphique illustrant les liens de composition entre la classe Point et la classe Segment.

  3. Générer le code de la méthode toString.

  4. Faire un programme principal qui utilise les méthodes publiques de votre classe.


Exercice 4 : Classe Polygone comme un Arraylist - Composition

L’objectif est de créer une classe Polygone qui doit permettre de stocker et de manipuler un ArrayList de points. Un tel ArrayList se crée de la manière suivante :

ArrayList<Point> polygone;          // Création de la variable polygone
polygone = new ArrayList<Point> (); // Création de l'objet par appel au constructeur

La liste de points est initialement vide. On pourra, pour notre exercice, utiliser les méthodes add(), set(), contains() et size() de la classe ArrayList. N’oubliez pas d’importer la bibliothèque requise pour utiliser de telles listes : pour cela, l’instruction import java.util.ArrayList; doit être ajoutée au-dessus de la classe principale (VSCodium se charge de le faire pour vous en utilisant le menu contextuel sur l’ampoule).

Boite UML des 2 classes


Exercice 5 : Interfaces

  1. Classe TailleHaie

    Un taille-haie est caractérisé par sa cadence de coupe, typiquement 4500 coupes/minute. On prévoira

    • un constructeur qui initialisera le taille-haie dans l’état éteint, avec une cadence de 0.
    • SwitchOn() : méthode qui allume l’outil et fixe la cadence à 4500.
    • SwitchOff() : méthode qui éteint l’outil et fixe la cadence à 0.

    Dessiner la représentation UML de cette classe.

  2. Classe Tondeuse

    Sur le même modèle, une tondeuse est caractérisée par la vitesse de rotation de sa lame, typiquement 1000 tours/minute. On prévoira :

    • un constructeur qui initialisera la tondeuse dans l’état éteint, avec une vitesse de 0.
    • SwitchOn() : méthode qui allume l’outil et fixe la cadence à 1000.
    • SwitchOff() : méthode qui éteint l’outil et fixe la cadence à 0.

    Dessiner la représentation UML de cette classe.

  3. Interface Demarrable

    • Déclarer les méthodes SwitchOn() et SwitchOff() comme les services d’une interface appelée Demarrable (mot-clé interface). Ré-écrire en conséquence les en-têtes des classes qui implémentent ce service (mot-clé implements).
    • Donnez la représentation UML des liens entre les deux classes TailleHaie et Tondeuse, et l’interface Demarrable.

    Programme principal : Écrire un programme principal qui crée un taille-haie et une tondeuse et utilise les services à leur disposition.

  4. Il s’agit de créer une classe Jardinier dont les attributs seront le prénom du jardinier et l’outil démarrable qu’il doit utiliser pour travailler (un taille-haie ou une tondeuse). Au moment de sa création, on suppose que le jardiner n’a pas d’outils en main. L’outil à utiliser sera transmis comme argument à la StartTravail(…). Prévoyez également une méthode StopTravail(…).

    Écrire un petit programme principal qui teste les capacités de votre classe.


Exercice 6 : Taxi - héritage

Nous cherchons à simuler le travail journalier d’un taxi qui charge et décharge des clients. À la fin de la journée, le taxi doit connaître le temps total de sa journée utilisé à transporter des clients.

- Une **Personne** est désignée par son nom. Un client est une instance de personne.
- Un **TaxiDriver** est une **Personne** qui possède un identifiant de type entier (carte professionnelle).
- Une **Voiture** est caractérisée par son immatriculation (chaînes de caractères).
- Un **Taxi** est une **Voiture** avec un **TaxiDriver**.
- Une **Course** permet de se souvenir du temps passé à convoyer un client, et renvoie, lorsqu'elle s'arrête, le temps écoulé depuis son début. Pour simuler le temps, on prendra une durée de 1 pour chaque client transporté.

Un taxi peut charger un client que s’il n’en n’a pas un déjà ! Il ne peut décharger un client que s’il en a un !


Exercice 7 : Age du Capitaine - Exceptions

Remarque : Pour cet exercice, vous pouvez utiliser une partie du code de l’exemple de la suite de Syracuse, disponible au téléchargement sur la page du cours.

Créez une classe AgeCapitaine qui aura comme simple objectif de stocker le prénom et l’âge d’un capitaine de navire. Cet entier et cette chaîne seront transmis au constructeur, au moment de la création de l’objet.

AgeCapitaine MonCaptinaine = new AgeCapitaine(30, "André");

La seule contrainte que l’on impose est que l’âge d’un capitaine doit être comprise entre 18 et 65 ans, tout autre âge entraînant la levée d’une exception spécifique appelée AgeCapException.

Dans le programme principal, demandez l’âge du capitaine à l’utilisateur du programme. Le comportement attendu est le suivant : - Si la donnée entrée par l’utilisateur n’est pas un entier, attrapez une exception classique (cf Syracuse.java). - Si la donnée est un entier non compris entre 18 et 65 ans, attrapez une exception AgeCapException, qui affichera un message du style L'âge du capitaine André est de 100 ans !!!.

Si l’un ou l’autre des 2 exceptions est attrapée, reposez la question de l’âge du capitaine à l’utilisateur (jusqu’à ce qu’il entre un âge admissible).