Universit´e Paris 7 Java
Licence Informatique Ann´ee 2005-2006
TD n7 - Correction
TD sur machine, h´eritage
Exercice 1 La commande javap permet de d´esassembler le code produit par le compilateur
javac. Cela peut vous permettre d’observer concrˆetement ce que produit implicitement la com-
pilation.
Par exemple, si vous d´efinissez une classe qui n’a aucun constructeur, nous avons vu en cours
que la compilation avec javac g´en´erait un constructeur par d´efaut.
De mˆeme, si dans le constructeur d’une sous-classe vous n’effectuez aucun appel explicite
au constructeur de la super-classe, le code produit par la compilation de la sous-classe pour le
constructeur comprendra comme premi`ere instruction l’appel du constructeur sans param`etre
de la super-classe.
1. Ecrivez le code suivant, issu du TD 6. Sauvegardez dans un fichier, et compilez-le avec
javac.
class Ex1b{
int a ;
}
class Ex1b2 extends Ex1b{
int b ;
Ex1b2(int a , int b){
this.a = a ;
this.b = b ;
}
}
2. D´esassemblez le fichier Ex1b.class produit par la compilation en tapant javap Ex1b. Vous
obtenez la description de la classe Ex1b telle qu’elle a ´et´e compil´ee par javac. De quelle
classe Ex1b est-elle implicitement une sous-classe ? Rep´erez le prototype du constructeur
par d´efaut.
Correction :
Compiled from "Ex1b2.java"
class Ex1b extends java.lang.Object{
int a;
Ex1b();
}
3. De mˆeme, d´esassemblez le fichier Ex1b2.class. Utilisez ensuite la commande javap -c
Ex1b2, ce qui vous permettra d’obtenir le d´etail du code ex´ecut´e par le constructeur, sous
forme d’instructions ´el´ementaires de la machine virtuelle. Il n’est pas n´ecessaire que vous
compreniez le d´etail de toutes ces instructions. Quelle ligne vous semble ˆetre l’invocation
du constructeur par d´efaut de Ex1b dans le constructeur de Ex1b2 ?
Correction :
1
> javap Ex1b2
Compiled from "Ex1b2.java"
class Ex1b2 extends Ex1b{
int b;
Ex1b2(int,int);
}
> javap -c Ex1b2
Compiled from "Ex1b2.java"
class Ex1b2 extends Ex1b{
int b;
Ex1b2(int,int);
Code:
0: aload_0
1: invokespecial #1; //Method Ex1b."<init>":()V
4: aload_0
5: iload_1
6: putfield #2; //Field a:I
9: aload_0
10: iload_2
11: putfield #3; //Field b:I
14: return
}
4. Que pouvez vous en d´eduire sur une des toutes premi`eres instructions du constructeur de
Ex1b ? V´erifiez votre hypoth`ese `a l’aide de la commande javap -c Ex1b.
Correction : Le constructeur g´en´er´e de Ex1b appellera le constructeur de la classe Object.
> javap -c Ex1b
Compiled from "Ex1b2.java"
class Ex1b extends java.lang.Object{
int a;
Ex1b();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
}
Exercice 2 Cet exercice est une reformulation du deuxi`eme exercice du TD 6.
1. Ecrivez une classe Figure. Cette classe a des attributs priv´es abscisse et ordonnee, ainsi
qu’une couleur. Les couleurs seront repr´esent´ees par des objets de la classe Color que vous
pouvez utiliser `a condition de mettre en tˆete de votre fichier : import java.awt.Color;.
Le constructeur de la classe Figure instanciera chaque attribut priv´e. La m´ethode toString()
permettra de donner une repr´esentation de l’objet sous forme de chaˆıne de caract`eres. Vous
regarderez la documentation de la classe java.awt.Color pour choisir la constante cor-
respondant `a votre couleur pr´ef´er´ee pour faire un test de votre classe.
Correction :
import java.awt.Color ;
2
public class Figure{
private int abscisse ;
private int ordonnee ;
private Color couleur ;
public Figure(int abscisse , int ordonnee , Color couleur){
this.abscisse = abscisse ;
this.ordonnee = ordonnee ;
this.couleur = couleur ;
}
public String toString(){
return ("abscisse: " + abscisse + " ordonnee: " + ordonnee + " couleur: " + couleur) ;
}
public static void main(String[] argv){
Figure f = new Figure(12 , 13 , Color.cyan) ;
System.out.println(f) ;
}
}
2. Ecrivez deux classes Carre et Rectangle qui h´eritent de Figure.Carre a un attribut cˆot´e
et Rectangle a des attributs hauteur et longueur. Comme d’habitude, testez vos classes.
Correction :
//fichier Carre.java
import java.awt.Color ;
public class Carre extends Figure{
private int cote ;
public Carre( int abscisse , int ordonnee , Color couleur , int cote ){
super( abscisse , ordonnee , couleur ) ;
this. cote = cote ;
}
public String toString(){
return ( super.toString() + " cote: " + cote ) ;
}
public static void main(String[] argv){
Cercle c = new Cercle(12,10,Color.cyan, 50) ;
System.out.println(c) ;
}
}
//fichier Rectangle.java
public class Rectangle extends Figure{
private int hauteur ;
private int longueur ;
public Rectangle( int abscisse , int ordonnee , Color couleur , int hauteur , int longueur ){
super( abscisse , ordonnee , couleur ) ;
this.hauteur = hauteur ;
this.longueur = longueur ;
}
public String toString(){
return ( super.toString() + " hauteur: " + hauteur + " longueur: " + longueur ) ;
}
3
public static void main(String[] argv){
Rectangle r = new Rectangle( 12 , 10 , Color.cyan , 50 , 100 ) ;
System.out.println(r) ;
}
}
3. Ajoutez `a Figure une variable de classe priv´ee Vector qui devra r´ef´erencer toutes les
instances de sa classe et de ses sous classes. Comment allez vous remplir ce vecteur ? Vous
d´efinirez ´egalement une m´ethode publique getInstances() qui permettra d’acc´eder `a ce
vecteur.
Correction :
//Fichier Figure.java
import java.awt.Color ;
import java.util.Vector ;
public class Figure{
private static Vector instances = new Vector() ;
private int abscisse ;
private int ordonnee ;
private int couleur ;
public Figure( int abscisse , int ordonnee , Color couleur ){
this.abscisse = abscisse ;
this.ordonnee = ordonnee ;
this.couleur = couleur ;
instances.add(this) ;
}
public static Vector getInstances(){
return instances ;
}
public String toString(){
return (abscisse + " " + ordonnee + " " + couleur) ;
}
public static void main(String[] argv){
Figure f = new Figure(12 , 13 , Color.cyan) ;
System.out.println((f.getInstances()).size()) ;
}
}
4. Dans Carre et Rectangle, red´efinissez cette m´ethode getInstances() de mani`ere `a ne
r´ecup´erer que les instances qui correspondent `a leur type. Il n’est pas n´ecessaire d’ajouter
un attribut `a ces classes ou de modifier leur constructeur.
Correction : On d´eduira ais´ement une solution pour la classe Rectangle d’une solution pour la classe
Carre :
public static Vector getInstances(){
int nCarre = 0 ;
Vector instancesCarre = new Vector() ;
Vector instances = Figure.getInstances() ; // static pas de super
Enumeration e = instances.elements() ;
Figure uneFigure ;
while( e.hasMoreElements()){
uneFigure = (Figure) e.nextElement() ;
if (uneFigure instanceof Carre)
4
instancesCarre.add(uneFigure) ;
}
return instancesCarre ;
}
//Fichier Test.java
import java.util.Vector ;
import java.util.Enumeration ;
public class Test{
public static void main(String[] argv){
Figure f1 = new Figure(1,1,Color.cyan) ;
Figure f2 = new Figure(2,2,Color.red) ;
Carre c3 = new Carre(3,3,Color.green,3) ;
Figure f4 = new Figure(4,4,Color.pink) ;
Carre c5 = new Carre(5,5,5,Color.black) ;
System.out.println("Liste des figures") ;
Enumeration e = Figure.getInstances().elements() ;
while(e.hasMoreElements()){
System.out.println(e.nextElement()) ;
}
System.out.println("Liste des carres") ;
e = Carre.getInstances().elements() ;
while(e.hasMoreElements()){
System.out.println(e.nextElement()) ;
}
}
}
Exercice 3 [Evaluateur d’expressions bool´eennes] Pour ceux qui ont encore du temps
L’objectif de cet exercice est d’´ecrire un programme prenant une expression bool´eennes en nota-
tion postfixe en argument, affichant l’expression en ordre infixe (avec parenth`eses) puis affichant
le r´esultat de l’´evaluation de cette expression.
Par exemple :
java Eval 1 0 + 1 .
affichera :
(true.(false+true)) = true
On utilise des bool´eens comme valeurs et les op´erateurs sont : +(ou), .(et) et -(non). On d´efinira
une interface ExprBool ainsi que les classes suivantes : Eval,OpBin,OpUn,Ou,Et,Non et
MyBoolean. Pour la pile, on pourra utiliser la classe pr´ed´efinie Stack.
1. Ecrire le graphe d’h´eritage des classes demand´ees.
2. Ecrire l’interface Expr qui sp´ecifie deux m´ethodes : public boolean eval() et
public String toString().
Correction :
interface Expr {
public boolean eval();
public String toString();
}
5
1 / 7 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !