TP JAVA 2

1 Classes d'objets géométriques : architecture de classes

On souhaite disposer d'un ensemble de classes permettant de manipuler des objets géométriques en 2 dimensions (on ne s'occupe pas de leur représentation graphique!).

 

Ecrivez les classes reflétant la structure suivante :

 

A/  Ecrire les classes vides avec seulement les relations d’héritage dans un fichier nommé Forme.java

B/   Donner les  propriétés de chaque classe pour pouvoir calculer leur périmètre et leur aire.

      (Réfléchir à leur positionnement : par exemple un rayon dans cercle et 2 rayons dans ellipse).

C/ Dans quelle(s) classe(s) positionner la méthode aire() calculant la surface des objets ?

      De même pour la méthode perimetre() permettant de calculer leur perimetre ?

 

Note :

Cercle : aire=PIxR2 périmètre=2xPIxR

Ellipse: aire=PIxR1xR2 périmètre=2xPIxsqrt(0.5x(R12+ R22))

2 Programme de test (main)

Ecrivez un fichier Java qui utilise (=instancie) ces classes dans une classe nommée FormeTest.

class FormeTest {

 

static void affiche(Forme f)

{

   System.out.println("aire :"+f.aire() );

   System.out.println("parametre :"+f.perimetre() );

}

 

public static void main(String[] args) {

  Cercle c;

  Rectangle r;

  c=new Cercle();

  r=new Rectangle();

  c.rayon=10;

  r.longueur=3;

  r.largeur=2;

  affiche(c) ;

  affiche(r) ;

}

3 Constructeurs

Ecrire un constructeur pour chaque classe (un constructeur est chargé d’initialiser les propriétés d’un objet).

Modifier le main de FormeTest pour utiliser ces constructeurs.

4 Identification des instances

On veut pouvoir identifier les objets. Le mieux sera de leur donner un nom lors de leur création (exemple : Cercle c=new Cercle("mon cercle", 2.5)).
Le plus judicieux est de rajouter la propriété « nom » dans la classe la plus haute (Forme). Vous comprenez pourquoi ?

A/ Modifier les constructeurs en conséquence (pour qu’ils initialisent également le nom de l’instance).

 

B/ Faire en sorte que la méthode affiche () du point 2 affiche également le nom de l’objet f.  

C/ Modifier le main de FormeTest pour que celui crée un tableau « Formes » d’objets formes, puis fasse une boucle qui appelle affiche() pour chacun des éléments (en affichant leur nom également donc)

 

Exemple :

    // On crée un tableau de formes

    System.out.println("Je crée un tableau de Forme");

 

    Forme Formes[] = {

      new Rectangle("mon rectangle", 10.0, 20.0),

      new Carre("mon carre", 5.0),

      new Ellipse("mon ellipse", 4.0, 3.0),

      new Cercle("mon cercle", 2.0)

    };

5 Comptabilisation des instances (supplément sur static)

A/ Utiliser une propriété de classe (static) « count » pour permettre de comptabiliser le nombre d’objets (=d'instances) de la classe « Forme » qui ont été créé.

B/ prévoir le cas de suppression d'instances. Utilisation de « destructeur »

Exemple de destructeur: 

  protected void finalize() throws Throwable {

    System.out.println("Forme.finalize");

    count--;

    super.finalize();

  }


C/Faire de même pour comptabiliser le nombre de :

·        formes géométriques (cad dérivant de la classe Carre)

·        formes circulaires (cad dérivant de Cercle)

D/Vérifier l’exécution du code suivant (qui suit le code du main qui vous avez écrit dans la partie 4):

    // On affiche le nombre d'instances dans chacunes des classes

    System.out.println("Nombre de Formes : " + Forme.count);

    System.out.println("Nombre de Formes géométriques :" + Carre.count);

    System.out.println("Nombre de Formes circulaires  :" + Cercle.count);

 

    // On detruit le tableau

    System.out.println("Je detruit le tableau de Forme");

    Formes = null;

 

    // On invoque explicitement le GC pour etre sur que le tableau soit detruit

    System.gc();

 

    // On s'endort 1 seconde pour que le GC puisse travailler

    try {Thread.sleep(1000);} catch(Exception e) {}

 

    // On affiche le nombre d'instances dans chacunes des classes

    System.out.println("Nombre de Formes : " + Forme.count);

    System.out.println("Nombre de Formes géométriques :" + Carre.count);

System.out.println("Nombre de Formes circulaires  :" + Cercle.count);