É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 }