INSA - 4 AE 2007 2008 Durée : 1H00 Contrôle Programmation Objet Java Correction Consignes Tous les documents sont autorisés, mais ils seront peu utiles. Indiquez vos nom et prénom sur chaque feuille. Le corrigé sera mis sur la page du cours dans la journée. Nom : Prénom : Barème Exercice Barème Note Total partiel Exercice 1 Questions rapides Exercice 2 Sémantique de Java Exercice 3 Questions avancées 5 points 10 points 5 points Note globale : / 20
Exercice 1 5 points Questions rapides Vrai / Faux Pour dissuader les réponses au hasard, des points négatifs sont mis à partir de trois réponses incorrectes (mieux vaut ne rien cocher lorsque l on ne sait pas). Vrai Faux Exemple Java signifie café Java appartient à Bill Gates Eclipse est le seul moyen de compiler du Java Compilation Si je compile une classe Bar qui utilise ma classe Foo, le compilateur a besoin du fichier Foo.java Si je compile une classe Bar qui utilise ma classe Foo, le compilateur a besoin du fichier Foo.class Si mon programme compile bien, en principe il ne provoquera pas d exception à l exécution Si mon programme compile bien, en principe il ne fera pas d erreur de segmentation (segfault, comme en C) Environnement d exécution Toute classe Java-standard (J2SE) doit contenir un main Toute classe Java-embarqué (J2ME) doit contenir un main Une classe Java-standard (J2SE) contenant un main est directement exécutable par la machine virtuelle Java une fois compilée. Une classe Java-standard (J2SE) sans main est directement exécutable par la machine virtuelle Java une fois compilée. Pour qu une classe Java-embarqué (J2ME) soit exécutable sur un mobile, il est nécessaire qu elle contienne un main. Pour qu une classe Java-embarqué (J2ME) soit exécutable sur un mobile, il est nécessaire qu elle hérite d une certaine classe.
Nom : Prénom : Précision : en Java, une classe est un type. Vrai Faux En Java, les types int et Integer existent. Le type int est un abrégé pour la classe Integer Classes et objets (1) En Java, les types String et char* sont équivalents. Les concepteurs des librairies Java aiment bien les identifiants à rallonge comme ByteArrayInputStream ou AnnotationTypeMismatchException. void est un nom de classe, synonyme de Object Classes et objets (2) L héritage (mot-clef extends) est une alternative à new pour créer de nouveaux objets à l exécution. Il existe une classe dont Integer et String sont deux sous-types. On reconnaît le constructeur d une classe à ce qu il porte le même nom que la classe. Le constructeur d une classe doit recevoir autant d arguments que la classe a d attributs. Une interface n a pas de constructeur. Il est possible de définir deux constructeurs dans la même classe. Il est possible de définir deux méthodes avec le même nom dans la même classe. Les programmeurs en langages à objet sont souvent très pointilleux sur le vocabulaire relatif à la programmation objet. Classes et objets (3) Un objet, c est essentiellement la même chose qu un struct en C dans lequel on met aussi des fonctions. this représente une classe (cocher Vrai) ou un objet (cocher Faux) Si Java permettait l héritage multiple (de plusieurs classes), on pourrait se passer des attributs. Quel que soit le problème à résoudre, une programmation à objets (POO) est toujours mieux adaptée que d autres styles de programmation.
Nom : Prénom : Exercice 2 10 points Sémantique de Java Le programme constitué des deux classes ci-dessous compile correctement. Précision : l exception SecurityException est connue du compilateur par défaut, et n a pas besoin d être signalée à chaque méthode avec un throws Répondez aux questions de la page ci-contre. L objectif est de vérifier que vous maîtrisez la sémantique de Java, c est-à-dire la manière précise dont un programme se déroule. Soyez très rigoureux, prenez votre temps! (Vous pouvez librement griffonner le programme) class Class A { static int alpha = 0 ; public int beta ; Class A ( ) { beta = alpha ; void foo ( ) { alpha++ ; System. out. p r i n t l n ( Alpha= + alpha + ; Beta= + beta ) ; void moo ( ) { throw new SecurityException ( ) ; void zoo ( ) { try { this. foo ( ) ; this. moo ( ) ; this. foo ( ) ; catch ( Exception E) { System. out. p r i n t l n ( GLOP! ) ; class Class B extends Class A { Class B ( ) { super ( ) ; void moo ( ) { try { i f ( this. beta >= 2) super. moo ( ) ; catch ( Exception E) { System. out. p r i n t l n ( ATARI! ) ; public static void main ( S t r i n g [ ] args ) { Class B b1 = new Class B ( ) ; b1. zoo ( ) ; Class B b2 = new Class B ( ) ; b2. zoo ( ) ;
Qu affiche le programme si je lance java Class B? Alpha=1 ;Beta=0 Alpha=2 ;Beta=0 Alpha=3 ;Beta=2 ATARI! Alpha=4 ;Beta=2 Qu affiche le programme si, après la première exécution, je lance une deuxième fois java Class B? La même chose Expliquez en quelques mots ce qui se passe si, dans la méthode zoo(), je remplace this.moo() par seulement moo(). Ça ne change rien. Expliquez en quelques mots ce qui se passe si, dans la méthode zoo(), je remplace catch (Exception E) par catch (SecurityException E). Ça ne change rien non plus.
Exercice 3 5 points Questions avancées 1 Expliquez pourquoi, à l inverse du compilateur C, une compilation Java ne se termine pas par l édition de liens (effectuée d habitude par le linker). Le compilateur ne produit pas un exécutable mais compile chaque classe indépendamment et produit un fichier.class La liaison se fait à l exécution (et peut provoquer la fameuse exception, Class Not Found). 2 Pour afficher un message, on utilise System.out.println (). System est une classe. Précisez la nature de out et de println (soyez bien précis). out : un attribut statique de la classe System (un objet statique) println : une méthode 3 Vous rejoignez la société Galère spécialisée dans les systèmes embarqués. Le jour de votre arrivée, vous êtes convoqués par votre chef de projet, qui vous dit bonjour, vous offre un café et vous tient le discours suivant : Je sais que vous connaissez bien Java, ce qui n est pas mon cas. L un de nos produits phare est un logiciel de pilotage de robot industriel, nommé Pilot. Ce logiciel est embarqué sur un C167 (dans le robot) ; il est codé en C et en assembleur. Pendant que Pilot pilote le robot, un technicien peut relier son ordinateur PC portable au robot par liaison USB afin d obtenir des informations en direct. Il utilise pour cela un autre de nos logiciels, BayWatch, installé sur son PC portable. Techniquement, Pilot scrute périodiquement le port USB pour savoir si un ordinateur est connecté. Lorsque BayWatch est lancé, un protocole de communication permet aux deux logiciels d échanger des données et de les afficher sur le PC portable. Pour l instant BayWatch est programmé en C, mais nous souhaitons moderniser l interface graphique et accélérer le processus de développement. Nous pensons lancer une version 2 de BayWatch codée en Java. Je me suis renseigné et il existe une machine virtuelle Java pour C167. Voyez-vous autre chose que nous devrions vérifier avant de lancer le projet? C est votre premier jour, trouvez une réponse intelligente. D une part, il n y a pas besoin de JVM pour C167 puisque le code Java ne tourne que sur l ordinateur portable. D autre part, il suffit de vérifier qu il existe bien une classe Java permettant d accéder au port USB (ce qui semble assez probable).