java program mat ion

Upload: olsen-thasur

Post on 07-Apr-2018

230 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/6/2019 Java Program Mat Ion

    1/107

    Programmation en Java

    Alexandre Mesle

    15 juillet 2009

  • 8/6/2019 Java Program Mat Ion

    2/107

    Table des matieres

    1 Notes de cours 41.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    1.1.1 Hello World ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.1.2 Formats de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    1.1.3 Machine virtuelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.1.4 Linkage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    1.2 Le Java procedural . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.2.1 Structure dune classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.2.2 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.2.3 Entrees-sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.2.4 Sous-programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.2.5 Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.2.6 Instructions de controle de flux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.2.7 Exemple recapitulatif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    1.3 Objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.3.1 Creation dun type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.3.2 Les methodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.3.3 Linstanciation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.3.4 Les packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.3.5 Le mot-cle this . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    1.4 Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.4.1 Declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.4.2 Instanciation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.4.3 Acces aux elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.4.4 Longueur dun tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.4.5 Tableaux a plusieurs dimensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    1.5 Encapsulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.5.1 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.5.2 Visibilite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    1.5.3 Constructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.5.4 Accesseurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201.5.5 Surcharge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

    1.6 Heritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231.6.1 Heritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231.6.2 Polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241.6.3 Redefinition de methodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241.6.4 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241.6.5 Classes Abstraites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

    1.7 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271.7.1 Rattraper une exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271.7.2 Methodes levant des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281.7.3 Propagation dune exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281.7.4 Definir une exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

    1

  • 8/6/2019 Java Program Mat Ion

    3/107

    1.7.5 Lever une exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291.7.6 Rattraper plusieurs exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291.7.7 Finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291.7.8 RuntimeException . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

    1.8 Interfaces graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311.8.1 Fenetres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311.8.2 Un premier objet graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321.8.3 Ecouteurs devenements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321.8.4 Premier exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321.8.5 Classes anonymes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331.8.6 Gestionnaires de mise en forme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341.8.7 Un exemple complet : Calcul dun carre . . . . . . . . . . . . . . . . . . . . . . . . 35

    1.9 Collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371.9.1 Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371.9.2 Types parametres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371.9.3 Collections standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    1.10 Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401.10.1 Le principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401.10.2 Synchronisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401.10.3 Mise en Attente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    2 Exercices 442.1 Le Java procedural . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

    2.1.1 Initiation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442.1.2 Arithmetique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442.1.3 Pour le sport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

    2.2 Objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462.2.1 Creation dune classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462.2.2 Methodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

    2.3 Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472.3.1 Prise en main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472.3.2 Tris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

    2.4 Encapsulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482.4.1 Prise en main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482.4.2 Implementation dune Pile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

    2.5 Heritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542.5.1 Heritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542.5.2 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542.5.3 Classes abstraites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    2.6 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552.7 Interfaces graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

    2.7.1 Prise en main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562.7.2 Maintenant debrouillez-vous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

    2.8 Collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572.8.1 Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572.8.2 Types parametrees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572.8.3 Collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

    2.9 Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582.9.1 Prise en main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582.9.2 Synchronisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582.9.3 Debrouillez-vous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

    2

  • 8/6/2019 Java Program Mat Ion

    4/107

    3 Corriges 593.1 Java Procedural . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

    3.1.1 Initiation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593.1.2 Arithmetique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593.1.3 Pour le sport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    3.2 Objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623.2.1 Creation dune classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623.2.2 Methodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

    3.3 Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643.3.1 Prise en main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643.3.2 Tris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

    3.4 Encapsulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.4.1 Prise en main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.4.2 Implementation dune pile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

    3.5 Heritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753.5.1 Heritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

    3.5.2 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793.5.3 Classes abstraites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

    3.6 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 903.7 Interfaces graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

    3.7.1 Ecouteurs devenement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933.7.2 Gestionnaires de mise en forme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

    3.8 Collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 953.8.1 Deux ob jets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 953.8.2 Package Pile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 963.8.3 Parcours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

    3.9 Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1003.9.1 Prise en main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

    3.9.2 Synchronisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1003.9.3 Mise en attente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

    3

  • 8/6/2019 Java Program Mat Ion

    5/107

    Chapitre 1

    Notes de cours

    1.1 Introduction

    1.1.1 Hello World !

    Copiez le code ci-dessous dans un fichier que vous enregistrerez sous le nom HelloWorld.java.

    p u bl i c c l a s s Hello Wo rld{

    p u bl i c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    S y st e m . o ut . p r i n t l n ( H e l l o W or ld ) ;}

    }

    Ensuite, executez la commande

    javac HelloWorld.java

    Lexecution de cette commande doit normalement faire un apparatre un fichier HelloWorld.class.Saisissez ensuite la commande :

    java HelloWorld

    Theoriquement, ce programme devrait afficher

    Hello World

    1.1.2 Formats de fichiers

    Les programmes java contiennent ce que lon appelle des classes. Pour le moment nous ne mettrons

    quune seule classe par fichier et nous donnerons au fichier le meme nom que la classe quil contient. Lesfichiers sources portent lextension .java tandis que les programmes compiles portent lextension .class.Le compilateur que nous avons invoque en ligne de commande avec linstruction javac, a genere le fichier.class correspondant au fichier source passe en argument.

    1.1.3 Machine virtuelle

    Le fichier .class nest pas un executable, il contient ce que lon appelle du pseudo-code. Le pseudo-code nest pas executable directement sur la plate-forme (systele dexploitation) pour laquelle il a etecompile, il est necessaire de passer par un logiciel appele une machine virtuelle. La machine virtuellelit le pseudo-code et linteprete (i.e. lexecute). Le grand avantage de Java est que le pseudo code nedepend pas de la plate-forme mais de la machine virtuelle. Un programme compile peut etre execute parnimporte quel OS, la seule necessite est de posseder une machine virtuelle Java (JVM) adaptee a cette

    plateforme.

    4

  • 8/6/2019 Java Program Mat Ion

    6/107

    1.1.4 Linkage

    En java, le linkage se fait a lexecution, cela signifie que si vous modifiez un fichier, vous aurez une seuleclasse a recompiler, et vous pourrez immediatement executer votre application.

    5

  • 8/6/2019 Java Program Mat Ion

    7/107

    1.2 Le Java procedural

    Ce cours vous introduit au Java dans sa dimension procedurale. Le but de ce cours est de vous familiariseravec les instructions de base avant daborder les concepts de la programmation objet.

    1.2.1 Structure dune classe

    Pour le moment, nous appellerons classe un programme Java. Une classe se presente de la sorte :

    c l a s s NomClasse{

    /C l as s c o n te n t s

    /}

    Vous remarquez que de facon analogue au C, une classe est un bloc delimite par des accolades et que

    les commentaires decrivent de la meme facon. On ecrit les noms des classes en concatenant les motscomposant ce nom et en faisant commencer chacun deux par une majuscule. Noubliez pas de ne mettrequune seule classe par fichier et de donner au fichier le meme nom que celui de cette classe.

    1.2.2 Variables

    Nous disposons en Java des memes types quen C. Tous les types mis a votre disposition par Java sontappele types primitifs.

    Bo oleens

    Lun deux nous servira toutefois a ecrire des choses que lon redige habituellement de facon crade en C :boolean. Une variable de type boolean peut prendre une des deux valeurs true et false, et seulement

    une de ces deux valeurs. On declare et utilise les variables exactement de la meme facon quen C.

    Chanes de caracteres

    Il existe un type chane de caracteres en C. Nous lexaminerons plus details ulterieurement. Les deuxchoses a savoir est que le type chane de caracteres est String, et que loperateur de concatenation est +.

    final

    Les variables dont la declaration de type est precedee du mot-cle final sont non-modifiables. Une foisquune valeur leur a ete affecte, il nest plus possible de les modifier. On sen sert pour representer desconstantes. Les regles typographiqus sont les memes : toutes les lettres en majuscules et les mots separespar des . Par exemple,

    f i n al i nt TAILLE = 10 0;

    Declare une constante TAILLE de type int initialisee a 100.

    1.2.3 Entrees-sorties

    La saisie de variables est un calvaire inutile en Java, nous nous en passerons pour le moment. Pour afficherun message, quel que soit son type, on utilise le sous-programme System.out.print. Par exemple,

    System . out . pri nt ( Hel lo World\n ) ;

    Le sous-programme System.out.println ajoute automatiquement un retour a la ligne apres laffichage.On aurait donc pu ecrire :

    System . out . pri nt ln ( Hel lo World ) ;

    6

  • 8/6/2019 Java Program Mat Ion

    8/107

    Il est aussi possible dintercaler valeurs de variables et chanes de caracteres constantes, on separe lesarguments par des +. Par exemple,

    S ys te m . o ut . p r i n t l n ( La v a l e u r d e a e s t + a +

    et c e l l e de b e st + b ) ;

    1.2.4 Sous-programmes

    On definit en Java des sous-programmes de la meme facon quen C, attention toutefois, les sous-programmesque nous definirons dans ce cours seront declares avec le mot-cle static. Par exemple, si je veux faire unsous-programme qui retourne le successeur de la valeur passee en argument cela donne

    c l a s s T e s t J a v a P r o c e d u r a l{

    s t a ti c i nt suc c ( in t i ){

    return i + 1 ;}

    /A u t re s s o usprogrammes

    /}

    Si vous oubliez le mot cle static, le compilateur vous enverra des insultes. Nous verrons plus tard ce quesignifie ce mot et dans quels cas il est possible de sen passer. Attention : Tous les types primitifs en Javase passent en parametre par valeur, et cette fois-ci je ne vous mens pas !

    1.2.5 MainLorsque vous invoquez la machine virtuelle, elle part a la recherche dun sous-programme particulierappele main. Il est imperatif quil soit defini comme suit :

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    /i n s t r u c t i o n s

    /}

    La signification du mot-cle public vous sera expliquee ulterieurement. La seule chose dont il faut prendrenote est que vous ne devez pas loubliez, sinon la machine virtuelle vous enverra des insultes !

    1.2.6 Instructions de controle de flux

    En Java, les instructions if, switch, for, while et do ... while se comportent de la meme facon quenC. Donc, pas dexplications complementaires...

    1.2.7 Exemple recapitulatif

    Nous avons maintenant tout ce quil faut pour ecrire un petit programme :

    p u bl i c c l a s s Exemple{

    /R et ou rn e l e n ombr e b e l e v e a l a p u i ss a n ce n .

    /

    s t a ti c i nt p u i s s a n c e ( i n t b , i n t n ){

    7

  • 8/6/2019 Java Program Mat Ion

    9/107

    i n t r e s = 1 ;f o r ( i n t i = 1 ; i

  • 8/6/2019 Java Program Mat Ion

    10/107

    1.3 Objets

    Dans un langage de programmation, un type est Un ensemble de valeurs

    Des operations sur ces valeursEn plus des types primitifs, il est possible en Java de creer ses propres types. On appelle type construitun type non primitif, cest-a-dire compose de types primitifs. Certains types construits sont fournis dansles bibliotheques du langage. Si ceux-la ne vosu satisfont pas, vous avez la possibilite de creer vos proprestypes.

    1.3.1 Creation dun type

    Nous souhaitons creer un type Point dans R2. Chaque variable de ce type aura deux attributs, uneabscisse et une ordonnee. Le type point se compose donc a partir de deux types flottants. Un typeconstruit sappelle une classe. On le definit comme suit :

    p ub li c c l a s s Point

    {f l o a t a b s c i s s e ;f l o a t ordonne e ;

    }

    Les deux attributs dun objet de type Point sappelle aussi des champs. Une fois definie cette classe, letype Point est une type comme les autres, il devient donc possible decrire

    Po in t p , q ;

    Cette instruction declare deux variables p et q de type Point, ces variables sappellent des objets. Chacunde ces ob jets a deux attributs auxquels on accede avec la notation pointee. Par exemple, labscisse dupoint p est p.abscisse et son ordonnee est p.ordonnee. Le fonctionnement est, pour le moment, le memeque pour les structures en C.

    1.3.2 Les methodes

    Non contents davoir defini ainsi un ensemble de valeurs, nous souhaiterions definir un ensembe doperationssur ces valeurs. Nous allons pour ce faire nous servir de metho des. Une methode est un sous-programmepropre a chaque objet. Cest-a-dire dont le contexte dexecution est delimite par un objet. Par exemple,

    p ub li c c l a s s Point{

    f l o a t a b s c i s s e ;f l o a t ordonne e ;

    void p r e s e n t e T o i ( )

    {S ys te m . o u t . p r i n t l n ( J e s u i s un p o i n t , mes c o o r d o n n e e s s o n t (

    + a b s c i s s e + , + o rd on ne e + ) ) ;}

    }

    La methode presenteToi sinvoque a partir dun objet de type Point. La syntaxe est p.presenteToi()ou p est de type Point. p est alors le contexte de lexecution de presenteToi et les champs auquelaccedera cette methode seront ceux de lobjet p. Si par exemple, on ecrit q.presenteToi(), cest q quiservira de contexte a lexecution de presenteToi. Lorsque lon redige une methode, lobjet servant decontexte a lexecution de la methode est appele lobjet courant.

    9

  • 8/6/2019 Java Program Mat Ion

    11/107

    1.3.3 Linstanciation

    Essayons maintenant, impatients et nerveux, de verifier ce que donnerait lexecution de

    p ub li c c l a s s Point{

    f l o a t a b s c i s s e ;f l o a t ordonne e ;

    void p r e s e n t e T o i ( ){

    S ys te m . o u t . p r i n t l n ( J e s u i s un p o i n t , mes c o o r d o n n e e s s o n t ( + a b s c i s s e + , + o rd on ne e + ) ) ;

    }

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    P o i n t p ;p . a b s c i s s e = 1 ;p . o r do n ne e = 2 ;p . p r e s e n t e T o i ( ) ;

    }}

    Pas de chance, ce programme ne compile pas. Et davantage pointilleux que le C, le compilateur de Javasarrete au moindre petit souci... Le message derreur a la compilation est le suivant :

    Point.java:15: variable p might not have been initialized

    p.abscisse = 1;

    ^

    1 error

    Que peut bien signifier ce charabia ? Cela signifie que le compilateur a de tres serieuses raisons de penserque p contient pas dobjet. En Java, toutes les variables de type construit sont des pointeurs. Et les poin-teurs non initialises (avec malloc en C) sont des pointeurs ayant la valeur null. Pour faire une allocationdynamique en Java, on utilise linstruction new. On fait alors ce que lon appelle une instanciation. Lasyntaxe est donnee dans lexemple suivant :

    p = new P o in t ( ) ;

    Cette instruction cree un objet de type Point et place son adresse dans p. Ainsi p nest pas un objet,mais juste un pointeur vers un objet de type Point qui a ete cree par le new. Et a partir de ce moment-la,il devient possible dacceder aux champs de p. new fonctionne donc de facon similaire a malloc et leprogramme suivant est valide :

    p u bl i c c l a s s P o i n t{

    f l o a t a b s c i s s e ;f l o a t o rdo nnee ;

    void p r e s e n t e T o i ( ){

    S ys te m . o u t . p r i n t l n ( J e s u i s un p o i nt , m es c o o r d on n e e s s o n t ( + a b s c i s s e + , + o rd on ne e + ) ) ;

    }

    p u bl i c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    P oi n t p ;p = new P o i nt ( ) ;p . a b s c i s s e = 1 ;p . o r do n ne e = 2 ;p . p r e s e n t e T o i ( ) ;

    }}

    10

  • 8/6/2019 Java Program Mat Ion

    12/107

    Vous remarquez quil ny a pas de fonction de destruction (free() en C). Un programme appele GarbageCollector (ramasse-miette en francais) est execute dans la machine virtuelle et se charge deliminer lesob jets non references.

    1.3.4 Les packages

    Bon nombre de classes sont predefinies en Java, elles sont reparties dans des packages, pour utilisez uneclasse se trouvant dans un package, on limporte au debut du fichier source. Pour importer un package,on utilise linstruction import.

    1.3.5 Le mot-cle this

    Dans toute methode, vous disposez dune reference vers lobjets servant de contexte a lexecution de lamethode, cette reference sappelle this.

    11

  • 8/6/2019 Java Program Mat Ion

    13/107

    1.4 Tableaux

    1.4.1 Declaration

    Un tableau en Java est un objet. Il est necessaire de le creer par allocation dynamique avec un new enprecisant ses dimensions. On note

    T [ ]

    le type tableau delements de type T. La taille du tableau nest precisee qua linstanciation. On declareun tableau t delements de type T de la facon suivante :

    T [ ] t ;

    Par exemple, si lon souhaite creer un tableau i delements de type int, on utilise linstruction :

    in t [ ] i ;

    1.4.2 InstanciationComme un tableau est un objet, il est necessaire dinstancier pendant lexecution. On instancie un tableauavec linstruction

    new T[ t a i l l e ]

    Par exemple, si lon souhaite declarer et allouer dynamiquement un tableau de 100 entiers, en utilise

    in t [ ] i = new int [ 1 0 0 ] ;

    1.4.3 Acces aux elements

    On accede aux elements dun tableau avec la notation a crochets, par exemple,

    in t [ ] t = new int [ 1 0 0 ] ;f o r ( i n t i = 0 ; i < 1 00 ; i ++)

    {t [ i ] = 1 0 0 ( i + 1 ) ;Sytem . out . pr i n t l n ( t [ i ] ) ;

    }

    On remarque que la variable i est declaree a linterieur de la boucle for, cette facon de declarer lesvariables est tres utile en Java. Dans lexemple,

    p ub li c c l a s s ExempleTableau{

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s )

    {f i n al i nt T = 2 0 ;i n t [ ] t = new int [T ] ;f or ( in t i = 0 ; i < T ; i ++)

    t [ i ] = i ;f or ( in t i = 0 ; i < T ; i ++)

    System . out . p r i n t l n ( t [ i ] ) ;}

    }

    Une tableau est alloue dynamiquement et ses dimensions sont de taille fixee a la compilation.

    12

  • 8/6/2019 Java Program Mat Ion

    14/107

    1.4.4 Longueur dun tableau

    Pour connatre la taille dun tableau on utilise lattribut length. Par exemple,

    in t [ ] t = new int [T ] ;f o r ( in t i = 0 ; i < t . l e n g t h ; i ++)

    t [ i ] = i ;f o r ( in t i = 0 ; i < t . l e n g t h ; i ++)

    System . out . pr i n t l n ( t [ i ] ) ;

    1.4.5 Tableaux a plusieurs dimensions

    On cree un tableau a plusieurs dimensions (3 par exemple) en juxtaposant plusieurs crochets. Par exemple,

    in t [ ] [ ] [ ] t = new int [ 2 ] [ 2 ] [ 2 ] ;f o r ( i n t i = 0 ; i < 2 ; i ++)f o r ( i n t j = 0 ; i < 2 ; j ++)

    f o r ( i n t k = 0 ; i < 2 ; k++)T=t [ i ] [ j ] [ k ] = 100 i + 1 0 i + k ;Sytem . out . pr i n t l n ( t [ i ] [ j ] [ k ] ) ;

    }

    On encore,

    p ub li c c l a s s ExempleCubique{

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    f i n al i nt T = 3 ;i n t [ ] [ ] [ ] u = new int [T] [T ] [T ] ;f or ( i n t i = 0 ; i < T ; i ++)

    f or ( i nt j = 0 ; j < T ; j ++)f or ( i nt k = 0 ; k < T ; k++)

    {u [ i ] [ j ] [ k ] = 100 i + 1 0 j + k ;System . out . pr in t ln ( u [ i ] [ j ] [ k ] ) ;

    }

    }}

    13

  • 8/6/2019 Java Program Mat Ion

    15/107

    1.5 Encapsulation

    1.5.1 Exemple

    Implementons une file de nombre entiers. Nous avons un exemple dans le fichier suivant :

    p ub li c c l a s s F i l e P u b l i c{

    /E l em e nt s d e l a f i l e/

    i n t [ ] e n t i e r s ;

    / /

    /

    I n d i ce de l a t e t e de f i l e e t du p re mi er e mp la ce men t l i b r eda ns l e t a b l e a u ./

    i n t f i r s t , f i r s t F r e e ;

    / /

    /I n i t i a l i s e l e s a t t r i b u t s de l a f i l e .

    /

    public void i n i t ( in t t a i l l e ){e n t i e r s = new int [ t a i l l e ] ;f i r s t = f i r s t F r e e = 0 ;

    }

    / /

    /D ec al e i d une p o s i t i on v e rs l a d r o i t e dans l e t a bl e au ,r e v i e nt au d eb ut s i i d eb or de .

    /

    p u bl i c i n t i n c r e m e n t e I n d i c e ( i nt i ){

    i++;i f ( i == e n t i e r s . l e n g t h )

    i = 0 ;return i ;

    }

    / /

    /R et ou rn e v r a i s i e t s eu le me nt s i l a f i l e

    e s t p l e i n e ./

    14

  • 8/6/2019 Java Program Mat Ion

    16/107

    public boolean e s t P l e i n ( ){

    return f i r s t == i n c r e m e n t e I n d i c e ( f i r s t F r e e ) ;}

    / /

    /R et ou rn e v r a i s i e t s eu le me nt s i l a f i l e e s t v i de .

    /

    public boolean e s t V i d e ( ){

    return f i r s t == f i r s t F r e e ;

    }

    / /

    /A j o ut e l e l e m en t n d an s l a f i l e .

    /

    public void e n f i l e ( i nt n ){

    i f ( ! e s t P l e i n ( ) ){

    e n t i e r s [ f i r s t F r e e ] = n ;f i r s t F r e e = i n c re m e nt e I n di c e ( f i r s t F r e e ) ;}

    }

    / /

    /S up pr im e l a t e t e d e f i l e ./

    public void d e f i l e ( ){

    i f ( ! e s t V i d e ( ) )f i r s t = inc rem ent eIn dic e ( f i r s t ) ;

    }

    / /

    /R et ou rn e l a t e t e d e f i l e ./

    p u bl i c i n t premier (){

    i f ( ! e s tV i de ( ) )

    15

  • 8/6/2019 Java Program Mat Ion

    17/107

    return en t ie rs [ f i r s t ] ;return 0 ;

    }}

    Un exemple typique dutilisation de cette file est donne ci-dessous :

    p ub li c c l a s s T e s t F i l e P u b l i c{

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    F i l eP u b li c f = new F i l e P u b l i c ( ) ;f . i n i t ( 2 0 ) ;f or ( in t i = 0 ; i < 3 0 ; i +=2)

    {f . e n f i l e ( i ) ;f . e n f i l e ( i + 1 ) ;

    System . out . pr in tl n ( f . premier ( ) ) ;f . d e f i l e ( ) ;

    }while ( ! f . e s t V i d e ( ) )

    {System . out . pr in tl n ( f . premier ( ) ) ;f . d e f i l e ( ) ;

    }}

    }

    Si vous travaillez en equipe, et que vous etes lauteur dune classe FilePublic, vous naimeriez pas quevos collegues programmeurs sen servent nimporte comment ! Vous naimeriez pas par exemple quils

    manipulent le tableau entiers ou lattribut first sans passer par les methodes, par exemple :

    F i l eP u b li c f = new F i l e P u b l i c ( ) ;f . i n i t ( 2 0 ) ;f . e n t i e r s [ 4 ] = 3 ;f . f i r s t += 5 ;/ . . . a rr e to n s l a l e s h or r eu rs . . . /

    Il serait appreciable que nous puissions interdire de telles instructions. Cest-a-dire forcer lutilisateur dela classe a passer par les methodes pour manier la file.

    1.5.2 Visibilite

    La visibilite dun identificateur (attribut, methode ou classe) est lensemble des endroits dans le code ouil est possible de lutiliser. Si un identificateur et precede du mot cle public, cela signifie quil est visiblepartout. Si un identificateur et precede du mot cle private, cela signifie quil nest visible qua linterieurde la classe. Seule linstance a qui cet identificateur appartient pourra lutiliser. Par exemple :

    p ub li c c l a s s F i l e P r i v a t e{

    p r iv a te i n t [ ] e n t i e r s ;p r iv a te i n t f i r s t , f i r s t F r e e ;

    public void i n i t ( in t t a i l l e ){

    e n t i e r s = new int [ t a i l l e ] ;

    f i r s t = f i r s t F r e e = 0 ;}

    16

  • 8/6/2019 Java Program Mat Ion

    18/107

    p r iv a te i n t i n c r e m e n t e I n d i c e ( i n t i ){

    i++;i f ( i == e n t i e r s . l e n g t h )

    i = 0 ;return i ;

    }

    public boolean e s t P l e i n ( ){

    return f i r s t == f i r s t F r e e + 1 ;}

    public boolean e s t V i d e ( ){

    return f i r s t == i n c r e m e n t e I n d i c e ( f i r s t F r e e ) ;}

    public void e n f i l e ( i nt n ){

    i f ( ! e s t P l e i n ( ) ){

    e n t i e r s [ f i r s t F r e e ] = n ;f i r s t F r e e = i n c re m e nt e I n di c e ( f i r s t F r e e ) ;

    }}

    public void d e f i l e ( ){i f ( ! e s t V i d e ( ) )

    f i r s t = inc rem ent eIn dic e ( f i r s t ) ;}

    p u bl i c i n t premier (){

    i f ( ! e s tV i de ( ) )return en t ie rs [ f i r s t ] ;

    return 0 ;}

    }

    On teste cette classe de la meme facon :

    p ub li c c l a s s T e s t F i l e P r i v a t e{

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    F i l eP r i va t e f = new F i l e P r i v a t e ( ) ;f . i n i t ( 2 0 ) ;f or ( in t i = 0 ; i < 3 0 ; i +=2)

    {f . e n f i l e ( i ) ;f . e n f i l e ( i + 1 ) ;

    System . out . pr in tl n ( f . premier ( ) ) ;f . d e f i l e ( ) ;

    17

  • 8/6/2019 Java Program Mat Ion

    19/107

    }while ( ! f . e s t V i d e ( ) )

    {System . out . pr in tl n ( f . premier ( ) ) ;f . d e f i l e ( ) ;

    }}

    }

    Sil vous vient lidee saugrenue dexecuter les instructions :

    F i l eP r i va t e f = new F i l e P r i v a t e ( ) ;f . i n i t ( 2 0 ) ;f . e n t i e r s [ 4 ] = 3 ;f . f i r s t += 5 ;/ . . . a rr e to n s l a l e s h or r eu rs . . . /

    vous ne passerez pas la compilation. Comme les champs entiers et first sont private, il est impossiblede les utiliser avec la notation pointee. Cela signifie quils ne sont accessibles que depuis linstance dela classe FilePrivate qui sert de contexte a leur execution. De cette facon vous etes certain que votreclasse fonctionnera correctement. En declarant des champs prives, vous avez cache les divers detailsde limplementation, cela sappelle lencapsulation. Celle-ci a pour but de faciliter le travail de toutprogrammeur qui utilisera cette classe en masquant la complexite de votre code. Les informations acommuniquer a lutilisateur de la classe sont la liste des methodes publiques. A savoir

    p ub li c c l a s s F i l e P r i v a t e{

    public void i n i t ( in t t a i l l e ) { / . . . /}public boolean e s t P l e i n ( ){ / . . . /}public boolean e s t V i d e ( ){ / . . . /}

    public void e n f i l e ( i nt n ){ / . . . /}public void d e f i l e (){ / . . . /}p u bl i c i n t premier (){ / . . . /}

    }

    On remarque non seulement quil plus aise de comprendre comment utiliser la file en regardant cesquelques methodes mais surtout que la facon dont a ete implemente la file est totalement masquee.

    1.5.3 Constructeur

    Supposons que notre utilisateur oublie dinvoquer la methode init(int taille), que va-t-il se passer?Votre classe va planter. Comment faire pour etre certain que toutes les variables seront initialisees ? Unconstructeur est un sous-programme appele automatiquement a la creation de tout ob jet. Il porte lememe nom que la classe et na pas de valeur de retour. De plus, il est possible de lui passer des parametresau moment de linstanciation. Remplacons init par un constructeur :

    p ub li c c l a s s F i l e C o n s t r u c t e u r{

    p r iv a te i n t [ ] e n t i e r s ;p r iv a te i n t f i r s t , f i r s t F r e e ;

    F i l e C o n s t r u c t e u r ( in t t a i l l e ){

    e n t i e r s = new int [ t a i l l e ] ;f i r s t = f i r s t F r e e = 0 ;

    }

    p r iv a te i n t i n c r e m e n t e I n d i c e ( i n t i )

    18

  • 8/6/2019 Java Program Mat Ion

    20/107

    {i++;i f ( i == e n t i e r s . l e n g t h )

    i = 0 ;return i ;

    }

    public boolean e s t P l e i n ( ){

    return f i r s t == f i r s t F r e e + 1 ;}

    public boolean e s t V i d e ( ){

    return f i r s t == i n c r e m e n t e I n d i c e ( f i r s t F r e e ) ;}

    public void e n f i l e ( i nt n ){

    i f ( ! e s t P l e i n ( ) ){

    e n t i e r s [ f i r s t F r e e ] = n ;f i r s t F r e e = i n c re m e nt e I n di c e ( f i r s t F r e e ) ;

    }}

    public void d e f i l e ( ){

    i f ( ! e s t V i d e ( ) )f i r s t = inc rem ent eIn dic e ( f i r s t ) ;}

    p u bl i c i n t premier (){

    i f ( ! e s tV i de ( ) )return en t ie rs [ f i r s t ] ;

    return 0 ;}

    }

    On peut alors lutiliser sans la methode init,

    p ub li c c l a s s T e s t F i l e C o n s t r u c t e u r{

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    F i l eC o n st r u ct e u r f = new F i l e C o n s t r u ct e u r ( 2 0 ) ;f or ( in t i = 0 ; i < 3 0 ; i +=2)

    {f . e n f i l e ( i ) ;f . e n f i l e ( i + 1 ) ;System . out . pr in tl n ( f . premier ( ) ) ;f . d e f i l e ( ) ;

    }

    while ( ! f . e s t V i d e ( ) ){

    19

  • 8/6/2019 Java Program Mat Ion

    21/107

    System . out . pr in tl n ( f . premier ( ) ) ;f . d e f i l e ( ) ;

    }}

    }

    1.5.4 Accesseurs

    Il est de bonne programmation de declarer tous les attributs en prive, et de permettre leur acces enforcant lutilisateur a passer par des methodes. Si un attribut X est prive, on cree deux methodes getXet setX permettant de manier X. Par exemple,

    p ub li c c l a s s ExempleAccesseurs{

    p r iv a te i n t foo ;

    p u bl i c i n t getFoo (){

    return foo ;}

    public void setFo o ( i nt valu e ){

    f o o = v a l ue ;}

    }

    On ainsi la possibilite de manier des attributs prives indirectement.

    1.5.5 Surcharge

    Il est possible de definir dans une meme classe plusieurs fonctions portant le meme nom. Par exemple,

    p ub li c c l a s s F i l e S u r c h a r g e{

    p r iv a te i n t [ ] e n t i e r s ;p r iv a te i n t f i r s t , f i r s t F r e e ;

    F i l e S u r c h a r g e ( in t t a i l l e ){

    e n t i e r s = new int [ t a i l l e ] ;f i r s t = f i r s t F r e e = 0 ;

    }

    F i l e S u r c h a r g e ( F i l e S u r c h a r g e o t h e r ){

    t h i s ( o t h e r . e n t i e r s . l e n g t h ) ;f or ( i n t i = 0 ; i < o t h e r . e n t i e r s . l e n g t h ; i ++)

    e n t i e r s [ i ] = o t h e r . e n t i e r s [ i ] ;f i r s t = ot he r . f i r s t ;f i r s t F r e e = o t he r . f i r s t F r e e ;

    }

    p r iv a te i n t i n c r e m e n t e I n d i c e ( i n t i ){

    i++;

    20

  • 8/6/2019 Java Program Mat Ion

    22/107

    i f ( i == e n t i e r s . l e n g t h )i = 0 ;

    return i ;}

    public boolean e s t P l e i n ( ){

    return f i r s t == f i r s t F r e e + 1 ;}

    public boolean e s t V i d e ( ){

    return f i r s t == i n c r e m e n t e I n d i c e ( f i r s t F r e e ) ;}

    public void e n f i l e ( i nt n )

    {i f ( ! e s t P l e i n ( ) )

    {e n t i e r s [ f i r s t F r e e ] = n ;f i r s t F r e e = i n c re m e nt e I n di c e ( f i r s t F r e e ) ;

    }}

    public void d e f i l e ( ){

    i f ( ! e s t V i d e ( ) )f i r s t = inc rem ent eIn dic e ( f i r s t ) ;

    }

    p u bl i c i n t premier (){

    i f ( ! e s tV i de ( ) )return en t ie rs [ f i r s t ] ;

    return 0 ;}

    }

    On remarque quil y a deux constructeurs. Lun prend la taille du tableau en parametre et lautre estun constructeur de copie. Selon le type de parametre passe au moment de linstanciation, le constructeurcorrespondant est execute. Dans lexemple ci-dessous, on cree une file g en applicant le constructeur de

    copie a la file f.p ub li c c l a s s T e s t F i l e S u r c h a r g e{

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    F i l eS u r ch a r ge f = new F i l e S u r c h ar g e ( 2 0 ) ;f or ( in t i = 0 ; i < 3 0 ; i +=2)

    {f . e n f i l e ( i ) ;f . e n f i l e ( i + 1 ) ;System . out . pr in tl n ( f . premier ( ) ) ;f . d e f i l e ( ) ;

    }F i l eS u r ch a r ge g = new F i l e S u r c h a r g e ( f ) ;

    21

  • 8/6/2019 Java Program Mat Ion

    23/107

    while ( ! f . e s t V i d e ( ) ){

    System . out . pr in tl n ( f . premier ( ) ) ;f . d e f i l e ( ) ;

    }while ( ! g . estVid e () )

    {System . out . pr in tl n (g . premier ( ) ) ;g . d e f i l e ( ) ;

    }}

    }

    22

  • 8/6/2019 Java Program Mat Ion

    24/107

    1.6 Heritage

    1.6.1 Heritage

    Le principe

    Quand on dispose dune classe c, on a la possibilite de lagrandir (ou de letendre) en creant une deuxiemeclasse c. On dit dans ce cas que c herite de c, ou encore que c est la classe mere et c la classe fille.Par exemple, considerons les deux classes suivantes :

    p ub li c c l a s s ClasseMere{

    p ri va te f i n a l i n t x ;

    public Classe Mere ( in t x ){

    t h i s . x = x ;

    }

    p u bl i c i n t getX ( ){

    return x ;}

    }

    p ub li c c l a s s C l a s s e F i l l e extends ClasseMere{

    p ri va te f i n a l i n t y ;

    public C l a s s e F i l l e ( i nt x , in t y )

    {super ( x ) ;t h i s . y = y ;

    }

    p u bl i c i n t getY ( ){

    return y ;}

    }

    Le mot-cle extends signifie herite de. Le mot-cle super est le constructeur de la classe mere. Tout cequi peut etre fait avec la classe mere peut aussi etre fait avec la classe fille. Notez donc que la classe fille

    est une extension de la classe mere. On peut par exemple utiliser la classe fille de la facon suivante :

    p ub li c c l a s s T e s t C l a s s e F i l l e{

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    C l a s s eF i l l e o = new C l a s s e F i l l e ( 1 , 2 ) ;S ys te m . o u t . p r i n t l n ( ( + o . g et X ( ) + , +

    o . getY () + ) ) ;}

    }

    Notes bien que comme la classe mere possede une methode getX, la classe fille la possede aussi. Et

    lattribut x de tout instance de la classe mere est aussi un attribut de toute instance de la classe fille.

    23

  • 8/6/2019 Java Program Mat Ion

    25/107

    Heritage simple Vs. heritage multiple

    En java, une classe ne peut avoir quune seule classe mere. Dans dautres langages (comme le C++) celaest permis, mais pour des raisons de fiabilite, Java linterdit.

    Object

    En java, toutes les classes heritent implicitement dune classe Object.

    1.6.2 Polymorphisme

    Considerons lexemple suivant :

    p ub li c c l a s s T e s t C l a s s e F i l l e P o l y m o r p h i s m e{

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    C l as s eM e re o = new C l a s s e F i l l e ( 1 , 2 ) ;S ys te m . o u t . p r i n t l n ( ( + o . g et X ( ) + , +( ( C l a s s e F i l l e ) o ) . g et Y ( ) + ) ) ;

    }}

    On remarque dune part que o reference un ob jet de la classe fille de son type. Cela sappelle le polymor-phisme. Dautre part, si lon souhaite effectuer des operations specifiques aux objets de la classe fille, ilest necessaire deffectuer un cast.

    1.6.3 Redefinition de methodes

    La methode toString() appartient initialement a la classe Object. Elle est donc heritee par toutes les

    classes. Vous avez la possibilite de la redefinir, cest a dire de remplacer la methode par defaut par unemethode davantage adaptee a la classe en question.

    1.6.4 Interfaces

    Une interface est un ensemble de constantes et de methodes vides. Il est impossible dinstancier uneinterface. Il est necessaire que la classe qui herite de linterface (mot-cle implements) definisse les methodesquelle contient. En voici un exemple dutilisation :

    i n t e r f a c e P r e s e n t a b l e{

    public void p r e s e n t e T o i ( ) ;}

    p ub li c c l a s s E x e m p l e I n t e r f a c e implements P r e s e n t a b l e{

    p u bl i c i n t x , y ;

    public void p r e s e n t e T o i ( ){

    S ys te m . o u t . p r i n t l n ( J e s u i s un E x e m p le I n t e r f ac e , x = + x + e t y = + y + . ) ;

    }

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    E x e mp l e I nt e r fa c e t = new E x e m p l e I n t e r f a ce ( ) ;

    24

  • 8/6/2019 Java Program Mat Ion

    26/107

    t . x = 1 ;t . y = 2 ;P r es e nt a b l e j = t ;j . p r e s e n t e T o i ( ) ;

    }}

    Vous remarquez que la methode PresenteToi est implementee dans la classe fille (sinon ca ne compileraitpas). Comme t est aussi de type Presentable (en vertu du polymorphisme), il est possible de le placerdans j. Comme tout objet Presentable possede une methode PresenteToi, on peut invoquer cettemethode depuis j.

    1.6.5 Classes Abstraites

    Nous voulons representer des sommes dans des devises differentes et implementer automatiquement lesconversions. Nous allons creer une classe devise qui contiendra lattribut somme et nous utiliseronslheritage pour implementer les specificites des diverses devises (Euros, Dollars, Livres, ...).

    p u bl i c a b s t ra c t c l a s s D e v i s e{

    private double somme = 0;

    public abstract double g e t C o u r s ( ) ;

    public void setSomme( Devi se d){

    t h i s .somme = d.sommed . getCours () / t h i s . g et C o u r s ( ) ;}

    public void setSomme( double somme){

    t h i s .somme = somme;}

    public S t r i ng t o S t r i n g ( ){

    return somme = + somme + ;}

    }

    La classe devise contient une methode setSomme qui est surchargee et qui peut prendre en parametre soitune somme exprimee dans la bonne unite, soit une autre devise.

    p ub li c c l a s s Euros extends D e v i s e{

    public E u ro s ( D e v i s e d ){

    setSomme( d ) ;}

    public Euros( double somme){

    setSomme(somme);}

    public double getCours (){

    25

  • 8/6/2019 Java Program Mat Ion

    27/107

    return 1 . 4 6 2 5 ;}

    public S t r i ng t o S t r i n g ( ){

    return super . t o S t r i n g ( ) + E ur os ;}

    }

    On remarque quil est impossible dimplementer getCours() car le cours varie selon la devise. La classeEuros herite de la classe Devise et implemente getCours(). La classe Dollars fonctionne de faconsimilaire :

    p ub li c c l a s s D o l l a r s extends D e v i s e{

    public D o l l a r s ( D e v i se d ){

    setSomme( d ) ;}

    public D o l l a r s ( double somme){

    setSomme(somme);}

    public double getCours (){

    return 1 . ;}

    public S t r i ng t o S t r i n g ( ){

    return super . t o S t r i n g ( ) + D o l l a r s ;}

    }

    Ces classes permettent de prendre en charge automatiquement les conversions entre devises :

    p ub li c c l a s s T e s t D e v i s e s{

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    D o ll a r s d = new D o l l a r s ( 1 2 ) ;

    System . out . pr in tl n (d ) ;E ur os e = new E u ro s ( d ) ;System . out . pri nt ln ( e );L iv re s l = new L i v r e s ( e ) ;System . out . pri nt ln ( l ) ;

    }}

    26

  • 8/6/2019 Java Program Mat Ion

    28/107

    1.7 Exceptions

    Le mecanisme des exceptions en Java (et dans dautres langages objets) permet de gerer de facon eleganteles erreurs pouvant survenir a lexecution. Elles presentent trois avantages :

    Obliger les programmeurs a gerer les erreurs. Separer le code de traitement des erreurs du reste du code. Rattraper les erreurs en cours dexecution.

    1.7.1 Rattraper une exception

    Lorsquune sequence dinstructions est susceptible doccasionner une erreur, on la place dans un bloc try.Comme ci-dessous :

    tr y{

    /b l o c d i n s t r u c t i o n s

    /}

    On place juste apres ce bloc un bloc catch qui permet de traiter lerreur :

    tr y{

    /b l o c d i n s t r u c t i o n s

    /}catch ( n o m Er re ur e ){

    / T r a it e m en t d e l e r r e u r /

    }

    Une exception est une erreur pouvant etre rattrapee en cours dexecution. Cela signifie que siune erreur survient, une exception est levee, le code du try est interrompu et le code contenu dans lecatch est execute. Par exemple,

    tr y{

    i nt i = 0 ;while ( true ){

    t [ i ++]++;}

    }catch ( ArrayIndexOutOfBoundException e ){

    S ys te m . o u t . p r i n t l n ( An e x c e p t i o n h a s b e en r a i s e d . ) ;}

    Dans le code precedent lindice i est incremente jusqua ce que cet indice depasse la taille du tableau.Dans ce cas lexception ArrayIndexOutOfBoundException est levee et le code correspondant a cetteexception dans le catch est execute.

    27

  • 8/6/2019 Java Program Mat Ion

    29/107

    1.7.2 Methodes levant des exceptions

    Si vous redigez une methode susceptible de lever une exception, vous devez le declarer en ajoutant a sonentete lexpression throws . Par exemple,

    public void bourreTableau () throw ArrayIndexOutOfBoundException{

    i nt i = 0 ;while ( true ){

    t [ i ++]++;}

    }

    Vous remarquez quil ny a pas de try ... catch. Cela signifie que lerreur doit etre rattrapee dans lesous-programme appelant. Par exemple,

    tr y

    {b o u r r e T ab l e a u ( ) ;

    }catch ( ArrayIndexOutOfBoundException e ){

    System . out . pri nt ln ( I l f a l l a i t s y att end re . . . ) ;}

    Bref, lorsquune instruction est susceptible de lever une exception, vous devez soit la rattraper tout desuite, soit indiquer dans lentete du sous-programme quune exception peut se propager et quelle doitdonc etre traitee dans le sous-programme appelant.

    1.7.3 Propagation dune exception

    Par traiter une exception, on entend soit la rattraper tout de suite, soit la propager. Par propager,on entend laisser le sous-programme appelant la traiter. Il est possible lorsque lon invoque un sous-programme levant une exception, de la propager. Par exemple,

    public void a p p e l l e B o u r r e T a b l e a u ( ) throws ArrayIndexOutOfBoundException{

    b o u r r e T ab l e a u ( ) ;}

    On observe que appelleBourreTableau se contente de transmettre lexception au sous-programme appe-lant. Ce mode de fonctionnement fait quune exception non rattrapee va se propager dans la pile dappelsde sous-programmes jusqua ce quelle soit rattrapee. Et si elle nest jamais rattrapee, cest la JVM, qui

    va le faire.

    1.7.4 Definir une exception

    Une exception est tout simplement une classe heritant de la classe Exception.

    c l a s s MonException extends E x c e p t i o n{

    public MonException ( ){

    S ys te m . o u t . p r i n t l n ( E x c e p t i o n m on Ex ce p ti o n h a s b e en r a i s e d . . . ) ;}

    public S t r i ng t o S t r i n g ( ){

    28

  • 8/6/2019 Java Program Mat Ion

    30/107

    return You t r i e d t o d o an i l l e g a l a s s i g ne m e n t ! ;}

    }

    1.7.5 Lever une exception

    On leve une exception en utilisant la syntaxe throw new (). Linstancia-tion de lexception se fait donc en meme temps que sa levee. Par exemple,

    tr y{

    /. . . . . ./throw new MonException () ;/

    . . . . . ./

    }catch ( MonException e ){

    System . out . pr in tl n (e );}

    1.7.6 Rattraper plusieurs exceptions

    Il se peut quune meme instruction (ou suite dinstruction) soit susceptible de lever des exceptionsdifferentes, vous pouvez dans ce cas placer plusieurs catch a la suite du meme try.

    tr y{

    b o u r r e T ab l e a u ( ) ;}catch ( ArrayIndexOutOfBoundException e ){

    System . out . pri nt ln ( I l f a l l a i t s y att end re . . . ) ;}catch ( E x c ep t i o n e ){

    System . out . pr in tl n (e );}

    Notez bien que comme toute exception herite de Exception, le deuxieme catch sera execute quelle quesoit lexception levee (sauf si bien entendu le premier catch est execute).

    1.7.7 Finally

    Il est quelquefois necessaire quune section de code sexecute quoi quil advienne (pour par exemple fermerun fichier). On place dans ce cas une section finally.

    tr y{

    /. . . . . . ;/

    }

    29

  • 8/6/2019 Java Program Mat Ion

    31/107

    catch ( / . . . /){

    /. . . . ./

    }f i n a l l y{

    /. . . . ./

    }

    Par exemple,

    c l a s s MonException extends E x c e p t i o n{

    public S t r i ng t o S t r i n g ( ){

    return F a l l a i t p a s i n v o q u e r c e t t e m et ho de . . . ;}

    }

    p ub li c c l a s s F i n a l l y{

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    F i n al ly f = new F i n a l l y ( ) ;tr y

    {tr y

    {throw new MonException () ;

    }catch ( MonException e )

    {throw new MonException () ;

    }f i n a l l y

    {S ys te m . o u t . p r i n t l n ( Tu t a f f i c h e r a s q u o i qu i l a d v i en n e ! ) ;

    }

    }catch ( E x c ep t i o n e )

    {System . out . pri nt ln ( e );

    }}

    }

    1.7.8 RuntimeException

    Je vous vous ai menti au sujet de ArrayIndexOutOfBoundException, il sagit dune exception heritant deRunTimeException qui lui-meme herite de Exception. Un code Java dans lequel une RunTimeException

    nest pas traitee passera la compilation. Par contre, MonException nest pas une RunTimeException etdoit etre rattrapee !

    30

  • 8/6/2019 Java Program Mat Ion

    32/107

    1.8 Interfaces graphiques

    1.8.1 Fenetres

    La classe JFrame

    Une fenetre est un objet de type JFrame, classe a laquelle on accede avec la commande dimportationimport javax.swing.*. Nous utiliserons les methodes suivantes :

    public void setTitle(String title), pour definir le titre de la fenetre. public void setVisible(boolean b), pour afficher la fenetre. public void setSize(int width, height), pour preciser les dimensions de la fenetre. public void setDefaultCloseOperation(int operation), pour determiner le comportement de

    la fenetre lors de sa fermeture.

    Exemples

    Voici un code de creation dune fenetre vide.

    import java x . swing . ;

    p ub li c c l a s s P r e m i e r e F e n e t r e{

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    JFrame f = new JFrame ( ) ;f . s e t V i s i b l e ( true ) ;f . se tT it l e (My f i r s t window ! ) ;f . s e t S i z e ( 2 0 0 , 2 0 0 ) ;f . se tD ef au lt Cl os eO pe ra ti on (JFrame .EXIT ON CLOSE) ;

    }

    }La facon suivante nous sera utile pour gerer les evenements :

    import java x . swing . ;

    p ub li c c l a s s DeuxiemeFenetre extends JFrame{

    public DeuxiemeFenetre (){

    super ( ) ;s e t T i t l e ( My s e c o n d wi ndo w ! ) ;s e t S i z e ( 2 0 0 , 2 0 0 ) ;set Def aul tCl ose Ope rat ion (EXIT ON CLOSE) ;

    }

    public void a f f i c h e ( ){

    s e t V i s i b l e ( true ) ;}

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    D e ux i e me F en e t re f = new DeuxiemeFenetre ( ) ;f . a f f i c h e ( ) ;

    }

    }

    31

  • 8/6/2019 Java Program Mat Ion

    33/107

    1.8.2 Un premier objet graphique

    Nous allons a jouter un bouton dans notre fenetre. Les boutons sont de type JButton, le constructeur decette classe prend en parametre le libelle du bouton. Un des attributs de la classe JFrame est un objet

    contenant tous les composants graphiques de la fenetre, on accede a cet objet par la methode publicContainer getContentPane(). Tout Container possede une methode public Component add(Componentcomp) permettant dajouter nimporte quel composant graphique (par exemple un JButton...). On ajoutedonc un Bouton de la facon suivante getContentPane().add(new JButton("my First JButton")) ;.

    import java x . swing . ;import ja va . awt . ;

    p ub li c c l a s s PremiersJButtons extends JFrame{

    public PremiersJButtons (){

    super ( ) ;

    s e t T i t l e ( My t h i r d window ! ) ;s e t S i z e ( 2 0 0 , 2 0 0 ) ;set Def aul tCl ose Ope rat ion (EXIT ON CLOSE) ;getContentPane () . setLayou t (new FlowLayout () ) ;getContentPane ( ) . add(new J Bu t to n ( my F i r s t J Bu t to n ) ) ;getContentPane ( ) . add(new JButton( my Second JButton ) ) ;getContentPane ( ) . add(new JButton( my Third JButton ) ) ;s e t V i s i b l e ( true ) ;

    }

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    new P r e m i e r sJ B u t t o n s ( ) ;}}

    Linstruction getContentPane().setLayout(new FlowLayout()) ; sert a preciser de quelle facon voussouhaitez que les composants soient disposes dans la fenetre. Nous reviendrons dessus.

    1.8.3 Ecouteurs devenements

    Un ecouteur devenement est un objet associe a un composant graphique. Cet objet doit implementer lin-terface ActionListener et de ce fait contenir une methode public void actionPerformed(ActionEvente). Cette methode est appelee a chaque fois quun evenement se produit sur le composant. LobjetActionEvent contient des informations sur levenement en question.

    1.8.4 Premier exemple

    Dans ce premier exemple, nous allons definir une classe public class PremierEcouteur extends JFrameimplements ActionListener. Elle servira donc a la fois de fenetre et decouteur devenements. Lob jetde type ActionEvent passe en parametre contient une methode public Object getSource() retournantlob jet ayant declenche levenement.

    import java x . swing . ;import ja va . awt . eve nt . ;import ja va . awt . ;

    p ub li c c l a s s PremierEcouteur extends JFrame implements A c t i o n L i s t e n e r{

    JButton [ ] jButt ons ;

    32

  • 8/6/2019 Java Program Mat Ion

    34/107

    public void a c t i o n P e r f o r m e d ( A c t io n E ve n t e ){

    i n t k = 0 ;while ( j B u t t o n s [ k++] ! = e . g e t S o u r c e ( ) ) ;S ys te m . o u t . p r i n t l n ( c l i c k o n J Bu t to n + k ) ;

    }

    public PremierEcouteur (){

    super ( ) ; j B u t t o n s = new JBut ton [ 3 ] ;s e t T i t l e ( My f o u r t h wi ndo w ! ) ;s e t S i z e ( 2 0 0 , 2 0 0 ) ;set Def aul tCl ose Ope rat ion (EXIT ON CLOSE) ;getContentPane () . setLayou t (new FlowLayout () ) ;

    j B u t t o n s [ 0 ] = new J Bu t to n ( my F i r s t J B ut t on ) ;j B u t t o n s [ 1 ] = new JButton( my Second JButton ) ;j B u t t o n s [ 2 ] = new JButton( my Third JButton ) ;f or ( in t i = 0 ; i < 3 ; i ++)

    {getContentPan e () . add ( jBu tto ns [ i ] ) ;jBut tons [ i ] . addAc tio nLi ste ner ( t h i s ) ;

    }s e t V i s i b l e ( true ) ;

    }

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s )

    { new P r e m i e rE c o u t eu r ( ) ;}

    }

    1.8.5 Classes anonymes

    Les classes anonymes sont des classes que lon peut creer a la volee, cest-a-dire au moment de leur ins-tanciation.. On sen sert generalement pour implementer une interface, en loccurrence ActionListener.Voici une autre implementation faisant intervenir des classes anonymes.

    import java x . swing . ;import ja va . awt . eve nt . ;

    import ja va . awt . ;

    p ub li c c l a s s EcouteurAnonyme extends JFrame{

    public EcouteurAnonyme(){

    super ( ) ;J Bu t to n [ ] j B u t t o n s = new JButt on [ 3 ] ;s e t T i t l e ( My f o u r t h wi ndo w ! ) ;s e t S i z e ( 2 0 0 , 2 0 0 ) ;set Def aul tCl ose Ope rat ion (EXIT ON CLOSE) ;getContentPane () . setLayou t (new FlowLayout () ) ;

    j B u t t o n s [ 0 ] = new J Bu t to n ( my F i r s t J B ut t on ) ;j B u t t o n s [ 1 ] = new JButton( my Second JButton ) ;

    33

  • 8/6/2019 Java Program Mat Ion

    35/107

    j B u t t o n s [ 2 ] = new JButton( my Third JButton ) ;f or ( in t i = 0 ; i < 3 ; i ++)

    getContentPa ne () . add ( jBu tto ns [ i ] ) ;jBut tons [ 0 ] . add Act ionL ist ener (new A c t i o n L i s t e n e r ( )

    {public void a c t i o n P e r f o r m e d ( A c t i on E v en t e ){

    S ys te m . o u t . p r i n t l n ( c l i c k o n F i r s t J Bu t to n ) ;}

    }) ;

    jBut tons [ 1 ] . add Act ionL ist ener (new A c t i o n L i s t e n e r ( ){

    public void a c t i o n P e r f o r m e d ( A c t i on E v en t e ){

    S ys te m . o u t . p r i n t l n ( c l i c k o n S e co n d J Bu t to n ) ;

    }}) ;

    jBut tons [ 2 ] . add Act ionL ist ener (new A c t i o n L i s t e n e r ( ){

    public void a c t i o n P e r f o r m e d ( A c t i on E v en t e ){

    S ys te m . o u t . p r i n t l n ( c l i c k o n T h ir d J Bu t to n ) ;}

    }) ;

    s e t V i s i b l e ( true ) ;}

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    new EcouteurAnonyme ( ) ;}

    }

    1.8.6 Gestionnaires de mise en forme

    Un gestionnaire de mise en forme (Layout manager) est un objet permettant de disposer les composantset les conteneurs dans la fenetre. Nous avons utilise un gestionnaire de type FlowLayout, qui dispose lescomposants les uns a cote des autres (ou au dessus des autres si ce nest pas possible) dans leur ordredajout. Le gestionnaire GridLayout represente le conteneur comme une grille

    import java x . swing . ;import ja va . awt . eve nt . ;import ja va . awt . ;

    p ub li c c l a s s TestGridLayout extends JFrame implements A c t i o n L i s t e n e r{

    JButton [ ] jButt ons ;

    public void a c t i o n P e r f o r m e d ( A c t io n E ve n t e )

    { i n t k = 0 ;

    34

  • 8/6/2019 Java Program Mat Ion

    36/107

    while ( j B u t t o n s [ k++] ! = e . g e t S o u r c e ( ) ) ;S ys te m . o u t . p r i n t l n ( c l i c k o n J Bu t to n + k ) ;

    }

    public TestGridLayout (){

    super ( ) ; j B u t t o n s = new JBut ton [ 4 ] ;se t Ti t le (One More Window ! ) ;s e t S i z e ( 2 0 0 , 2 0 0 ) ;set Def aul tCl ose Ope rat ion (EXIT ON CLOSE) ;getContentPane () . setLayou t (new G ri d L ay o ut ( 2 , 2 ) ) ;j B u t t o n s [ 0 ] = new J Bu t to n ( my F i r s t J B ut t on ) ;j B u t t o n s [ 1 ] = new JButton( my Second JButton ) ;j B u t t o n s [ 2 ] = new JButton( my Third JButton ) ;j B u t t o n s [ 3 ] = new JButton( my Fourth JButton ) ;

    f or ( in t i = 0 ; i < 4 ; i ++){

    getContentPan e () . add ( jBu tto ns [ i ] ) ;jBut tons [ i ] . addAc tio nLi ste ner ( t h i s ) ;

    }s e t V i s i b l e ( true ) ;

    }

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    new TestGridLayout ();}

    }

    1.8.7 Un exemple complet : Calcul dun carre

    import java x . swing . ;import ja va . awt . eve nt . ;import ja va . awt . ;

    p ub li c c l a s s Carre extends JFrame implements K e y L i s t e n e r{

    J T e x t F i e l d o p e r a n d T e x t F i e l d ;J L ab el r e s u l t T e x t F i e l d ;

    public void keyPres sed (KeyEvent e ){}

    public void keyRele ased (KeyEvent e ){

    tr y{i n t k = I n t e g e r . p a r s e I n t ( o p e r a n d T e x t F i e l d . g e t T e xt ( ) ) ;k = k ;r e s u l t T e x t F i e l d . s e t T e x t ( I n t e g e r . t o S t r i n g ( k ) ) ;}catch ( E x c e p t i o n e x )

    {i f( r e s u l t T e x t F i e l d != null )

    35

  • 8/6/2019 Java Program Mat Ion

    37/107

    r e s u l t T e x t F i e l d . se t T e x t ( ) ;}

    }

    public void keyTyped( KeyEvent e ){}

    public Carre (){

    super ( ) ;s e t S i z e ( 2 0 0 , 2 0 0 ) ;s e t T i t l e ( S q u ar e c om pu te r ! ) ;set Def aul tCl ose Ope rat ion (EXIT ON CLOSE) ;getContentPane () . setLayou t (new G ri d L ay o ut ( 2 , 2 ) ) ;getContentPane ( ) . add(new J L a be l ( x = ) ) ;o p e r a n d T e x t F i e l d = new J T e x tF i e l d ( ) ;operandT extField . addKeyListener ( t h i s ) ;

    getContentPane () . add( operandTextF ield ) ;getContentPane ( ) . add(new J L a b e l ( x 2 = ) ) ;r e s u l t T e xt F i e l d = new J L a b e l ( ) ;g e t Co n t e nt P a ne ( ) . a dd ( r e s u l t T e x t F i e l d ) ;s e t V i s i b l e ( true ) ;

    }

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    new C a r re ( ) ;}

    }

    36

  • 8/6/2019 Java Program Mat Ion

    38/107

    1.9 Collections

    1.9.1 Packages

    Linstruction import que vous utilisez depuis le debut sert a localiser une classe parmi les packagesstandard de Java. Si par exemple vous importez import java.awt.event.*, cela signifie que vous allezutiliser les classes se trouvant dans le package qui se trouve dans le package event qui se trouve dans lepackage awt qui se trouve dans le package java (qui est la bibliotheque standard).

    Creer ses propres packages

    Il possible pour un programmeur de creer ses propres packages, deux choses sont necessaires : Utilisez la meme arborescence dans le systeme de fichier que celle des packages Ajouter au debut de chaque source sa position dans larborescence.

    Par exemple,

    package c o l l e c t i o n s ;

    p ub li c c l a s s ExemplePackage{

    p ub li c s t a t i c v oi d p r e s e n t e T o i ( ){

    S ys te m . o u t . p r i n t l n ( J e s u i s c o l l e c t i o n s . E xe mp le Pa ck ag e ) ;}

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    p r e s e n t e T o i ( ) ;}

    }

    On execute et compile ce fichier en se placant non pas dans le repertoire ou se trouve les source, maisdans le repertoire ou se trouve le package. Par consequent, lexecution en ligne de commande se fait avecjavac collections.ExemplePackage

    Utiliser ses propres packages

    Vos packages sutilisent comme les packages de la bibliotheque standard. Si le main se trouve en dehorsde votre package, la variable denvironnement CLASSPATH sera utilisee pour localiser votre package.

    Visibilite

    En labsence de mots-cles public (tout le monde), private (seulement la classe) et protected (classe +

    classes derivees), une visibilite par defaut est appliquee. Par defaut, la visibilite des elements est limiteeau package.

    1.9.2 Types parametres

    Lutilisation du type Object pour faire de la genericite en Java se paye avec des instruction de ce type

    maCol lect ion . add( new C l a s s e F i l l e ( ) ) ;C l a s s e F i l l e f = ( C l a s s e F i l l e ) m a Co l l ec t i on . g e t ( 0 ) ;

    Il est necessaire deffectuer un cast particulierement laid pour passer la compilation. On prend parconsequent le risque quune exception soit levee a lexecution sil savere que lobjet recupere nest pas detype ClassFille. Les types parametres fournissent un moyen elegant de resoudre ce probleme.

    37

  • 8/6/2019 Java Program Mat Ion

    39/107

    Java Vs C++

    Le mecanisme des classes parametrees en Java en bien plus fin que les templates utilisees en C++. Lestemplates ne sont que de vulgaires rechercher/remplacer, alors quen Java, le code compile est le meme

    que si les types ne sont pas parametres. Les types parametres de java ne sont donc quun moyen pour lecompilateur de sassurer que vous faites les choses proprement en vous obligeant a declarer les types quevous placez dans les collections.

    La syntaxe

    La syntaxe est par contre la meme quen C++ : il suffit dutiliser des chevrons pour placer le parametre.Par exemple,

    p ub li c c l a s s ExempleClasseParametree{

    T d a t a ;

    public ExempleClasseParametree (T data ){t h i s . data = data ;

    }

    public T g e t ( ){

    return data ;}

    }

    On est amene naturellement a se demander si ExempleClasseParametreeherite de ExempleClasseParametrUn exercice traite cette question.

    Contraintes sur le parametre

    Il est souvent necessaire que le type servant de parametre verifie certaines proprietes. Si vous souhaitezpar exemple que lobjet herite de Comparable, vous avez la possibilite de poser cette contrainte avec leparametre . La definition ci-avant est incomplete, le soin vous est laisse de lacompleter...

    1.9.3 Collections standard

    La distribution officielle de Java est fournie avec plusieurs milliers de classes. Les Collections sont desstructures de donnees permettant doptimiser des operations comme le tri, la recherche de plus petitelement, etc. Les collections sont donc des regroupements dobjets.

    Classification des collections

    Linterface Collection decrit ce que doit faire chaque collection. Elle plusieurs sous-interfaces, parmilesquelles on trouve :

    List conserve lordre des elements dans lordre dans lequel le programmeur souhaite quilssoient.

    Set ne tient pas compte de lordre des elements. Queue est optimise pour recuperer rapidement le plus petit element.

    Ces interfaces sont implementees dans diverses classes ou divisees avec des sous-interfaces permettentdobtenir des fonctionnalites plus precises.

    38

  • 8/6/2019 Java Program Mat Ion

    40/107

    Parcours dune collection

    Il existe, de facon analogue a que lon observe en C++, une syntaxe permettant simplement de parcourirune collection qui est :

    f o r (T x : c ){

    / . . . /}

    Dans la specification ci dessus, c est la collection, T le type (ou un sur-type) des objets de la collection etx une variable (muette) dans laquelle sera place tour a tour chaque objet de la collection. Il nest possibledutiliser cette syntaxe que si le type de c implemente Iterable.

    Details

    Parmi les classes implementant List, on trouve ArrayList, Vector et LinkedList. Lesdeux premieres sont des tableaux et la derniere une liste chanee. Linterface Set possede une sous-

    classe HashSet et une sous-interface SortedSet. Dans un SortedSet, les elements sont automa-tiquement maintenus dans lordre. Parmi les classes implementant SortedSet se trouve TreeSet(arbre binaire de recherche).

    39

  • 8/6/2019 Java Program Mat Ion

    41/107

    1.10 Threads

    1.10.1 Le principe

    Un programme peut etre decoupe en processus legers, ou threads, sexecutant chacun de leur cote. Ondefinit un thread de deux facon :

    En heritant de la classe Thread En implementant linterface Runnable

    Bien que la premiere solution soit generalement plus commode, la deuxieme est quelquefois le seul moyendeviter lheritage multiple. Nous detaillerons le premier cas, le deuxieme est decrit dans la documentation.

    La classe Thread

    La classe Thread dispose entre autres de deux methodes public void start() qui est la methode permettant de demarrer lexecution du thread. public void run() qui est la methode automatiquement invoquee par start quand le thread est

    demarre.

    Voici un exemple dutilisation :

    p ub li c c l a s s B i n a i r e A l e a t o i r e extends Thread{

    p r iv a te i n t valu e ;p r iv a te i n t n b I t e r a t i o n s ;

    public B i n a i r e A l e a t o i r e ( i nt value , in t n b I t e r a t i o n s ){

    t h i s . v a l u e = v a l u e ;t h i s . n b I t e r a t i o n s = n b I t e r a t i o n s ;

    }

    public void run (){

    f or ( in t i = 1 ; i

  • 8/6/2019 Java Program Mat Ion

    42/107

    Methodes synchronisees

    Une methode synchronisee ne peut etre executee que par un thread a la fois. On synchronise une methodeen placant le mot cle synchronized dans sa definition.

    Instructions synchronisees

    On synchronise des instructions en les placant dans un bloc synchronized(o){...}, ou o est lobjet nepouvant etre accede par deux threads simultanement.

    1.10.3 Mise en Attente

    Un thread peut decider de se mettre en attente sil a besoin pour sexecuter de donnees qui ne sont pasencore disponibles. On gere cela avec les instructions suivantes :

    public void wait() throws InterruptedException met le thread en attente. public void notify() reveille un thread en attente public void notifyAll() reveille tous les thread en attente

    On place en general ces instructions dans une section critique. Un wait() libere le verrou pour autoriserdautres threads a acceder a la ressource. Un notify() choisit un des objets places en attente sur lameme ressource, lui rend le verrou, et relance son execution. Par exemple,

    p ub li c c l a s s Counter{

    p r iv a te i n t v a l u e = 0 ;p r iv a te i n t upperBound ;p r iv a te i n t lowerBound ;

    public Counter( i nt lowerBound , in t upperBound){

    t h i s . upperBound = upperBound ;

    t h i s . lowerBound = lowerBound ;}

    public synchronized void i n c r e a s e C o u n t e r ( ) throws I n t e r r u p t e d E x c e p t i o n{

    i f ( val ue == upperBound)w a i t ( ) ;

    e l s e{

    value++;S ys te m . o u t . p r i n t l n ( + 1 = + v a l u e ) ;T hr ea d . s l e e p ( 5 0 ) ;

    i f ( valu e == lowerBound + 1)n o t i f y ( ) ;}

    }

    public synchronized void d e c r e a s e C o u n t e r ( ) throws I n t e r r u p t e d E x c e p t i o n{

    i f ( val ue == lowerBound)w a i t ( ) ;

    e l s e{

    v a l u e;System . out . pri nt ln ( 1 = + v a lu e ) ;T hr ea d . s l e e p ( 5 0 ) ;

    41

  • 8/6/2019 Java Program Mat Ion

    43/107

    i f ( value == upperBound 1 )n o t i f y ( ) ;

    }}

    p ub li c s t a t i c v oi d m ai n ( S t r i n g [ ] a r g s ){

    C ou nt er c = new Counter(1 00 , 1 0 0 ) ;Thread p = new Plus ( c ) ;Thread m = new Moins( c ) ;p . s t a r t ( ) ;m. s t a r t ( ) ;

    }}

    c l a s s Plus extends Thread

    {private Counter c ;

    P l u s ( C o un t er c ){

    t h i s . c = c ;}

    public void run (){

    while ( true )tr y

    { c . i n c r e a s e C o u n t e r ( ) ;}

    catch ( I n t e r r up t e d E xc e p t i o n e ) {}}

    }

    c l a s s Moins extends Thread{

    private Counter c ;

    M oi ns ( C o un t er c ){

    t h i s . c = c ;}

    public void run (){

    while ( true )tr y

    {c . d e c r e a s e C o u n t e r ( ) ;

    }catch ( I n t e r r up t e d E xc e p t i o n e ) {}

    }

    }

    42

  • 8/6/2019 Java Program Mat Ion

    44/107

    Ce programme affiche aleatoirement les valeurs prises par un compteur incremente et decremente alter-nativement par deux threads. Si lon tente de decrementer la valeur minimale, le thread de decrementationsendort pour laisser la main au thread dincrementation. Si le thread dincrementation est parti de lavaleur minimale, il reveille le thread de decrementation qui peut reprendre son execution. Et vice-versa.

    43

  • 8/6/2019 Java Program Mat Ion

    45/107

    Chapitre 2

    Exercices

    2.1 Le Java procedural

    2.1.1 Initiation

    Exercice 1 - Compte a rebours

    Ecrire un sous-programme prenant en parametre un nombre n et affichant les valeurs n, n 1, . . ., 1, 0.

    2.1.2 Arithmetique

    Exercice 2 - chiffres et nombres

    Rapellons que a % b est le reste de la division entiere de a par b.

    1. Ecrire la fonction static int unites(int n) retournant le chiffre des unites du nombre n.

    2. Ecrire la fonction static int dizaines(int n) retournant le chiffre des dizaines du nombre n.3. Ecrire la fonction static int extrait(int n, int p) retourant le p-eme chiffre de representation

    decimale de n en partant des unites.

    4. Ecrire la fonction static int nbChiffres(int n) retournant le nombre de chiffres que comportela representation decimale de n.

    5. Ecrire la fonction static int sommeChiffres(int n) retournant la somme des chiffres de n.

    Exercice 3 - Nombres amis

    Soient a et b deux entiers strictement positifs. a est un diviseur strict de b si a divise b et a = b. Parexemple, 3 est un diviseur strict de 6. Mais 6 nest pas un diviseur strict 6. a et b sont des nombres amissi la somme des diviseurs stricts de a est b et si la somme des diviseurs de b est a. Le plus petit couple de

    nombres amis connu est 220 et 284.

    1. Ecrire une fonction static int sommeDiviseursStricts(int n), elle doit renvoyer la somme desdiviseurs stricts de n.

    2. Ecrire une fonction static boolean sontAmis(int a, int b), elle doit renvoyer true si a et bsont amis, false sinon.

    Exercice 4 - Nombres parfaits

    Un nombre parfait est un nombre egal a la somme de ses diviseurs stricts. Par exemple, 6 a pour diviseursstricts 1, 2 et 3, comme 1 + 2 + 3 = 6, alors 6 est parfait.

    1. Est-ce que 18 est parfait ?

    2. Est-ce que 28 est parfait ?

    44

  • 8/6/2019 Java Program Mat Ion

    46/107

    3. Que dire dun nombre ami avec lui-meme ?

    4. Ecrire la fonction static boolean estParfait(int n), elle doit retourner true si n est un nombreparfait, false sinon.

    Exercice 5 - Nombres de Kaprekar

    Un nombre n est un nombre de Kaprekar en base 10, si la representation decimale de n2 peut etre separeeen une partie gauche u et une partie droite v tel que u + v = n. 452 = 2025, comme 20 + 25 = 45, 45 estaussi un nombre de Kaprekar. 48792 = 23804641, comme 238 + 04641 = 4879 (le 0 de 046641 est inutile,je lai juste place pour eviter toute confusion), alors 4879 est encore un nombre de Kaprekar.

    1. Est-ce que 9 est un nombre de Kaprekar ?

    2. Ecrire la fonction static int sommeParties(int n, int p) qui decoupe n est deux nombresdont le deuxieme comporte p chiffres, et aui retourne leur somme. Par exemple,

    sommeParties(12540, 2) = 125 + 40 = 165

    3. Ecrire la fonction static boolean estKaprekar(int n)

    2.1.3 Pour le sport

    Exercice 6 - Conversion chiffres/lettres

    Ecrire un sous-programme prenant un nombre en parametre et laffichant en toutes lettres. Rappelonsque 20 et 100 saccordent en nombre sils ne sont pas suivis dun autre nombre (ex. : quatre-vingts,quatre-vingt-un). Mille est invariable (ex. : dix-mille) mais pas million (ex. : deux millions) et milliard(ex. : deux milliards). Depuis 1990, tous les mots sont separes de traits dunion (ex. : quatre-vingt-quatre),sauf autour des mots mille, millions et milliard (ex. : deux mille deux-cent-quarante-quatre, deux millionsquatre-cent-mille-deux-cents). (source : http://www.leconjugueur.com/frlesnombres.php).

    45

  • 8/6/2019 Java Program Mat Ion

    47/107

    2.2 Objets

    2.2.1 Creation dune classe

    Exercice 1 - La classe Rationnel

    Creez une classe Rationnel contenant un numerateur et un denominateur tous deux de type entier.

    Instanciez deux rationnels a et b et initialisez-les aux valeurs respectives1

    2et

    4

    3. Affichez ensuite les

    valeurs de ces champs.

    2.2.2 Methodes

    Exercice 2 - Operations sur les Rationnels

    Ajoutez a la classe Rationnel les methodes suivantes :

    1. public String toString(), retourne une chane de caracteres contenant une representation durationnel courant sous forme de chane de caracteres.

    2. public Rationnel copy(), retourne une copie du rationnel courant.

    3. public Rationnel opposite(), retourne loppose du rationnel courant.

    4. public void reduce(), met le rationnel sous forme de fraction irreductible.

    5. public boolean isPositive(), retourne true si et seulement si le rationnel courant est stricte-ment positif.

    6. public Rationnel add(Rationnel other), retourne la somme du rationnel courant et du ration-nel other.

    7. public void addBis(Rationnel other), additionne le rationnel other au rationnel courant.

    8. public Rationnel multiply(Rationnel other), retourne le produit du rationnel courant avec lerationnel others.

    9. public Rationnel divide(Rationnel other), retourne le quotient du rationnel courant avec lerationnel others.

    10. public int compareTo(Rationnel other), retourne 0 si le rationnel courant est egal au rationnelother, 1 si le rationnel courant est inferieur a other, 1 dans le cas contraire.

    46

  • 8/6/2019 Java Program Mat Ion

    48/107

    2.3 Tableaux

    2.3.1 Prise en main

    Exercice 1 - Creation et affichage

    Creer un tableau de 20 entiers, y placer les nombre de 1 a 20, inverser lordre des elements avec unefonction (recursive si vous y arrivez).

    2.3.2 Tris

    Exercice 2 - Tris

    Creer une classe RatTab contenant un tableau de rationnels, a joutez les methodes suivantes :

    1. public void init(int taille), instancie le tableau et y place taille valeurs aleatoires importjava.math.Random ;).

    2. public String toString(), retourne une chane de caractere representant le tableau.

    3. public void triInsertion(), tri le tableau par la methode du tri par insertion.

    4. public void triBulle(), tri le tableau par la methode du tri a bulle.

    5. public void triSelection(), tri le tableau par la methode du tri par selection.

    6. public void initTab(RatTab otther), place dans le tableau une copie du tableau de other.

    7. public RatTab copie(), retourne une copie de linstance courante.

    8. public void interclasse(RatTab t1, RatTab t2), place dans le tableau linterclassement destableaux t1 et t2.

    47

  • 8/6/2019 Java Program Mat Ion

    49/107

    2.4 Encapsulation

    2.4.1 Prise en main

    Exercice 1 - Rationnels propres

    Reprennez la classe Rationnel et faites en une classe RationnelPropre. Vous encapsulerez le numerateur,le denominateur, et vous utiliserez un constructeur pour initialiser les champs prives. Vous prendrezensuite le soin de modifier les corps des methodes de sorte que la classe compile et fonctionne correctement.

    Exercice 2 - Listes chanees

    Completez le code ci-dessous :

    p ub li c c l a s s I n t L i s t{

    /Donnee s t o c k e e d an s l e m a i l l o n

    /

    p r iv a te i n t data ;

    / /

    /P oi nt e ur v e r s l e m a il l o n s u i v a n t

    /

    private I n t L i s t n ex t ;

    / /

    /C on st ru ct eu r i n i t i a l i s a n t l a donnee e t l e p o i nt e u r v e r s l e le me nt s u i v a nt .

    /

    I n t L i s t ( i n t d at a , I n t L i s t n ex t ){}

    / /

    /C on st ru ct eu r i n i t i a l i s a n t l a donnee e t m et ta nt l e s u iv a nt a n u l l .

    /

    I n t L i s t ( i n t d a t a )