Telechargé par abdellah elmamoun

1011-exam-enonce

publicité
École d’ingénieurs du
Concours TÉLÉCOM INT
l
ia
es
Examen 2009-2010 - Durée : 2h
P
UH
y
nc
POO : Programmation Orientée Objet
a
N
Première année
Nom :
Prénom :
. Question 1. (2 pt)
Indiquer si l’affirmation est correcte ou non :
École Supérieure d’Informatique
et Applications de Lorraine
www.esial.uhp-nancy.fr
Vrai
Faux
Il est interdit de définir un constructeur dans une classe abstraite (abstract).
En Java, la méthode qui sera appelée est toujours déterminée à la compilation.
En Java, seul le type dynamique d’une référence est utilisée pour déterminer la méthode à appeler.
Une méthode privée (private) ne peut pas être abstraite (abstract).
Une méthode abstraite (abstract) peut être déclarée (final).
L’opérateur de transtypage (cast) permet de changer le type dynamique d’une référence.
L’opérateur de transtypage (cast) permet uniquement de changer le type statique d’une référence.
Une classe peut implémenter deux interfaces définissant la même méthode.
En Java, l’encapsulation est une encapsulation de classe.
Deux classes peuvent hériter de la même classe mère.
. Question 2. (1 pt)
Considérer les classes suivantes et indiquer la réponse correcte :
1
2
3
TestCounter.java
class Counter {
public static int counter = 0;
public void increment() {
counter++;
}
public int getValue() {
return counter;
}
4
5
6
7
8
9
Ce code ne compile pas (erreur ligne 2).
Ce code ne compile pas (erreur ligne 5).
10
11
}
Ce code ne compile pas (erreur lignes 15 et 17).
12
class TestCounter {
public static void main(String args[]) {
Counter c1 = new Counter();
c1.increment();
Counter c2 = new Counter();
c2.increment();
Ce code compile et le programme affiche : 0
13
14
15
16
17
18
Ce code compile et le programme affiche : 2
System.out.println(c2.getValue());
19
}
20
21
Ce code compile et le programme affiche : 1
}
. Question 3. (2 pt)
Considérer les classes suivantes et indiquer les réponses correctes :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ErrorMaze.java
class Except extends Exception {}
class ErrorMaze {
public static void main(String args[]) {
int n=0;
try {
for (n=1; n<4; n++)
f(n);
} catch (Except e) {
System.out.println("main.catch("+n+")");
} finally {
System.out.println("main.finally("+n+")");
}
}
public static void f(int n) throws Except {
try {
if (n!=1) throw new Except();
} catch (Except e) {
System.out.println("f.catch("+n+")");
throw e;
} finally {
System.out.println("f.finally("+n+")");
}
}
16
17
18
19
20
21
22
23
24
25
26
}
– À
la première itération :
il n’y a pas de première itération
le code affiche f.finally(1)
le code affiche f.catch(1) suivi de main.finally(1)
– À
la seconde itération :
il n’y a pas de seconde itération
le code affiche f.finally(2)
le code affiche f.catch(2) suivi de main.finally(2)
suivi de f.finally(2)
le code affiche f.catch(2) suivi de f.finally(2)
suivi de main.catch(2) suivi de main.finally(2)
le code affiche f.catch(2) suivi de main.catch(2)
suivi de main.finally(2) suivi de f.finally(2)
le code affiche f.catch(2) suivi de main.catch(2)
suivi de f.finally(2) suivi de main.finally(2)
– À la troisième itération :
il n’y a pas de troisième itération
le code affiche la même chose que pour la seconde itération
mais avec la valeur 3 (au lieu de 2) ;
Examen 2009-2010 - Durée : 2h
. Question 4. (1 pt)
Considérer la classe suivante et indiquer la/les réponses correcte(s) si l’instruction proposée est insérée en ligne
30. Si il n’y a pas d’erreur, préciser l’affichage.
1
2
3
Equals.java
class Animal {
protected long uniqueId;
public Animal(long myid) {
this.uniqueId = myid;
}
public boolean equals(Animal a) {
return (a.uniqueId == this.uniqueId);
}
4
5
6
7
8
9
10
11
}
12
13
class Duck extends Animal {
private String name;
public Duck(long myid, String name) {
super(myid);
this.name = name;
}
public boolean equals(Duck d) {
return (d.uniqueId == this.uniqueId
&& this.name.equals(d.name));
}
}
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Main {
public static void main(String args[]) {
boolean flag = false;
Duck donald = new Duck(1L, "Donald");
Duck cloneA = new Duck(1L, "CloneA");
Animal cloneB = new Duck(1L, "CloneB");
// instruction a inserer
System.out.println(flag);
}
}
Erreur
Ok
flag = donald.equals(cloneA);
flag = cloneA.equals(donald);
flag = donald.equals(cloneB);
flag = cloneB.equals(donald);
Affichage
. Question 5. (1 pt)
Indiquez les concepts mis en œuvre dans le sujet de TP portant sur la course (Race, Team, Racer, etc.)
Vrai
Faux
l’héritage.
le polymorphisme.
la délégation.
la généricité.
l’encapsulation.
. Question 6. (1 pt)
Considérer les classes suivantes et indiquer la réponse correcte. Justifier votre réponse.
1
2
3
4
5
6
7
8
9
10
TestArray.java
import java.util.ArrayList;
class TestArray {
public static void main(String args[]) {
ArrayList<Object> names = new ArrayList<Object>();
names.add("coin");
names.add("coin");
printValues(names);
}
Ce code compile et le programme affiche : coincoin
Ce code compile et le programme affiche : coin
public static void printValues(ArrayList<String> tab) {
for (int i=0; i<tab.size(); i++)
System.out.print(tab.get(i));
}
11
12
13
14
15
Ce code ne compile pas (erreur à la ligne 8).
}
Justification :
. Question 7. Tableaux à taille fixe (2 pt)
En Java, il n’existe pas à proprement parlé de tableaux à n dimensions. Un tableau à 2 dimensions est modélisé par un
tableau dont chaque élément est un autre tableau. Cependant, rien ne garanti que chaque “tableau élément” a la même
dimension. Complétez la méthode suivante qui indiquera si un tableau à deux dimensions est “régulier”, autrement
dit si tous les tableaux éléments ont la même longueur. Vous traiterez avec soin le cas où les références sont null et
vous retournerez le résultat le plus tôt possible.
1
2
3
public static boolean isRegular(Object[][] t) {
// à compléter
}
2
Examen 2009-2010 - Durée : 2h
. Question 8. (2 pt)
Le programme suivant est constitué d’une seule classe. Récrivez ce programme en utilisant l’héritage, le polymorphisme
et la liaison dynamique.
Mess.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import java.util.List;
import java.util.ArrayList;
class FormeGeometrique {
public static final int
public static final int
public static final int
public static final int
public static final int
NON_DEFINI = 0;
RECTANGLE = 1;
CERCLE = 2;
TRIANGLE = 3;
COMPOSEE = 4;
private int type = NON_DEFINI;
private double a;
private double b;
private double c;
private List<FormeGeometrique> formes;
public FormeGeometrique() {
this.type = COMPOSEE;
this.formes = new ArrayList<FormeGeometrique>();
}
public FormeGeometrique(double r) {
this.type = CERCLE;
this.a = r;
}
public FormeGeometrique(double l, double ll) {
this.type = RECTANGLE;
this.a = l;
this.b = ll;
}
public FormeGeometrique(double c1, double c2, double c3) {
this.type = TRIANGLE;
this.a = c1;
this.b = c2;
this.c = c3;
}
public void add(FormeGeometrique f) {
this.formes.add(f);
}
public double calculerPerimetre() {
switch (this.type) {
case RECTANGLE:
return 2.*a+2.*b;
case CERCLE:
return 2.*Math.PI*a;
case TRIANGLE:
return 1./4.*Math.sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c));
case COMPOSEE:
double s = 0.;
for (FormeGeometrique f : formes)
s += f.calculerPerimetre();
return s;
default:
return 0.;
}
}
public double calculerAire() {
switch (this.type) {
case RECTANGLE:
return a*b;
case CERCLE:
return Math.PI*a*a;
case TRIANGLE:
return a+b+c;
case COMPOSEE:
double s = 0.;
for (FormeGeometrique f : formes)
s += f.calculerAire();
return s;
default:
return 0.;
}
}
}
class DirtyProgram {
public static void main(String args[]) {
FormeGeometrique f1 = new FormeGeometrique(10,10);
FormeGeometrique f2 = new FormeGeometrique(10,15,17);
FormeGeometrique f3 = new FormeGeometrique();
f3.add(f1);
f3.add(f2);
System.out.println("perimetre = "+f3.calculerPerimetre());
}
}
Examen 2009-2010 - Durée : 2h
. Question 9. (1 pt)
Quel est l’intérêt de réaliser une telle transformation. Justifiez votre réponse.
. Question 10. (1 pt)
Quelle est la différence conceptuelle entre une interface et une classe abstraite ?
. Question 11. (1 pt)
Pourquoi Java autorise-t-il la réalisation multiple d’interface et non pas l’héritage multiple ?
. Question 12. (2 pt)
Considérer la classe suivante et indiquer la réponse correcte si l’instructions proposée est insérée en ligne 11.
1
2
InstanceOf.java
class Machin {}
3
4
class Bidule {}
5
6
class Truc extends Machin {}
7
class Chose {
public static void main(String args[]) {
Object o = new Truc();
Machin a = new Machin();
// instruction a inserer
}
}
8
9
10
11
12
13
Truc t = (Truc) o;
Machin m = (Machin) o;
Bidule b = (Bidule) o;
Truc tr = (Truc) a;
Machin m2 = (Machin) a;
Bidule b2 = (Bidule) a;
Erreur
Erreur
(compilation)
(exécution)
Ok
Examen 2009-2010 - Durée : 2h
. Question 13. Schéma mémoire (3 pt)
Considérer les classes suivantes et réaliser des schémas de la mémoire (états de la pile et du tas) lors de l’exécution
de la méthode main() de la classe principale PokeWorld aux points identifiés dans le code source (indiqués par le
marqueur // POINT_? memory schema at this point).
Vous préciserez l’affichage obtenu sur la sortie standard à chaque étape.
PokeWorld.java
1
2
3
4
class PokeWorld {
public static void main(String args[]) {
PokeBall ball = new PokeBall();
Pokemon pikachu = new Mouse();
Pokemon pikachu2 = pikachu;
ball.catchPokemon(pikachu);
ball.catchPokemon(pikachu2);
System.out.println(ball);
System.out.println("pikachu == pikachu2 : "+(pikachu == pikachu2));
System.out.println("pikachu.equals(pikachu2) : "+(pikachu.equals(pikachu2)));
// POINT_1 -- draw memory schema at this point
5
6
7
8
9
10
11
12
13
Pokemon raichu = pikachu2.evolve();
ball.catchPokemon(raichu);
System.out.println(ball);
System.out.println("pikachu == pikachu2 : "+(pikachu == pikachu2));
System.out.println("pikachu == raichu : "+(pikachu == raichu));
System.out.println("pikachu2 == raichu : "+(pikachu2 == raichu));
System.out.println("pikachu.equals(pikachu2) : "+(pikachu.equals(pikachu2)));
System.out.println("pikachu.equals(raichu) : "+(pikachu.equals(raichu)));
System.out.println("pikachu2.equals(raichu) : "+(pikachu2.equals(raichu)));
// POINT_2 -- draw memory schema at this point
14
15
16
17
18
19
20
21
22
23
24
pikachu2 = raichu.regress();
System.out.println(ball);
System.out.println("pikachu == pikachu2 : "+(pikachu == pikachu2));
System.out.println("pikachu == raichu : "+(pikachu == raichu));
System.out.println("pikachu2 == raichu : "+(pikachu2 == raichu));
System.out.println("pikachu.equals(pikachu2) : "+(pikachu.equals(pikachu2)));
System.out.println("pikachu.equals(raichu) : "+(pikachu.equals(raichu)));
System.out.println("pikachu2.equals(raichu) : "+(pikachu2.equals(raichu)));
// POINT_3 -- draw memory schema at this point
25
26
27
28
29
30
31
32
33
}
34
35
1
2
3
4
5
6
7
8
}
Pokemon.java
import java.util.List;
import java.util.ArrayList;
abstract class Pokemon {
protected double size;
protected double weight;
protected String type;
public abstract Pokemon evolve() ;
public abstract Pokemon regress() ;
9
10
11
public String toString() {
return "[s:"+this.size+" w:"+this.weight+"]";
}
12
13
14
15
16
}
17
18
19
class PokeBall {
private List<Pokemon> pokemons;
public PokeBall() {
this.pokemons = new ArrayList<Pokemon>();
}
20
21
22
23
public void catchPokemon(Pokemon p) {
this.pokemons.add(p);
}
24
25
26
27
public String toString() {
String s = "";
for (Pokemon p : this.pokemons) {
s = s + p.toString()+ ";";
}
return s;
}
28
29
30
31
32
33
34
35
}
1
2
3
4
5
6
7
Mouse.java
class Mouse extends Pokemon {
public Mouse() {
this.size = 0.4;
this.weight = 6.0;
this.type = "Mouse";
}
public Pokemon evolve() {
return new SuperMouse();
}
8
9
10
11
public Pokemon regress() {
return null;
}
12
13
14
15
public boolean equals(Object o) {
if (! (o instanceof Mouse))
return false;
Mouse m = (Mouse) o;
return (m.size == this.size && m.weight == this.weight
&& m.type.equals(this.type));
}
16
17
18
19
20
21
22
23
24
}
25
class SuperMouse extends Mouse {
public SuperMouse() {
this.size = 0.8;
this.weight = 30.0;
this.type = "SuperMouse";
}
26
27
28
29
30
31
public Pokemon evolve() {
return this;
}
32
33
34
35
public Pokemon regress() {
this.size -= 0.4;
this.weight -= 24.0;
this.type = "Mouse";
return this;
}
36
37
38
39
40
41
42
}
Téléchargement