:: Enseignements :: ESIPE :: E3INFO :: 2007-2008 :: Programmation Objet avec Java ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) |
Redéfinition, Paquetage, structure de données, relation d'implantation
|
Exercice 1 - Redéfinition
class A {
protected int x() {
return 3;
}
public void printX() {
System.out.println(x());
}
}
class B extends A {
public int x() {
return 4;
}
}
class Test {
public static void main(String[] args) {
A a=new A();
System.out.println(a.x());
a.printX();
B b = new B();
System.out.println(b.x());
b.printX();
A ab=new B();
System.out.println(ab.x());
ab.printX();
}
}
-
Quelle sont les valeurs affich�es par le main ?
-
Combien de méthodes x() sont accessibles dans B
(i.e. � combien de méthodes x une méthode de
B a t-elle accès) ?
S'il y en a plusieurs, donner pour chacune un moyen d'accès ?
-
Même questions, mais en se pla�ant dans Test.
-
Donnez le nom du mécanisme utilisé dans B
à propos de la méthode x().
-
Que se passe t'il si les x() sont
des méthodes statiques.
-
Que se passe t'il si les x sont
des champs.
Exercice 2 - Surcharge, redéfinition, appel de méthode
Dans les exemples de classes suivants vous commencerez par dire
où se trouvent les erreurs de compilation.
Vous les expliquerez et retirerez les méthodes en provoquant.
Vous indiquerez ensuite où sont les surcharges et les redéfinitions.
Pour les appels de méthodes vous indiquerez également les méthodes appelées.
class A {
public void a() {System.out.println("Aa"); }
void b(B b) {System.out.println("Ab(B)");}
void c() {System.out.println("Ac");}
void c(A a) {System.out.println("Ac(A)"); }
void c(B b) {System.out.println("Ac(B)"); }
static void d() {System.out.println("static Ad");}
void e() {System.out.println("Ae");}
Object f() {System.out.println("Af"); return 2;}
int g() {System.out.println("Ag"); return 2;}
void h() throws Exception {System.out.println("Ah"); }
void i() throws Exception {System.out.println("Ai"); }
void j() throws Exception, ArrayIndexOutOfBoundsException {System.out.println("Aj"); }
protected void k() {System.out.println("Ak");}
}
class B extends A{
public void a() {System.out.println("Ba"); }
protected void b(B b) {System.out.println("Bb(B)");}
public void c(A a) {System.out.println("Bc(A)");}
static void d() {System.out.println("static Bd");}
static void d(A a) {System.out.println("Bd(A a)");}
String f() {System.out.println("Bf"); return "c";}
char g() {System.out.println("Bg"); return 'c';}
void h() throws IOException {System.out.println("Bh"); }
void i() {System.out.println("Bi");}
void j() throws IllegalArgumentException {System.out.println("Bj"); }
private void k() {System.out.println("Bk");}
}
class Min {
public static void main(String[] args) {
A aa = new A();
A ab = new B();
B bb = new B();
aa.a();
ab.a();
aa.b(aa);
ab.b(ab);
bb.e();
aa.d();
bb.d();
aa.c(aa);
aa.c(ab);
aa.c(bb);
ab.c(aa);
ab.c(ab);
ab.c((B)ab);
ab.c(bb);
ab.c((A)bb);
((B)ab).c(aa);
((B)ab).c(ab);
((B)ab).c((B)ab);
((B)ab).c(bb);
bb.c(ab);
bb.c(bb);
((A)bb).c(aa);
bb.c(ab);
bb.c(bb);
}
}
Exercice 3 - Les liste chaînée
Le but de cet exercise est d'�crire une implanattion de liste
de chaînée en utilisant les paquetages.
Les sources (les .java) seront
stockées dans un répertoire nommé src.
Pour la suite de l'exercise, l'ensemble des classes créées
devra être créé dans le paquetage fr.umlv.datas.
Pour cela, créer un répertoire "fr" dans le répertoire "src",
puis un répertoire "umlv" � l'intérieur du répertoire "fr"
et enfin un répertoire "datas" � l'intérieur du
répertoire "umlv".
Les fichiers sources (.java) du paquetage
fr.umlv.datas seront donc stockées
dans le répertoire src/fr/umlv/datas
Nous allons dans un premier temps, créer une liste chaînée de
chaîne de caractères.
-
Créer une classe fr.umlv.datas.Link correspondant à un
maillon de la liste chaînée.
(donc un fichier Link.java dans le répertoire
src/fr/umlv/datas
Pour compiler, placez-vous dans src et
écrire javac fr/umlv/datas/Link.java.
Où est généré le .class correspondant ?
-
Quelle est la commande pour exécuter le main
de la classe fr.umlv.datas.Link ?
-
Créer une classe fr.umlv.datas.LinkedLink qui maintient
une référence sur le premier maillon de la liste.
Cette classe devra définir les méthodes :
-
add(String text) qui ajoute un élément
avant le premier élément.
-
size() qui affiche le nombre d'�l�ments de
la liste.
-
toString() qui affiche le contenu de
la liste.
Pour tester ses classes, créer une classe Main
sans paquetage (on dit dans le paquetage par défaut) et
utiliser le mot-clé import pour utiliser
les classes fr.umlv.datas.Link et
fr.umlv.datas.LinkedLink.
Exercice 4 - liste chaînée (suite)
-
Jusqu'� pr�sent les fichiers byte-code
sont stockés au même endoit que les .class.
Nous allons demander au compilateur de générer ceux-ci
dans un autre répertoire.
Pour cela, utilisez l'option '-d' du compilateur,
donc avec le chemin courant pointant sur src :
javac -d ../classes fr/umlv/datas/*.java
Noter que l'arborescence des répertoires sous classes
est généré automatiquement.
-
Quelle ligne de command doit-on maintenant utiliser pour exécuter
le main de test :
-
Si on se place dans le répertoire classes
-
Si on se place dans le répertoire
parent des répertoires src et classes.
-
A quoi sert la variable d'environnement CLASSPATH ?
-
Renommer la classe Main en fr.umlv.datas.main.Main.
-
Implanter String get(int index) qui renvoie la
indexième chaîne de caractère.
Que doit-on faire si l'index est invalide ?
Pourquoi serait-il logique de changer l'implantation de
size pour que la méthode s'exécute en temps constant ?
Ré-implanter size.
-
Changer la classe fr.umlv.datas.LinkedLink
pour une implantation plus générique à base d'Object.
Que doit-on changer dans la classe fr.umlv.datas.main.Main ?
-
Implanter la méthode boolean contains(Object o) indiquant si un objet
est où non contenu dans la liste chaînée.
© Université de Marne-la-Vallée