TP JAVA 2
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))
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) ;
}
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.
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)
};
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);