Initiation à la programmation en Java

Embed Size (px)

Citation preview

__________________Les fondements du langage Java_______________Cours dinitiation la programmation en JavaRM di Scala : rvision du 05 Septembre 2004392 pagesLes fondements du langage Java - ( rv. 05.09.2004) page2Remerciements :(pour les corrections d'erreurs)A [email protected], internaute averti sur la syntaxe de base C++ commune Java et C#.A mon pouse Dominique pour son soutien et sa patience qui me permettent de consacrer denombreuses heures la construction du package et des cours inclus et surtout comme la seulepersonne en dehors de moi qui a eu la constance de relire entirement toutes les pages del'ouvrage, alors que l'informatique n'est pas sa tasse de th.Remerciements : (diffusion de la connaissance)- A l'universit de Tours qui supporte et donne accs la partie Internet du packagepdagogique partir de sa rubrique "cours en ligne", partir duquel ce document a tlabor.- Au club des dveloppeurs francophones qui hberge un site miroir du prcdent et quirecommande le package pdagogique sesvisiteurs dbutants.Cette dition a t corrige duran tles 2 moislt 2004, elle a t optimise en nombre de pages papierimprimables.Les fondements du langage Java - ( rv. 05.09.2004) page3SOMMAIRETypes, oprateurs, instructionsIntroduction...P.5Les types primitifs...P.6Les oprateurs.....P.11Les instructions..P.26Les conditions....P.29Les itrations..P.38Instructions de rupture de squence..P.43Classes avec mthodes static..P.49Structures de donnes de baseClasse String...P.68Tableaux, matrices...P.75Tableaux dynamiques, listes ....P.81Flux et fichiers...P.85Java et la Programmation ObjetLes classes....P.95Les objets......P.107Les membres de classe...P.118Les interfaces....P.133Les Awt et les vnements + exemples......P.138Les Swing et l'architecture MVC + exemples .... P.190Les Applets Java.. P.231Redessiner composants et Applets....P.248Les fondements du langage Java - ( rv. 05.09.2004) page4Les classes internes.... P.256Les exceptions. .... .. P.271Le multi-threading.... P.292EXERCICESExercices algorithmiques noncs P.303Exercices algorithmiquessolutions .P.325Les chanes avec Java.... P.340Trier des tableauxen Java... P.347Rechercher dans un tableau... P.352Liste et pile Lifo... P.360Fichiers texte.. P.375Thread pour baignoire et robinet......P.380Annexe .......P.387Bibliographie ...P.392Les fondements du langage Java - ( rv. 05.09.2004) page5Introduction aux bases de Java 2Apparu fin 1995 dbut 1996 et dvelopp par Sun Microsystems Java s'est trs rapidementtaill une place importante en particulier dans le domaine de l'internet et des applicationsclient-serveur.Destin au dpart la programmation de centraux tlphoniques sous l'appellation delangage "oak", la socit Sun a eu l'ide de le recentrer sur les applications de l'internet et desrseaux. C'est un langage en volution permanente Java 2 est la version stabilise de javafonde sur la version initiale 1.2.2 du JDK (Java Development Kit de Sun :http://java.sun.com)Les objectifs de java sont d'tre multi-plateformes et d'assurer la scurit aussi bienpendant le dveloppement que pendant l'utilisation d'un programme java. Il est en passe dedtrner le langage C++ dont il hrite partiellement la syntaxe mais non ses dfauts. CommeC++ et Delphi, java est algorithmique et orient objet ce titre il peut effectuer comme sescompagnons, toutes les tches d'un tel langage (bureautiques, graphiques, multimdias, basesde donnes, environnement de dveloppement, etc...). Son point fort qui le dmarque desautres est sa portabilit due (en thorie) ses bibliothques de classes indpendantes de laplate-forme, ce qui est le point essentiel de la programmation sur internet ou plusieursmachines dissemblables sont interconnectes.La ralisation multi-plateformes dpend en fait du systme d'exploitation et de sa capacit possder des outils de compilation et d'interprtation de la machine virtuelle Java.Actuellement ceci est totalement ralis d'une manire correcte sur les plates-formesWindows et Solaris, un peu moins bien sur les autres semble-t-il.Notre document se posant en manuel d'initiation nous ne comparerons pas C++ et java afinde voir les points forts de java, sachons que dans java ont t limins tous les lments quipermettaient dans C++ d'engendrer des erreurs dans le code (pointeurs, allocation-dsallocation, hritage multiple,...). Ce qui met java devant C++ au rang de la maintenance etde la scurit.En Java l'on dveloppe deux genres de programmes :- Les applications qui sont des logiciels classiques s'excutant directement sur uneplate-forme spcifique soit travers une machine virtuelle java soit directement encode excutable par le systme d'exploitation. (code natif).- les applets qui sont des programmes java insrs dans un document HTMLs'excutant travers la machine virtuelle java du navigateur lisant le documentHTML.Les fondements du langage Java - ( rv. 05.09.2004) page6Les types primitifsJava 21 - Les types lmentaires et le transtypageTout n'est pas objet dans Java, par souci de simplicit et d'efficacit, Java est un langagefortement typ. Comme en Delphi, en Java vous devez dclarer un objet ou une variable avecson type avant de l'utiliser. Java dispose de mme de types prdfinis ou types lmentairesou primitifs.Les types servent dterminer la nature du contenu d'une variable, du rsultat d'uneopration, d'un retour de rsultat de fonction.Tableau synthtique des types lmentaires de Javatypelmentaireintervalle de variation nombre de bitsboolean false , true 1 bitbyte [-128,+127 ] 8 bitschar caractres unicode (valeurs de 0 65536) 16 bitsdouble Virgule flottante double prcision ~5.10 30864 bitsfloat Virgule flottante simple prcision ~9.10 1832 bitsint entier sign : [-231, +231 - 1] 32 bitslong entier sign long : [-263, +263- 1] 64 bitsshort entier sign court : [-215,+215 -1] 16 bitsSignalons qu'en java toute variable qui sert de conteneur une valeur d'un type lmentaireprcis doit pralablement avoir t dclare sous ce type.Les fondements du langage Java - ( rv. 05.09.2004) page7Il est possible d'indiquer au compilateur le type d'une valeur numrique en utilisant unsuffixe :- l ou L pour dsigner un entier du type long- f ou F pour dsigner un rel du type float- d ou D pour dsigner un rel du type double.Exemples :45l ou 45L reprsente la valeur 45 en entier sign sur 64 bits.45f ou 45F reprsente la valeur 45 en virgule flottante simple prcision sur 32bits.45d ou 45D reprsente la valeur 45 en virgule flottante double prcision sur64 bits.5.27e-2f ou 5.27e-2F reprsente la valeur 0.0527 en virgule flottante simpleprcision sur 32 bits.Transtypage : oprateur ( )Les conversions de type en Java sont identiques pour les types numriques aux conversionsutilises dans un langage fortement typ comme Delphi par exemple (pas de conversionimplicite). Si vous voulez malgr tout, convertir une valeur immdiate ou une valeurcontenue dans une variable il faut explicitement transtyper cette valeur l'aide de l'oprateurde transtypage not: ( ).- int x ;x = (int) y ; signifie que vous demander de transtyper la valeur contenue dans lavariable y en un entier sign 32 bits avant de la mettre dans la variable x.- Tous les types lmentaires peuvent tre transtyps l'exception du type boolean quine peut pas tre converti en un autre type (diffrence avec le C).- Les conversions peuvent tre restrictives quant au rsultat; par exemple letranstypage du rel 5.27e-2 en entier ( x = (int)5.27e-2) mettra l'entier zro dans x.2 - Variables, valeurs, constantesLes fondements du langage Java - ( rv. 05.09.2004) page8Identificateurs de variablesDclarations et affectation de variablesLes constantes en JavaBase de reprsentation des entiersComme en Delphi, une variable Java peut contenir soit une valeur d'un type lmentaire, soitune rfrence un objet. Les variables jouent le mme rle que dans les langages deprogrammation classiques impratifs, leur visibilit est tudie ailleurs.Les identificateurs de variables en Java se dcrivent comme ceux de tous les langages deprogrammation :Identificateur Java :Attention Java est sensible la casse et fait donc une diffrence entre majuscules etminuscules, c'est dire que la variable BonJour n'est pas la mme que la variable bonjourou encore la variable Bonjour. En plus des lettres, les caractres suivants sont autoriss pourconstruire un identificateur Java : "$" , "_" , "" et les lettres accentues.Exemples de dclaration de variables :int Bonjour ; int Enumration_fin$;float Valeur ;char UnCar ;boolean Test ;etc ...Exemples d'affectation de valeurs ces variables :Affectation Dclaration avec initialisationBonjour = 2587 ;Valeur = -123.5687UnCar = 'K' ;int Bonjour = 2587 ;float Valeur = -123.5687char UnCar = 'K' ;Les fondements du langage Java - ( rv. 05.09.2004) page9Test = false ; boolean Test = false ;Exemple avec transtypage :int Valeur ;char car = '8' ;Valeur = (int)car - (int)'0';fonctionnement de l'exemple :Lorsque la variable car est l'un des caractres '0', '1', ... ,'9', la variable Valeur est gale lavaleur numrique associe (il s'agit d'une conversion car = '0' ---> Valeur = 0, car = '1' --->Valeur = 1, ... , car = '9' ---> Valeur = 9).Les constantes en Java ressemblent celles du pascalCe sont des variables dont le contenu ne peut pas tre modifi, elles sont prcdes du motclef final :final int x=10 ; x est dclare comme constante entire initialise 10.x = 32 ; base = 10 dcimal.- prfixe 0 ----> base = 8 octal- prfixe 0x ----> base = 16 hexadcimal3 - Priorit d'oprateursLes 39 oprateurs de Java sont dtaills par famille, plus loin . Ils sont utiliss comme danstous les langages impratifs pour manipuler, sparer, comparer ou stocker des valeurs. Lesoprateurs ont soit un seul oprande, soit deux oprandes, il n'existe en Java qu'un seuloprateur trois oprandes (comme en C) l'oprateur conditionnel " ? : ".Les fondements du langage Java - ( rv. 05.09.2004) page10Dans le tableau ci-dessous les oprateurs de Java sont classs par ordre de priorit croissante(0 est le plus haut niveau, 14 le plus bas niveau). Ceci sert lorsqu'une expression contientplusieurs oprateurs, indiquer l'ordre dans lequel s'effectueront les oprations.- Par exemple sur les entiers l'expression 2+3*4 vaut 14 car l'oprateur * est plusprioritaire que l'oprateur +, donc l'oprateur * est effectu en premier.- Lorsqu'une expression contient des oprateurs de mme priorit alors Java effectueles valuations de gauche droite. Par exemple l'expression 12/3*2 vaut 8 car Javaeffectue le parenthsage automatique de gauche droite ((12/3)*2).priorit oprateurs0 ( ) [ ] .1 ! ~ ++ --2 * / %3 + -4 > >>>5 < >=6 = = !=7 &8 ^9 |10 &&11 ||12 ? :13 = *= /= %= += -= ^= &= = >>>= |=Les fondements du langage Java - ( rv. 05.09.2004) page11Les oprateursJava 2Oprateurs arithmtiquesOprateurs de comparaisonOprateurs boolensOprateurs bit level1 - Oprateurs arithmtiquesoprateurs travaillant avec des oprandes valeur immdiate ou variableOprateur priorit action exemples+ 1 signe positif +a; +(a-b); +7 (unaire)- 1 signe ngatif -a; -(a-b); -7 (unaire)* 2 multiplication 5*4; 12.7*(-8.31); 5*2.6/ 2 division 5 / 2; 5.0 / 2; 5.0 / 2.0% 2 reste 5 % 2; 5.0 %2; 5.0 % 2.0+ 3 addition a+b; -8.53 + 10; 2+3- 3 soustraction a-b; -8.53 - 10; 2-3Ces oprateurs sont binaires ( deux oprandes) excepts les oprateurs de signe positif oungatif. Ils travaillent tous avec des oprandes de types entiers ou rels. Le rsultat del'opration est converti automatiquement en valeur du type des oprandes.L'oprateur " %" de reste n'est intressant que pour des calculs sur les entiers longs, courts,signs ou non signs : il renvoie le reste de la division euclidienne de 2 entiers.Les fondements du langage Java - ( rv. 05.09.2004) page12Exemples d'utilisation de l'oprateur de division selon les types des oprandes et dursultat :programme Java rsultat obtenu commentaireint x = 5 , y ; x = 5 , y =??? dclarationfloat a , b = 5 ; b = 5 , a =??? dclarationy = x / 2 ; y = 2 // type intint x et int 2rsultat : inty = b / 2 ; erreur de conversionconversion automatiqueimpossible (float b --> int y)y = b / 2.0 ; erreur de conversionconversion automatiqueimpossible (float b --> int y)a = b / 2 ; a = 2.5 // type floatfloat b et int 2rsultat : floata = x / 2 ; a = 2.0 // type floatint x et int 2rsultat : intconversion automatiqueint 2 --> float 2.0a = x / 2f ; a = 2.5 // type floatint x et float 2frsultat : floatPour l'instruction prcdente " y = b / 2 " engendrant une erreur de conversion voici deuxcorrections possibles utilisant le transtypage :y = (int)b / 2 ; // b est converti en int avant la division qui s'effectue sur deux int.y = (int)(b / 2) ; // c'est le rsultat de la division qui est converti en int.oprateurs travaillant avec une unique variable comme oprandeOprateur priorit action exemples++ 1post ou pr incrmentation :incrmente de 1 son oprande numrique : short, int,long, char, float, double.++a; a++;(unaire)-- 1post ou pr dcrmentation :dcrmente de 1 son oprande numrique : short, int,long, char, float, double.--a; a--;(unaire)L'objectif de ces oprateurs ++ et --, est l'optimisation de la vitesse d'excution du bytecodeLes fondements du langage Java - ( rv. 05.09.2004) page13dans la machine virtuelle Java.post-incrmentation : k++la valeur de k est d'abord utilise telle quelle dans l'instruction, puis elle est augmente de un la fin. Etudiez bien les exemples ci-aprs ,ils vont vous permettre de bien comprendre lefonctionnement de cet oprateur.Nous avons mis ct de l'instruction Java les rsultats des contenus des variables aprsexcution de l'instruction de dclaration et de la post incrmentation.Exemple 1 :int k = 5 , n ;n = k++ ;n = 5 k = 6Exemple 2 :int k = 5 , n ;n = k++ - k ;n = -1 k = 6Dans l'instruction k++ - k nous avons le calcul suivant : la valeur de k (k=5) est utilisecomme premier oprande de la soustraction, puis elle est incrmente (k=6), la nouvellevaleur de k est maintenant utilise comme second oprande de la soustraction ce qui revient calculer n = 5-6 et donne n = -1 et k = 6.Exemple 3 :int k = 5 , n ;n = k - k++ ;n = 0 k = 6Dans l'instruction k - k++ nous avons le calcul suivant : la valeur de k (k=5) est utilisecomme premier oprande de la soustraction, le second oprande de la soustraction est k++c'est la valeur actuelle de k qui est utilise (k=5) avant incrmentation de k, ce qui revient calculer n = 5-5 et donne n = 0 et k = 6.Exemple 4 : Utilisation de l'oprateur de post-incrmentation en combinaison avec un autreoprateur unaire.int nbr1, z , t , u , v ;nbr1 = 10 ;v = nbr1++v = 10 nbr1 = 11nbr1 = 10 ;z = ~ nbr1 ;z = -11 nbr1 = 10nbr1 = 10 ;t = ~ nbr1 ++ ;t = -11 nbr1 = 11nbr1 = 10 ;u = ~ (nbr1 ++) ;u = -11 nbr1 = 11La notation " (~ nbr1) ++ " est refuse par Java.remarquons que les expressions "~nbr1 ++ " et "~ (nbr1 ++)" produisent les mmesLes fondements du langage Java - ( rv. 05.09.2004) page14effets, ce qui est logique puisque lorsque deux oprateurs (ici ~ et ++ )ont la mme priorit,l'valuation a lieu de gauche droite.pr-incrmentation : ++kla valeur de k est d'abord augmente de un ensuite utilise dans l'instruction.Exemple1 :int k = 5 , n ;n = ++k ; n = 6 k = 6Exemple 2 :int k = 5 , n ;n = ++k - k ;n = 0 k = 6Dans l'instruction ++k - k nous avons le calcul suivant : le premier oprande de lasoustraction tant ++k c'est donc la valeur incrmente de k (k=6) qui est utilise, cette mmevaleur sert de second oprande la soustraction ce qui revient calculer n = 6-6 et donne n =0 et k = 6.Exemple 3 :int k = 5 , n ;n = k - ++k ;n = -1 k = 6Dans l'instruction k - ++k nous avons le calcul suivant : le premier oprande de lasoustraction est k (k=5), le second oprande de la soustraction est ++k, k est immdiatementincrment (k=6) et c'est sa nouvelle valeur incrmente qui est utilise, ce qui revient calculer n = 5-6 et donne n = -1 et k = 6.post-dcrmentation : k--la valeur de k est d'abord utilise telle quelle dans l'instruction, puis elle est diminue de un la fin.Exemple1 :int k = 5 , n ;n = k-- ; n = 5 k = 4pr-dcrmentation : --kla valeur de k est d'abord diminue puis utilise dans l'instruction.Les fondements du langage Java - ( rv. 05.09.2004) page15Exemple1 :int k = 5 , n ;n = --k ; n = 4 k = 4Reprenez avec l'oprateur - - des exemples semblables ceux fournis pour l'oprateur ++afin d'tudier le fonctionnement de cet oprateur (tudiez (- -k - k) et (k - - -k)).2 - Oprateurs de comparaisonCes oprateurs employs dans une expression renvoient un rsultat de type boolen (false outrue). Nous en donnons la liste sans autre commentaire car ils sont strictement identiques tous les oprateurs classiques de comparaison de n'importe quel langage algorithmique (C,pascal, etc...). Ce sont des oprateurs deux oprandes.Oprateur priorit action exemples< 5 strictement infrieur 5 < 2 ; x+1 < 3 ; y-2 < x*4 3 ; etc...>= 5 suprieur ou gal 5 >= 2 ; etc...= = 6 gal 5 = = 2 ; x+1 = = 3 ; etc...!= 6 diffrent 5 != 2 ; x+1 != 3 ; etc...3 - Oprateurs boolensCe sont les oprateurs classiques de l'algbre de boole { { V, F }, ! , & , | } o { V, F }reprsente l'ensemble {Vrai , Faux}.Les connecteurs logiques ont pour syntaxe en Java : ! , & , | , ^ :& : { V, F } x { V, F } { V, F } (oprateur binaire qui se lit " et ")| : { V, F } x { V, F } { V, F } (oprateur binaire qui se lit " ou ")! : { V, F } { V, F } (oprateur unaire qui se lit " non ")^ : { V, F } x { V, F } { V, F } (oprateur binaire qui se lit " ou exclusif ")Les fondements du langage Java - ( rv. 05.09.2004) page16Table de vrit des oprateurs ( p et q tant des expressions boolennes)p q ! p p ^ q p & q p | qV V F F V VV F F V F VF V V V F VF F V F F FRemarque :p e { V, F } , q e { V, F } , p &q est toujours valu en entier ( p et q sont toujoursvalus).p e { V, F } , q e { V, F } , p |q est toujours valu en entier ( p et q sont toujoursvalus).Java dispose de 2 clones des oprateurs binaires &et | . Ce sont les oprateurs &&et ||qui se diffrentient de leurs originaux &et | par leur mode d'excution optimis(application de thormes de l'algbre de boole) :L'oprateur et optimis : &&Thormeq e { V, F } , F &q = FDonc si p est faux (p = F) , il est inutile d'valuer q car l'expression p &q est fausse (p &q= F), comme l'oprateur &value toujours l'expression q, Java des fins d'optimisation dela vitesse d'excution du bytecode dans la machine virtuelle Java, propose un oprateur ounot &&qui a la mme table de vrit que l'oprateur &mais qui applique ce thorme.p e { V, F } , qe { V, F } , p &&q = p &qMais dans p&&q , q n'est valu que si p = V.L'oprateur ou optimis : | |Thormeq e { V, F } , V |q = VLes fondements du langage Java - ( rv. 05.09.2004) page17Donc si p est vrai (p = V) , il est inutile d'valuer q car l'expression p |q est vraie (p |q = V),comme l'oprateur | value toujours l'expression q, Java des fins d'optimisation de lavitesse d'excution du bytecode dans la machine virtuelle Java, propose un oprateur ou not|| qui applique ce thorme et qui a la mme table de vrit que l'oprateur | .p e { V, F } , qe { V, F } , p ||q = p |qMais dans p||q , q n'est valu que si p = F.En rsum:Oprateur priorit action exemples!1 non boolen ! (5 < 2) ; !(x+1 < 3) ; etc...&7 et boolen complet (5 = = 2) & (x+1 < 3) ; etc...|9 ou boolen complet (5 != 2) | (x+1 >= 3) ; etc...&&10 et boolen optimis (5 = = 2) && (x+1 < 3) ; etc...||11 ou boolen optimis (5 != 2) || (x+1 >= 3) ; etc...Nous allons voir ci-aprs une autre utilisation des oprateurs &et | sur des variables ou desvaleurs immdiates en tant qu'oprateur bit-level.4 - Oprateurs bits levelCe sont des oprateurs de bas niveau en Java dont les oprandes sont exclusivement l'un destypes entiers ou caractre de Java (short, int, long, char, byte). Ils permettent de manipulerdirectement les bits du mot mmoire associ la donne.Oprateur priorit action exemples~ 1 complmente les bits ~a; ~(a-b); ~7 (unaire) 3 ; (a+2) >> k ; -5 >> 2 ;>>> 4 dcalage droite sans signe x >>>3 ; (a+2) >>> k ;-5 >>> 2 ;Les fondements du langage Java - ( rv. 05.09.2004) page18& 7 et boolen bit bit x & 3 ; (a+2) & k ; -5 & 2 ;^ 8 ou exclusif xor bit bit x ^ 3 ; (a+2) ^ k ; -5 ^ 2 ;| 9 ou boolen bit bit x | 3 ; (a+2) | k ; -5 | 2 ;Les tables de vrit de oprateurs "&", " | " et celle du ou exclusif " ^ " au niveau du bit sontidentiques aux tables de vrit boolennes ( seule la valeur des constantes V et F change, V estremplac par le bit 1 et F par le bit 0)Table de vrit des oprateurs bit levelp q ~ p p & q p | qp ^ q1 1 0 1 1 01 0 0 0 1 10 1 1 0 1 10 0 1 0 0 0L'oprateur ou exclusif ^ fonctionne aussi sur des variables de type boolenAfin de bien comprendre ces oprateurs, le lecteur doit bien connatre les diffrents codages desentiers en machine (binaire pur, binaire sign, complment deux) car les entiers Java sont codsen complment deux et la manipulation bit bit ncessite une bonne comprhension de cecodage.Afin que le lecteur se familiarise bien avec ces oprateurs de bas niveau nous dtaillons unexemple pour chacun d'entre eux.Les exemples en 4 instructions Java sur la mme mmoire :Rappel : int i = -14 ;soit reprsenter le nombre -14 dans la variable i de type int (entier sign sur 32 bits)codage de |-14|= 14complment 1Les fondements du langage Java - ( rv. 05.09.2004) page19addition de 1Le nombre entier -14 s'crit donc en complment 2 : 1111..10010.Soient la dclaration java suivante :int i = -14 , j ;Etudions les effets de chaque oprateur bit level sur cette mmoire i.- Etude de l'instruction : j = ~ ij = ~ i ; // complmentation des bits de i--- ~ i --->Tous les bits 1 sont transforms en 0 et les bits 0 en 1, puis le rsultat est stock dans j quicontient la valeur 13 (car 000...01101 reprsente +13 en complment deux).- Etude de l'instruction : j = i >> 2j = i >> 2 ; // dcalage avec signe de 2 bits vers la droite--- i >> 2 --->Tous les bits sont dcals de 2 positions vers la droite (vers le bit de poids faible), le bit designe (ici 1) est recopi partir de la gauche ( partir du bit de poids fort) dans lesemplacements librs (ici le bit 31 et le bit 30), puis le rsultat est stock dans j qui contientla valeur -4 (car 1111...11100 reprsente -4 en complment deux).- Etude de l'instruction : j = i , >>> , & , | , ^ },Il est possible d'utiliser sur une seule variable le nouvel oprateur op= construit avecl'oprateur op.Il s'agit plus d'un raccourci syntaxique que d'un oprateur nouveau (seule sa traduction enbytecode diffre : la traduction de a op= b devrait tre plus courte en instructions p-code quea = a op b, bien que les optimiseurs soient capables de fournir le mme code optimis).x op= y ; signifie en fait : x = x op ySoient les instruction suivantes :int a , b = 56 ;a = -8 ;a += b ; // quivalent : a = a + bb *= 3 ; // quivalent : b = b * 3simulation d'excution Java :instruction valeur de a valeur de bint a , b = 56 ; a = ??? b = 56a = -8 ; a = -8 b = 56a += b ; a = 48 b = 56b *= 3 ; a = 48 b = 168Remarques :- Cas d'une optimisation intressante dans l'instruction suivante :table[ f(a) ] = table[ f(a) ] + x ; // o f(a) est un appel la fonction f qui serait longue calculer.- Si l'on rcrit l'instruction prcdente avec l'oprateur += :table[ f(a) ] += x ; // l'appel f(a) n'est effectu qu'une seule foisLes fondements du langage Java - ( rv. 05.09.2004) page29Les instructions conditionnellesJava 21 - l'instruction conditionnelleSyntaxe :Schmatiquement les conditions sont de deux sortes :- if ( Expr ) Instr ;- if ( Expr ) Instr ; else Instr ;La dfinition de l'instruction conditionnelle de java est classiquement celle des langagesalgorithmiques; comme en pascal l'expression doit tre de type boolen (diffrent du C), lanotion d'instruction a t dfinie plus haut.Exemple d'utilisation du if..else (comparaison avec pascal)Pascal-Delphi Javavar a , b , c : integer ;....if b=0 then c := 1else beginc := a / b;writeln("c = ",c);end;c := a*b ;if c 0 then c:= c+belse c := aint a , b , c ;....if ( b = = 0 ) c =1 ;else {c = a / b;System.out.println("c = " + c);}if ((c = a*b) != 0) c += b;else c = a;Les fondements du langage Java - ( rv. 05.09.2004) page30Remarques :- L'instruction " if ((c = a*b) != 0) c +=b; else c = a; " contient une affectation intgredans le test afin de vous montrer les possibilits de Java : la valeur de a*b est rangedans c avant d'effectuer le test sur c.- Comme pascal, Java contient le manque de fermeture des instructions conditionnellesce qui engendre le classique problme du dandling else d'algol, c'est le compilateurqui rsout l'ambigut par rattachement du else au dernier if rencontr (valuation parla gauche).L'instruction suivante est ambigu :if ( Expr1 ) if ( Expr2 ) InstrA ; else InstrB ;Le compilateur rsout l'ambigit de cette instruction ainsi (rattachement du else audernier if):if ( Expr1 ) if ( Expr2 ) InstrA ; else InstrB ;- Comme en pascal, si l'on veut que l'instruction else InstrB ; soit rattache aupremier if, il est ncessaire de parenthser (introduire un bloc) le second if :Exemple de parenthsage du else pendantPascal-Delphi Javaif Expr1 thenbeginif Expr2 then InstrAendelse InstrBif ( Expr1 ) {if ( Expr2 ) InstrA ;}else InstrB2 - l'oprateur conditionnelIl s'agit ici comme dans le cas des oprateurs d'affectation d'une sorte de raccourci entrel'oprateur conditionnel if...else et l'affectation. Le but tant encore d'optimiser le bytecodeengendr.Syntaxe :O expression renvoie une valeur boolenne (le test), les deux termes valeur sont desexpressions gnrales (variable, expression numrique, boolenne etc...) renvoyant unevaleur de type quelconque.Smantique :Les fondements du langage Java - ( rv. 05.09.2004) page31Exemple :int a,b,c ;c = a = = 0 ? b : a+1 ;Si l'expression est true l'oprateur renvoie la premire valeur, (dans l'exemple c vaut lavaleur de b)Si l'expression est false l'oprateur renvoie la seconde valeur (dans l'exemple c vaut la valeurde a+1).Smantique de l'exemple avec un if..else :if (a = = 0) c = b; else c = a+1;question : utiliser l'oprateur conditionnel pour calculer le plus grand de deux entiers.rponse :int a , b , c ; ...c = a>b ? a : b ;__________________________________________________________________________question : que fait ce morceau le programme ci-aprs ?int a , b , c ; ....c = a>b ? (b=a) : (a=b) ;rponse :a,b,c contiennent aprs excution le plus grand des deux entiers contenus au dpart dans a etb.3 - l'oprateur switch...caseSyntaxe :switch :bloc switch :Les fondements du langage Java - ( rv. 05.09.2004) page32Smantique :- La partie expression d'une instruction switch doit tre une expression ou unevariable du type byte, char, int ou bien short.- La partie expression d'un bloc switch doit tre une constante ou une valeurimmdiate du type byte, char, int ou bien short.- switch s'appelle la partie slection de l'instruction : il y a valuation de puis selon la valeur obtenue le programme s'excute en squence partirdu case contenant la valeur immdiate gal. Il s'agit donc d'un droutement duprogramme ds que est value vers l'instruction tiquete par le case associ.Exemples :Java - source Rsultats de l'excutionint x = 10;switch (x+1){ case 11 : System.out.println(">> case 11");case 12 : System.out.println(">> case 12");default : System.out.println(">> default");}>> case 11>> case 12>> defaultint x = 11;switch (x+1){ case 11 : System.out.println(">> case 11");case 12 : System.out.println(">> case 12");default : System.out.println(">> default");}>> case 12>> defaultNous voyons qu'aprs que (x+1) soit valu, selon sa valeur (11 ou 12) le programme va sedrouter vers case 11 ou case 12 et continue en squence (suite des instructions du blocswitch)Utilise telle quelle, cette instruction n'est pas structure et donc son utilisation estdconseille sous cette forme. Par contre elle est trs souvent utilise avec l'instruction breakafin de simuler le comportement de l'instruction structure case..of du pascal (ci-dessousdeux critures quivalentes) :Exemple de switch..case..breakLes fondements du langage Java - ( rv. 05.09.2004) page33Pascal-Delphi Javavar x : char ;....case x of'a' : InstrA;'b' : InstrB;else InstrElseend;char x ;....switch (x){case 'a' : InstrA ; break;case 'b' : InstrB ; break;default : InstrElse;}Dans ce cas le droulement de l'instruction switch aprs droutement vers le bon case, estinterrompu par le break qui renvoie la suite de l'excution aprs la fin du bloc switch. Unetelle utilisation correspond une utilisation de if...else imbriqus (donc une utilisationstructure) mais devient plus lisible que les if ..else imbriqus, elle est donc fortementconseille dans ce cas.En reprenant les deux exemples prcdents :Exemples :Java - source Rsultats de l'excutionint x = 10;switch (x+1){ case 11 : System.out.println(">> case 11");break;case 12 : System.out.println(">> case 12");break;default : System.out.println(">> default");}>> case 11int x = 11;switch (x+1){ case 11 : System.out.println(">> case 11");break;case 12 : System.out.println(">> case 12");break;default : System.out.println(">> default");}>> case 12Il est toujours possible d'utiliser des instructions if else imbriques pour reprsenter unswitch structur (switch avec break) :Programmes quivalents switch et if...else :Les fondements du langage Java - ( rv. 05.09.2004) page34Java - switch Java - if...elseint x = 10;switch (x+1){ case 11 : System.out.println(">> case 11");break;case 12 : System.out.println(">> case 12");break;default : System.out.println(">> default");}int x = 10;if (x+1= = 11)System.out.println(">> case 11");elseif (x+1= = 12)System.out.println(">> case 12");elseSystem.out.println(">> default");Nous conseillons au lecteur de n'utiliser le switch qu'avec des break afin de bnficier de lastructuration.Les fondements du langage Java - ( rv. 05.09.2004) page35Exemples instruction et oprateur conditionnelsLes fondements du langage Java - ( rv. 05.09.2004) page36Exemples instruction et oprateur conditionnelsLes fondements du langage Java - ( rv. 05.09.2004) page37Exemple switch case , avec et sans breakRsultats d'excution du programme pour x = 10 :x = 14a = 11Rsultats d'excution du programme pour x = 11 :x = 14a = 12Rsultats d'excution du programme pour x = 12 :x = 14a = 13Les fondements du langage Java - ( rv. 05.09.2004) page38Les instructions itrativesJava 21 - l'instruction whileSyntaxe :O expression est une expression renvoyant une valeur boolenne (le test de l'itration).Smantique :Identique celle du pascal (instruction algorithmique tantque .. faire .. ftant) avec le mmedfaut de fermeture de la boucle.Exemple de boucle whilePascal-Delphi Javawhile Expr do Instr while ( Expr ) Instr ;while Expr dobeginInstrA ;InstrB ; ...endwhile ( Expr ){InstrA ;InstrB ; ...}2 - l'instruction do ... whileSyntaxe :O expression est une expression renvoyant une valeur boolenne (le test de l'itration).Smantique :L'instruction "do Instr while ( Expr )" fonctionne comme l'instruction algorithmique rpterInstr jusqu non Expr.Les fondements du langage Java - ( rv. 05.09.2004) page39Sa smantique peut aussi tre explique l'aide d'une autre instruction Java while :do Instr while ( Expr ) Instr ; while ( Expr ) InstrExemple de boucle do...whilePascal-Delphi JavarepeatInstrA ;InstrB ; ...until not Exprdo{InstrA ;InstrB ; ...} while ( Expr )3 - l'instruction for(...)Syntaxe :Smantique :Une boucle for contient 3 expressions for (Expr1 ; Expr2 ; Expr3 ) Instr, d'une maniregnrale chacune de ces expressions joue un rle diffrent dans l'instruction for. Uneinstruction for en Java (comme en C) est plus puissante et plus riche qu'une boucle for dansd'autres langages algorithmiques. Nous donnons ci-aprs une smantique minimale :- Expr1 sert initialiser une ou plusieurs variables (dont ventuellement la variable decontrle de la boucle) sous forme d'une liste d'instructions d'initialisation spares pardes virgules.- Expr2 sert donner la condition de rebouclage sous la forme d'une expressionrenvoyant une valeur boolenne (le test de l'itration).- Expr3 sert ractualiser les variables (dont ventuellement la variable de contrle dela boucle)sous forme d'une liste d'instructions spares par des virgules.L'instruction "for (Expr1 ; Expr2 ; Expr3 ) Instr" fonctionne au minimum commel'instruction algorithmique pour... fpour, elle est toutefois plus puissante que cette dernire.Les fondements du langage Java - ( rv. 05.09.2004) page40Sa smantique peut aussi tre approximativement(*) explique l'aide d'une autre instructionJava while :for (Expr1 ; Expr2 ; Expr3 ) InstrExpr1 ;while ( Expr2 ){Instr ;Expr3}(*)Nous verrons au paragraphe consacr l'instruction continue que si l'instruction forcontient un continue cette dfinition smantique n'est pas valide.Exemples montrant la puissance du forPascal-Delphi Javafor i:=1 to 10 dobeginInstrA ;InstrB ; ...endfor ( i = 1; i-450) dobeginInstrA ;InstrB ; ...k := k+i;i := i-15;endfor ( i = 10, k = i ;i>-450 ; k += i , i -= 15){InstrA ;InstrB ; ...}i := n;while i1 doif i mod 2 = 0 then i := i div 2else i := i+1for ( i = n ;i !=1 ; i % 2 == 0 ? i /=2 : i++);// pas de corps de boucle !- Le premier exemple montre une boucle for classique avec la variable de contrle "i"(indice de boucle), sa borne initiale "i=1" et sa borne finale "10", le pasd'incrmentation squentiel tant de 1.- Le second exemple montre une boucle toujours contrle par une variable "i", maisdont le pas de dcrmentation squentiel est de -15.- Le troisime exemple montre une boucle aussi contrle par une variable "i", maisdont la variation n'est pas squentielle puisque la valeur de i est modifie selon saparit ( i % 2 == 0 ? i /=2 : i++).Voici un exemple de boucle for dite boucle infinie :Les fondements du langage Java - ( rv. 05.09.2004) page41for ( ; ; ); est quivalente while (true);Voici une boucle ne possdant pas de variable de contrle(f(x) est une fonction djdclare) :for (int n=0 ; Math.abs(x-y) < eps ; x = f(x) );Terminons par une boucle for possdant deux variables de contrle ://inverse d'une suite de caractre dans un tableau par permutation des deuxextrmeschar [ ] Tablecar ={'a','b','c','d','e','f'} ;for ( i = 0 , j = 5 ; i, la classe Systempossde une variable (un champ)de classe out qui est elle-mme un objet de classe drivant de la classe FilterOutputStream, nous n'avons jamaisinstanci d'objet de cette classe System.Les fondements du langage Java - ( rv. 05.09.2004) page122Les champs de la classe System :Notons que les champs err et in sont aussi des variables de classe (prcdes par le mot static).Mthode de classeUne mthode de classe est une mthode dont l'implmentation est la mme pour tous les objetsde la classe, en fait la diffrence avec une mthode d'instance a lieu sur la catgorie des variablessur lesquelles ces mthodes agissent.De par leur dfinition les mthodes de classe ne peuvent travailler qu'avec des variables declasse, alors que les mthodes d'instances peuvent utiliser les deux catgories de variables.Un programme correct illustrant le discours :Java Explicationsclass Exemple {static int x ;int y ;void f1(int a){ x = a;y = a;}static void g1(int a){ x = a;}}class Utilise{public static void main(String [] arg){ Exemple obj = new Exemple( );obj.f1(10);System.out.println("obj.x="+obj.x);obj.g1(50);System.out.println("obj.x="+obj.x);}}void f1(int a){ x = a; //accs la variable de classey = a ; //accs la variable d'instance}static void g1(int a){ x = a; //accs la variable de classey = a ; //engendrerait une erreur de compilation: accs une variable non static interdit !}La mthode f1 accde toutes les variables de laclasse Exemple, la mthode g1 n'accde qu'auxvariables de classe (static).Aprs excution on obtient :obj.x = 10obj.x = 50Les fondements du langage Java - ( rv. 05.09.2004) page123Rsumons ci-dessous ce qu'il faut connatre pour bien utiliser ces outils.Bilan pratique et utile sur les membres de classe, en 5 remarques1) - Les mthodes et les variables de classe sont prcdes obligatoirement du mot clefstatic. Elles jouent un rle semblable celui qui est attribu aux variables et aux sous-routines globales dans un langage impratif classique.Java Explicationsclass Exemple1{int a = 5;static int b = 19;void m1( ){...}static void m2( ) {...}}La variable a dans int a = 5; est une variabled'instance.La variable b dans static int b = 19; est unevariable de classe.La mthode m2 dans static void m2( ) {...} estune mthode de classe.2) - Pour utiliser une variable x1 ou une mthode meth1 de la classe Classe1, il suffit ded'crire Classe1.x1 ou bien Classe1.meth1.Java Explicationsclass Exemple2{static int b = 19;static void m2( ) {...}}class UtiliseExemple{ Exemple2.b = 53;Exemple2.m2( );...}Dans la classe Exemple2 b est une variable declasse, m2 une mthode de classe.La classe UtiliseExemple fait appel lamthode m2 directement avec le nom de laclasse, il en est de mme avec le champ b de laclasse Exemple2.3) - Une variable de classe (prcde du mot clef static) est partage par tous les objets dela mme classe.Les fondements du langage Java - ( rv. 05.09.2004) page124Java Explicationsclass AppliStatic{ static int x = -58 ;int y = 20 ;...}class Utilise{public static void main(String [] arg) {AppliStatic obj1 = new AppliStatic( );AppliStatic obj2 = new AppliStatic( );AppliStatic obj3 = new AppliStatic( );obj1.y = 100;obj1.x = 101;System.out.println("obj1.x="+obj1.x);System.out.println("obj1.y="+obj1.y);System.out.println("obj2.x="+obj2.x);System.out.println("obj2.y="+obj2.y);System.out.println("obj3.x="+obj3.x);System.out.println("obj3.y="+obj3.y);AppliStatic.x = 99;System.out.println(AppliStatic.x="+obj1.x);}}Dans la classe AppliStatic x est unevariable de classe, et y une variabled'instance.La classe Utilise cre 3 objets (obj1, obj2,obj3) de classe AppliStatic.L'instruction obj1.y = 100; est un accs auchamp y de l'instance obj1. Ce n'est quele champ x de cet objet qui est modifi,les champs x des objets obj2 et obj3restent inchangsIl y a deux manires d'accder lavariable static x :soit comme un champ de l'objet (accssemblable celui de y) : obj1.x = 101;soit comme une variable de classeproprement dite : AppliStatic.x = 99;Dans les deux cas cette variable x estmodifie globalement et donc tous leschamps x des 2 autres objets, obj2 et obj3prennent la nouvelle valeur.Au dbut lors de la cration des 3 objets chacun des champs x vaut -58 et des champs y vaut 20,l'affichage par System.out.println(...) donne les rsultats suivants qui dmontrent le partage de lavariable x par tous les objets.Aprs excution :obj1.x = 101obj1.y = 100obj2.x = 101obj2.y = 20obj3.x = 101obj3.y = 20obj1.x = 994) - Une mthode de classe (prcde du mot clef static) ne peut utiliser que des variablesde classe (prcdes du mot clef static) et jamais des variables d'instance.Une mthoded'instance peut accder aux deux catgories de variables.Les fondements du langage Java - ( rv. 05.09.2004) page1255) - Une mthode de classe (prcde du mot clef static) ne peut appeller (invoquer) quedes mthodes de classe (prcdes du mot clef static).Java Explicationsclass AppliStatic{static int x = -58 ;int y = 20 ;void f1(int a){ AppliStatic.x = a;y = 6 ;}}class Utilise{static void f2(int a){ AppliStatic.x = a;}public static void main(String [] arg) {AppliStatic obj1 = new AppliStatic( );AppliStatic obj2 = new AppliStatic( );AppliStatic obj3 = new AppliStatic( );obj1.y = 100;obj1.x = 101;AppliStatic.x = 99;f2(101);obj1.f1(102);}}Nous reprenons l'exemple prcdent enajoutant la classe AppliStatic une mthodeinterne f1 :void f1(int a) {AppliStatic.x = a;y = 6 ;}Cette mthode accde la variable de classecomme un champ d'objet.Nous rajoutons la classe Utilise, unemthode static (mthode de classe) note f2:static void f2(int a){ AppliStatic.x = a;}Cette mthode accde elle aussi la variablede classe parce qu c'est une mthode static.Nous avons donc quatre manires d'accder la variable static x, :soit comme un champ de l'objet (accssemblable celui de y) : obj1.x = 101;soit comme une variable de classeproprement dite : AppliStatic.x = 99;soit par une mthode d'instance sur sonchamp : obj1.f1(102);soit par une mthode static (de classe) :f2(101);Comme la mthode main est static, elle peut invoquer la mthode f2 qui est aussi statique.Au paragraphe prcdent, nous avons indiqu que Java ne connaissait pas la notion de variableglobale stricto sensu, mais en fait une variable static peut jouer le rle d'un variable globalepour un ensemble d'objets instancis partir de la mme classe.Surcharge et polymorphismeVocabulaire :Le polymorphisme est la capacit d'une entit possder plusieurs formes. En informatique cevocable s'applique aux objets et aussi aux mthodes selon leur degr d'adaptabilit, nousdistinguons alors deux dnominations :Les fondements du langage Java - ( rv. 05.09.2004) page126- A - le polymorphisme statique ou la surcharge de mthode- B- le polymorphisme dynamique ou la redfinition de mthode ou encore lasurcharge hrite.A - La surcharge de mthode (polymorphisme statique)C'est une fonctionnalit classique des langages trs volus et en particulier des langages orientsobjet; elle consiste dans le fait qu'une classe peut disposer de plusieurs mthodes ayant lemme nom, mais avec des paramtres formels diffrents ou ventuellement un type de retourdiffrent. On appelle signature de la mthode l'en-tte de la mthode avec ses paramtresformels. Nous avons dj utilis cette fonctionnalit prcdement dans le paragraphe sur lesconstructeurs, o la classe Un disposait de trois constructeurs surchargs :class Un{int a;public Un ( ){ a = 100; }public Un (int b ){ a = b; }public Un (float b ){ a = (int)b; }}Mais cette surcharge est possible aussi pour n'importe quelle mthode de la classe autreque le constructeur. Le compilateur n'prouve aucune difficult lorsqu'il rencontre un appel l'une des versions surcharge d'une mthode, il cherche dans la dclaration de toutes lessurcharges celle dont la signature (la dclaration des paramtres formels) concide avec lesparamtres effectifs de l'appel.Programme Java excutable Explicationsclass Un{ int a;public Un (int b ){ a = b; }La mthode f de la classe Un est surcharge troisfois :void f ( )Les fondements du langage Java - ( rv. 05.09.2004) page127void f ( ){ a *=10; }void f ( int x ){ a +=10*x; }int f ( int x, char y ){ a = x+(int)y;return a; }}class AppliSurcharge{public static void main(String [ ] arg) {Un obj = new Un(15);System.out.println(" a ="+obj.a);obj.f( );System.out.println(" a ="+obj.a);obj.f(2);System.out.println(" a ="+obj.a);obj.f(50,'a');System.out.println(" a ="+obj.a);}}{ a *=10; }void f ( int x ){ a +=10*x; }int f ( int x, char y ){ a = x+(int)y;return a; }La mthode f de la classe Un peut donc treappele par un objet instanci de cette classe sousl'une quelconque des trois formes :obj.f( ); pas de paramtre => choix : void f ( )obj.f(2); paramtre int => choix : void f ( int x )obj.f(50,'a'); deux paramtres, un int un char =>choix : int f ( int x, char y )Comparaison Delphi - java sur la surcharge :Delphi JavaUn = classa : integer;publicconstructor methode( b : integer );procedure f;overload;procedure f(x:integer);overload;function f(x:integer;y:char):integer;overload;end;implementationconstructor Un.methode( b : integer ); begina:=bend;procedure Un.f; begina:=a*10;end;procedure Un.f(x:integer); begina:=a+10*xend;function Un.f(x:integer;y:char):integer; begina:=x+ord(y);result:= aend;procedure LancerMain;class Un{ int a;public Un (int b ){ a = b; }void f ( ){ a *=10; }void f ( int x ){ a +=10*x; }int f ( int x, char y ){ a = x+(int)y;return a; }}class AppliSurcharge{public static void main(String [ ] arg) {Un obj = new Un(15);System.out.println(" a ="+obj.a);obj.f( );System.out.println(" a ="+obj.a);obj.f(2);System.out.println(" a ="+obj.a);obj.f(50,'a');System.out.println(" a ="+obj.a);Les fondements du langage Java - ( rv. 05.09.2004) page128var obj:Un;beginobj:=Un.methode(15);obj.f;Memo1.Lines.Add('obj.f='+inttostr(obj.a));obj.f(2);Memo1.Lines.Add('obj.f(2)='+inttostr(obj.a));obj.f(50,'a');Memo1.Lines.Add('obj.f(50,''a'')='+inttostr(obj.a));end;}}B - La redfinition de mthode (polymorphisme dynamique)C'est une fonctionnalit spcifique aux langages orients objet. Elle est mise en oeuvre lors del'hritage d'une classe mre vers une classe fille dans le cas d'une mthode ayant la mmesignature dans les deux classes. Dans ce cas les actions des l'appel de la mthode, dpendentdu code inhrent chaque version de la mthode (celle de la classe mre, ou bien celle de laclasse fille). Ces actions peuvent tre diffrentes. En java aucun mot clef n'est ncessaire ni pourla surcharge ni pour la redfinition, c'est le compilateur qui analyse la syntaxe afin de de serendre compte en fonction des signatures s'il s'agit de redfinition ou de surcharge. Attention iln'en va pas de mme en Delphi, plus verbeux mais plus explicite pour le programmeur, quincessite des mots clefs comme virtual, dynamic override et overload.Dans l'exemple ci-dessous la classe ClasseFille qui hrite de la classe ClasseMere, redfinit lamthode f de sa classe mre :Comparaison redfinition Delphi et Java :Delphi JavatypeClasseMere = classx : integer;procedure f (a:integer);virtual;//autorisationprocedure g(a,b:integer);end;ClasseFille = class ( ClasseMere )y : integer;procedure f (a:integer);override;//redfinitionprocedure g1(a,b:integer);end;implementationprocedure ClasseMere.f (a:integer); begin...end;procedure ClasseMere.g(a,b:integer); begin...end;procedure ClasseFille.f (a:integer); begin...class ClasseMere{int x = 10;void f ( int a){ x +=a; }void g ( int a, int b){ x +=a*b; }}class ClasseFille extends ClasseMere{int y = 20;void f ( int a) //redfinition{ x +=a; }void g1 (int a, int b) //nouvelle mthode{ ...... }}Les fondements du langage Java - ( rv. 05.09.2004) page129end;procedure ClasseFille.g1(a,b:integer); begin...end;Comme delphi, Java peut combiner la surcharge et la redfinition sur une mme mthode, c'estpourquoi nous pouvons parler de surcharge hrite :Javaclass ClasseMere{int x = 10;void f ( int a){ x +=a; }void g ( int a, int b){ x +=a*b; }}class ClasseFille extends ClasseMere{int y = 20;void f ( int a) //redfinition{ x +=a; }void g (char b) //surcharge et redfinition de g{ ...... }}C'est le compilateur Java qui fait tout le travail. Prenons un objet obj de classe Classe1, lorsquele compilateur Java trouve une instruction du genre "obj.method1(paramtres effectifs);", sadmarche d'analyse est semblable celle du compilateur Delphi, il cherche dans l'ordre suivant :- Y-a-t-il dans Classe1, une mthode qui se nomme method1 ayant une signature identiqueaux paramtres effectifs ?- si oui c'est la mthode ayant cette signature qui est appele,- si non le compilateur remonte dans la hierarchie des classes mres de Classe1 en posantla mme question rcursivement jusqu' ce qu'il termine sur la classe Object.- Si aucune mthode ayant cette signature n'est trouve il signale une erreur.Soit partir de l'exemple prcdent les instructions suivantes :ClasseFille obj = new ClasseFille( );obj.g(-3,8);obj.g('h');Les fondements du langage Java - ( rv. 05.09.2004) page130Le compilateur Java applique la dmarche d'analyse dcrite, l'instruction "obj.g(-3,8);". Netrouvant pas dans ClasseFille de mthode ayant la bonne signature (signature = deux entiers) , lecompilateur remonte dans la classe mre ClasseMere et trouve une mthode " void g ( int a, intb) " de la classe ClasseMere ayant la bonne signature (signature = deux entiers), il procde alors l'appel de cette mthode sur les paramtres effectifs (-3,8).Dans le cas de l'instruction obj.g('h'); , le compilateur trouve immdiatement dans ClasseFille lamthode " void g (char b) " ayant la bonne signature, c'est donc elle qui est appele sur leparamtre effectif 'h'.Rsum pratique sur le polymorphisme en JavaLa surcharge (polymorphisme statique) consiste proposer diffrentes signatures de la mmemthode.La redfinition (polymorphisme dynamique) ne se produit que dans l'hritage d'une classe parredfinition de la mthode mre avec une mthode fille (ayant ou n'ayant pas la mmesignature).Le mot clef superNous venons de voir que le compilateur s'arrte ds qu'il trouve une mthode ayant la bonnesignature dans la hirarchie des classes, il est des cas o nous voudrions accder une mthodede la classe mre alors que celle-ci est redfinie dans la classe fille. C'est un problme analogue l'utilisation du this lors du masquage d'un attribut. Il existe un mot clef qui permet d'accder laclasse mre (classe immdiatement au dessus): le mot super.On parle aussi de super-classe au lieu de classe mre en Java. Ce mot clef super rfrence laclasse mre et travers lui, il est possible d'accder tous les champs et toutes les mthodes dela super-classe (classe mre). Ce mot clef est trs semblable au mot clef inherited de Delphi quijoue le mme rle uniquement sur les mthodes.Exemple :class ClasseMere{int x = 10;void g ( int a, int b){ x +=a*b; }}class ClasseFille extends ClasseMere{Les fondements du langage Java - ( rv. 05.09.2004) page131int x = 20; //masque le champ x de la classe mrevoid g (char b) //surcharge et redfinition de g{ super.x = 21; //accs au champ x de la classe mresuper.g(-8,9); //accs la mthode g de la classe mre}}Le mot clef super peut en Java tre utilis seul ou avec des paramtres comme un appel auconstructeur de la classe mre.Exemple :class ClasseMere{public ClasseMere ( ) {... }public ClasseMere (int a ) {... }}class ClasseFille extends ClasseMere{public ClasseFille ( ) {super ( ); //appel au 1er constructeur de ClasseMeresuper ( 34 ); //appel au 2nd constructeur de ClasseMere... }public ClasseFille ( char k, int x) {super ( x ); //appel au 2nd constructeur de ClasseMere... }}Modification de visibilitTerminons ce chapitre par les classiques modificateurs de visibilit des variables et des mthodesdans les langages orients objets, dont Java dispose :Modification de visibilit (modularit public-priv)par dfaut(aucun mot clef)les variables et les mthodes d'une classe non prcdes d'un mot clef sontvisibles par toutes les classes inclues dans le module seulement.publicles variables et les mthodes d'une classe prcdes du mot clef public sontvisibles par toutes les classes de tous les modules.privateles variables et les mthodes d'une classe prcdes du mot clef private ne sontvisibles que dans la classe seulement.Les fondements du langage Java - ( rv. 05.09.2004) page132protectedles variables et les mthodes d'une classe prcdes du mot clef protected sontvisibles par toutes les classes inclues dans le module, et par les classes drivesde cette classe.Ces attributs de visibilit sont identiques ceux de Delphi.Les fondements du langage Java - ( rv. 05.09.2004) page133Les interfacesJava2Introduction- Les interfaces ressemblent aux classes abstraites sur un seul point : elles contiennent desmembres expliquant certains comportements sans les implmenter.- Les classes abstraites et les interfaces se diffrencient principalement par le fait qu'une classepeut implmenter un nombre quelconque d'interfaces, alors qu'une classe abstraite nepeut hriter que d'une seule classe abstraite ou non.Vocabulaire et concepts :- Une interface est un contrat, elle peut contenir des proprits, des mthodes et desvnements mais ne doit contenir aucun champ ou attribut.- Une interface ne peut pas contenir des mthodes dj implmentes.- Une interface doit contenir des mthodes non implmentes.- Une interface est hritable.- On peut construire une hirarchie d'interfaces.- Pour pouvoir construire un objet partir d'une interface, il faut dfinir une classe nonabstraite implmentant toutes les mthodes de l'interface.Une classe peut implmenter plusieurs interfaces. Dans ce cas nous avons une excellentealternative l'hritage multiple.Lorsque l'on cre une interface, on fournit un ensemble de dfinitions et de comportementsqui ne devraient plus tre modifis. Cette attitude de constance dans les dfinitions, protgeles applications crites pour utiliser cette interface.Les variables de types interface respectent les mmes rgles de transtypage que les variablesde types classe.Les fondements du langage Java - ( rv. 05.09.2004) page134Les objets de type classe clA peuvent tre transtyps et refrencs par des variablesd'interface IntfA dans la mesure o la classe clA implmente linterface IntfA. (cf.polymorphisme d'objet)Si vous voulez utiliser la notion d'interface pour fournir un polymorphisme une famille declasses, elles doivent toutes implmenter cette interface, comme dans l'exemple ci-dessous.Exemple :l'interface Vhicule dfinissant 3 mthodes (abstraites) Dmarrer, RpartirPassagers derpartition des passagers bord du vhicule (fonction de la forme, du nombre de places, dupersonnel charg de s'occuper de faire fonctionner le vhicule...), et PriodicitMaintenancerenvoyant la priodicit de la maintenance obligatoire du vhicule (fonction du nombre de kmsou miles parcourus, du nombre d'heures d'activits,...)Soit l'interface Vhicule dfinissant ces 3 mthodes :Soient les deux classes Vhicule terrestre et Vhicule marin, qui implmentent partiellementchacune l'interface Vhicule , ainsi que trois classes voiture, voilier et croiseur hritant de cesdeux classes :- Les trois mthodes de l'interface Vhicule sont abstraites et publics par dfinition.- Les classes Vhicule terrestre et Vhicule marin sont abstraites, car la mthodeLes fondements du langage Java - ( rv. 05.09.2004) page135abstraite Dmarrer de l'interface Vhicule n'est pas implmente elle reste comme"modle" aux futurs classes. C'est dans les classes voiture, voilier et croiseur que l'onimplmente le comportement prcis du genre de dmarrage.Dans cette vision de la hirarchie on a suppos que les classes abstraites Vhicule terrestreet Vhicule marin savent comment rpartir leurs ventuels passagers et quand effectuer unemaintenance du vhicule.Les classes voiture, voilier et croiseur , n'ont plus qu' implmenter chacune son proprecomportement de dmarrage.Syntaxe de l'interface en Delphi et en Java (C# est semblable Java) :Delphi JavaVehicule = Interfaceprocedure Demarrer;procedure RpartirPassagers;procedure PriodicitMaintenance;end;Interface Vehicule {void Demarrer( );void RpartirPassagers( );void PriodicitMaintenance( );}Utilisation pratique des interfacesQuelques conseils prodigus par des dveloppeurs professionnels (microsoft, Borland) :- Les interfaces bien conues sont plutt petites et indpendantes les unes des autres.- Un trop grand nombre de fonctions rend l'interface peu maniable.- Si une modification s'avre ncessaire, une nouvelle interface doit tre cre.- La dcision de crer une fonctionnalit en tant qu'interface ou en tant que classe abstraitepeut parfois s'avrer difficile.- Vous risquerez moins de faire fausse route en concevant des interfaces qu'en crant desarborescences d'hritage trs fournies.- Si vous projetez de crer plusieurs versions de votre composant, optez pour une classeabstraite.- Si la fonctionnalit que vous crez peut tre utile de nombreux objets diffrents, faitesappel une interface.- Si vous crez des fonctionnalits sous la forme de petits morceaux concis, faites appelaux interfaces.- L'utilisation d'interfaces permet d'envisager une conception qui spare la manired'utiliser une classe de la manire dont elle est implmente.Les fondements du langage Java - ( rv. 05.09.2004) page136- Deux classes peuvent partager la mme interface sans descendre ncessairement de lamme classe de base.Exemple de hirarchie partir d'une interface :Dans cet exemple :Les mthodes RpartirPassagers, PriodicitMaintenance et Demarrer sont implantes soitcomme des mthodes liaison dynamique afin de laisser la possibilit pour des classes enfantsde surcharger ces mthodes.Soit l'criture en Java de cet l'exemple :interface IVehicule{void Demarrer( );void RpartirPassager( );void PriodicitMaintenance( );}abstract class Terrestre implements IVehicule {public void RpartirPassager( ){..........};public void PriodicitMaintenance( ){..........};}class Voiture extends Terrestre {public void Demarrer( ){..........};}abstract class Marin implements IVehicule {Les fondements du langage Java - ( rv. 05.09.2004) page137public void RpartirPassager( ){..........};public void PriodicitMaintenance( ){..........};}class Voilier extends Marin {public void Demarrer( ){..........};}class Croiseur extends Marin {public void Demarrer( ){..........};}Les fondements du langage Java - ( rv. 05.09.2004) page138Java2 la fentreavec AwtIHM avec JavaJava, comme tout langage moderne, permet de crer des applications qui ressemblent l'interfacedu systme d'exploitation. Cette assurance d'ergonomie et d'interactivit avec l'utilisateur est leminimum qu'un utilisateur demande une application. Les interfaces homme-machine(dnommes IHM) font intervenir de nos jours des lments que l'on retrouve dans la majoritdes systmes d'exploitation : les fentres, les menus droulants, les boutons, etc...Ce chapitre traite en rsum, mais en posant toutes les bases, de l'aptitude de Java laborer uneIHM. Nous regroupons sous le vocable d'IHM Java, les applications disposant d'une interfacegraphique et les applets que nous verrons plus loin.Le package AWTC'est pour construire de telles IHM que le package AWT (Abstract Window Toolkit) est includans toutes les versions de Java. Ce package est la base des extensions ultrieures comme Swing,mais est le seul qui fonctionne sur toutes les gnrations de navigateurs.Les classes contenues dans AWT drivent (hritent) toutes de la classe Component, nous allonstudier quelques classes minimales pour construire une IHM standard.Ces classes sont essentielles pour la construction d'IHM Java elles drivent de la classejava.awt.Container, elles permettent d'intgrer d'autres objets visuels et de les organiser l'cran.Hirarchie de la classe Container :java.lang.Object|+--java.awt.Component|+--java.awt.ContainerLes classes ConteneursLes fondements du langage Java - ( rv. 05.09.2004) page139Voici la liste extraite du JDK des sous-classes de la classe Container autres que Swing :Panel, ScrollPane, Window.Les principales classes conteneurs :Classe Fonction+--java.awt.Container|+--java.awt.WindowCre des rectangles simples sans cadre,sans menu, sans titre, mais ne permet pasde crer directement une fentre Windowsclassique.+--java.awt.Container|+--java.awt.PanelCre une surface sans bordure, capable decontenir d'autres lments : boutons, paneletc...+--java.awt.Container|+--java.awt.ScrollPaneCre une barre de dfilement horizontaleet/ou une barre de dfilement verticale.Les classes hrites des classes conteneurs :Classe Fonctionjava.awt.Window|+--java.awt.FrameCre des fentres avec bordure, pouvantintgrer des menus, avec un titre, etc...commetoute fentre Windows classique.C'est le conteneur de base de toute applicationgraphique.java.awt.Window|+--java.awt.DialogCre une fentre de dialogue avec l'utilisateur,avec une bordure, un titre et un bouton-icnede fermeture.Une premire fentre construite partir d'un objet de classe Frame; une fentre est donc un objet,on pourra donc crer autant de fentres que ncessaire, il suffira chaque fois d'instancier unobjet de la classe Frame.Quelques mthodes de la classe Frame, utiles au dpart :Mthodes Fonctionpublic void setSize(int width, int height)retaille la largeur (width) et la hauteur(height) de la fentre.public void setBounds(int x, int y, intwidth, int height)retaille la largeur (width) et la hauteur(height) de la fentre et la positionneen x,y sur l'cran.Les fondements du langage Java - ( rv. 05.09.2004) page140public Frame(String title)public Frame( )Les deux constructeurs d'objets Frame,celui qui possde un paramtre Stringcrit la chane dans la barre de titre dela fentre.public void setVisible(boolean b )Change l'tat de la fentre en modevisible ou invisible selon la valeur deb.public void hide( )Change l'tat de la fentre en modeinvisible.Diffrentes surcharges de la mthode add :public Component add(Component comp)etc...Permettent d'ajouter un composant l'intrieur de la fentre.Une Frame lorsque son constructeur la cre est en mode invisible, il faut donc la rendre visible,c'est le rle de la mthode setVisible ( true) que vous devez appeler afin d'afficher la fentre surl'cran :Programme Javaimport java.awt.*;class AppliWindow{public static void main(String [ ] arg) {Frame fen = new Frame ("Bonjour" );fen. setVisible ( true );}}Ci-dessous la fentre affiche par le programme prcdent :Cette fentre est trop petite, retaillons-la avec la mthode setBounds :Programme Javaimport java.awt.*;class AppliWindow{public static void main(String [ ] arg) {Frame fen = new Frame ("Bonjour" );fen.setBounds(100,100,250,150);fen. setVisible ( true );}}Les fondements du langage Java - ( rv. 05.09.2004) page141Ci-dessous la fentre affiche par le programme prcdent :Pour l'instant nos fentres sont repositionnables, retaillables, mais elles ne contiennent rien,comme ce sont des objets conteneurs, il est possible en particulier, d'y inclure des composants.Il est possible d'afficher des fentres dites de dialogue de la classe Dialog, dpendant d'uneFrame. Elles sont trs semblables aux Frame (barre de titre, cadre,...) mais ne disposent que d'unbouton icne de fermeture dans leur titre :une fentre de classe Dialog :De telles fentres doivent tre obligatoirement rattaches lors de la construction un parent quisera une Frame ou une autre bote de classe Dialog, le constructeur de la classe Dialog contientplusieurs surcharges dont la suivante :public Dialog(Frame owner, String title)o owner est la Frame qui va appeler la bote de dialogue, title est la string contenant le titre de labote de dialogue. Il faudra donc appeler le constructeur Dialog avec une Frame instancie dansle programme.Exemple d'affichage d'une bote informations partir de notre fentre "Bonjour" :Programme Javaimport java.awt.*;class AppliWindow{public static void main(String [ ] arg) {Frame fen = new Frame ("Bonjour" );fen.setBounds(100,100,250,150);Dialog fenetreDial = new Dialog (fen,"Informations");fenetreDial.setSize(150,70);fenetreDial.setVisible( true);fen. setVisible ( true );}}fen.setBounds(100,100,250,150);Les fondements du langage Java - ( rv. 05.09.2004) page142Ci-dessous les fentres Bonjour et la bote Informations affiches par le programme prcdent :Ce sont essentiellement des classes directement hrites de la classe java.awt.Container. Lesmenus drivent de la classe java.awt.MenuComponent. Nous ne dtaillons pas tous lescomposants possibles, mais certains les plus utiles crer une interface Windows-like.Composants permettant le dclenchement d'actions :Les classes composants Fonctionjava.lang.Object|+--java.awt.MenuComponent|+--java.awt.MenuBarCration d'une barre des menus dans lafentre.java.lang.Object|+--java.awt.MenuComponent|+--java.awt.MenuItemCration des zones de sous-menus d'unmenu principal de la classique barre desmenus.java.lang.Object|+--java.awt.MenuComponent|+--java.awt.MenuItem|+--java.awt.MenuCration d'un menu principal classiquedans la barre des menus de la fentre.java.lang.Object|+--java.awt.Component|+--java.awt.ButtonCration d'un bouton poussoir classique(cliquable par la souris)java.lang.Object|+--java.awt.Component|+--java.awt.CheckboxCration d'un radio bouton, regroupableventuellement avec d'autres radio boutons.Dialog fenetreDial = new Dialog(fen,"Informations");fenetreDial.setSize(150,70);fenetreDial.setVisible( true);Composants dclenchant des actionsLes fondements du langage Java - ( rv. 05.09.2004) page143Enrichissons notre fentre prcdente d'un bouton poussoir et de deux radio boutons :Programme Javaimport java.awt.*;class AppliWindow{public static void main(String [ ] arg) {Frame fen = new Frame ("Bonjour" );fen.setBounds(100,100,250,150);fen.setLayout(new FlowLayout( ));Button entree = new Button("Entrez");Checkbox bout1 = new Checkbox("Mari");Checkbox bout2 = new Checkbox("Clibataire");fen.add(entree);fen.add(bout1);fen.add(bout2);fen. setVisible ( true );}}Ci-dessous la fentre affiche par le programme prcdent :Remarques sur le programme prcdent :1) Les instructions- Button entree = new Button("Entrez");- Checkbox bout1 = new Checkbox("Mari");- jCheckbox bout2 = new Checkbox("Clibataire");servent crer un bouton poussoir (classe Button) et deux boutons radio (classe CheckBox),chacun avec un libell.2) Les instructionsfen.add(entree);fen.add(bout1);fen.add(bout2);Les fondements du langage Java - ( rv. 05.09.2004) page144servent ajouter les objets crs au conteneur (la fentre fen de classe Frame).3) L'instruction- fen.setLayout(new FlowLayout( ));sert positionner les objets visuellement dans la fentre les uns ct des autres, nous en dironsun peu plus sur l'agencement visuel des composants dans une fentre.Terminons la personnalisation de notre fentre avec l'introduction d'une barre des menuscontenant deux menus : "fichier" et "dition" :Programme Javaimport java.awt.*;class AppliWindow{public static void main(String [ ] arg) {Frame fen = newFrame ("Bonjour" );fen.setBounds(100,100,250,150);fen.setLayout(new FlowLayout( ));Button entree = new Button("Entrez");Checkbox bout1 = new Checkbox("Mari");Checkbox bout2 = new Checkbox("Clibataire");fen.add(entree);fen.add(bout1);fen.add(bout2);// les menus :MenuBar mbar = new MenuBar( );Menu meprinc1 = new Menu("Fichier");Menu meprinc2 = new Menu("Edition");MenuItem item1 = new MenuItem("choix n1");MenuItem item2 = new MenuItem("choix n 2");fen.setMenuBar(mbar);meprinc1.add(item1);meprinc1.add(item2);mbar.add(meprinc1);mbar.add(meprinc2);fen. setVisible ( true );}}Ci-dessous la fentre affiche par le programme prcdent :La fentre aprs que l'utilisateur clique sur le menu FichierLes fondements du langage Java - ( rv. 05.09.2004) page145Remarques sur le programme prcdent :1) Les instructionsMenuBar mbar = new MenuBar( );Menu meprinc1 = new Menu("Fichier");Menu meprinc2 = new Menu("Edition");MenuItem item1 = new MenuItem("choix n1");MenuItem item2 = new MenuItem("choix n 2");servent crer une barre de menus nomme mbar, deux menus principaux meprinc1 etmeprinc2, et enfin deux sous-menus item1 et item2 A cet instant du programme tous ces objetsexistent mais ne sont pas attachs entre eux, ont peut les considrer comme des objets "flottants".2) Dans l'instructionfen.setMenuBar(mbar);la mthode setMenuBar de la classe Frame sert attacher (inclure) la fentre fen de classeFrame, l'objet barre des menus mbar dj crcomme objet "flottant".3) Les instructionsmeprinc1.add(item1);meprinc1.add(item2);servent grce la mthode add de la classe Menu, attacher les deux objets flottants de sous-menu nommsitem1 et item2 au menu principal meprinc1.Les fondements du langage Java - ( rv. 05.09.2004) page1464) Les instructionsmbar.add(meprinc1);mbar.add(meprinc2);servent grce la mthode add de la classeMenuBar, attacher les deux objets flottants decatgorie menu principal nomms meprinc1 etmeprinc2, la barre des menus mbar.Remarquons enfin ici une application pratique du polymorphisme dynamique (redfinition)de la mthode add, elle mme surcharge plusieurs fois dans une mme classe.Composants permettant l'affichage ou la saisie :Les classes composants Fonctionjava.awt.Component|+--java.awt.LabelCration d'une tiquette permettantl'affichage d'un texte.java.awt.Component|+--java.awt.CanvasCration d'une zone rectangulaire videdans laquelle l'application peut dessiner.java.awt.Component|+--java.awt.ListCration d'une liste de chanes dontchaque lment est slectionnable.java.awt.Component|+--java.awt.TextComponent|+--java.awt.TextFieldCration d'un diteur mono ligne.java.awt.Component|+--java.awt.TextComponent|+--java.awt.TextAreaCration d'un diteur multi ligne.Ces composants s'ajoutent une fentre aprs leurs crations, afin d'tre visible sur l'crancomme les composants de Button, de CheckBox, etc...Composants d'affichage ou de saisieLes fondements du langage Java - ( rv. 05.09.2004) page147Ces composants sont rapprocher quant leurs fonctionnalits aux classes Delphi de composantstandards, nous en donnons la correspondance dans le tableau ci-dessous :Les classes Java Les classes Delphijava.awt.Label TLabeljava.awt.Canvas TCanvasjava.awt.List TListBoxjava.awt.TextField TEditjava.awt.TextArea TMemojava.awt.CheckBox TCheckBoxjava.awt.Button TButtonExemple rcapitulatif :Soit afficher une fentre principale contenant le texte "fentre principal" et deux fentres dedialogue, l'une vide directement instanci partir de la classe Dialog, l'autre contenant un texteet un bouton, instancie partir d'une classe de bote de dialogue personnalise. L'excution duprogramme produira le rsultat suivant :Nous allons construire un programme contenant deux classes, la premire servant dfinir legenre de bote personnalise que nous voulons, la seconde servira crer une bote vide et unebote personnalise et donc lancer l'application.Premire classe :La classe de dialoque personnaliseimport java.awt.*;class UnDialog extends Dialog{public UnDialog(Frame mere){super(mere,"Informations");Les fondements du langage Java - ( rv. 05.09.2004) page148Label etiq = new Label("Merci de me lire !");Button bout1 = new Button("Ok");setSize(200,100);setLayout(new FlowLayout( ));add(etiq);add(bout1);setVisible ( true );}}Explications pas pas des instructions :Cette classe UnDialog ne contient que le constructeur permettant d'instancier des objets de cetteclasse, elle drive (hrite) de la classe Dialog < class UnDialog extends Dialog >On appelle immdiatement le constructeur de la classe mre (Dialog) parl'instruction < super(mere,"Informations"); >on lui fournit comme paramtres : la Frame propritaire de la bote dedialogue et le titre de la future bote.On cre une Label ,On cre un Button .On dfinit la taille de la bote instancier On indique le mode d'affichage des composants qui y seront dposs

On ajoute la Label la future bote,On ajoute le Button La future bote devra s'afficher la fin de sa cration

Seconde classe :Une classe principale servant lancer l'application et contenant la mthode main :La classe principale contenant mainclass AppliDialogue{public static void main(String [] arg) {Frame win = new Frame("Bonjour");UnDialog dial = new UnDialog(win);Dialog dlg = new Dialog(win,"Information vide");dlg.setSize(150,70);dlg. setVisible ( true );win.setBounds(100,100,250,150);win.setLayout(new FlowLayout( ));win.add(new Label("Fentre principale."));win. setVisible ( true );}Les fondements du langage Java - ( rv. 05.09.2004) page149}Toutes les instructions de la mthode main mise part l'instruction , correspondent ce que nous avons crit plus haut en vue de la cration d'unefentre win de classe Frame dans laquelle nous ajoutons une Label et qui lance une bote dedialogue dlg :L'instruction sert instancier un objet dial de notreclasse personnalise, cet objet tant rattach la fentre win :L'instruction sert instancier un objet dlgde classe gnrale Dialog, cet objet est aussi rattach la fentre win :Le programme Java avec les 2 classesimport java.awt.*;class UnDialog extends Dialog {public UnDialog(Frame mere){super(mere,"Informations");........// instructionssetVisible ( true );}}class AppliDialogue {public static void main(String [] arg) {Frame win = new Frame("Bonjour");.......// instructionswin.setVisible ( true );}WindialdialWindlgLes fondements du langage Java - ( rv. 05.09.2004) page150}Comment grer la position d'un composant dans un conteneur de classe Container : LeLayout ManagerEn reprenant la fentre de dialogue prcdente, observons l'effet visuel produit par la prsence ounon d'un Layout Manager :La classe de dialogue sans Layout Managerimport java.awt.*;class AppliUnDialog2 extends Dialog{public AppliUnDialog2(Frame mere){super(mere,"Informations");Label etiq = new Label("Merci de me lire !");Button bout1 = new Button("Ok");setSize(200,100);//setLayout(new FlowLayout( ));add(etiq);add(bout1);setVisible ( true );}public static void main(String[] args) {Frame fen = new Frame("Bonjour");AppliUnDialog2 dlg = new AppliUnDialog2(fen);}}Voici ce que donne l'excution de ce programmeJava.En fait lorsqu'aucun Layout manager n'est spcifi,c'est par dfaut la classe du Layout qui est utilise par Java. Cette classe n'affiche qu'unseul lment en une position fixe.Nous remarquons que le bouton masque l'tiquetteen prenant toute la place.Soit les instructions d'ajout des composants dans leconstructeur public AppliUnDialog2(Frame mere)Intervertissons l'ordre d'ajout du bouton et de l'tiquette,toujours en laissant Java utiliser le pardfaut :add(etiq);add(bout1);setVisible ( true );add(bout1);add(etiq);setVisible ( true );voici l'effet visuel obtenu :Cette fois c'est l'tiquette (ajoute en dernier) qui masque le bouton !Dfinissons un autre Layout puisque celui-ci ne nous plat pas, utilisons la classe qui place les composants les uns la suite des autres de la gauche vers la droite, l'affichagevisuel continuant la ligne suivante ds que la place est insuffisante. L'instruction, assure l'utilisation du FlowLayout pour notre fentre dedialogue.Les fondements du langage Java - ( rv. 05.09.2004) page151La classe de dialogue avec FlowLayoutimport java.awt.*;class AppliUnDialog2 extends Dialog{public AppliUnDialog2(Frame mere){super(mere,"Informations");Label etiq = new Label("Merci de me lire !");Button bout1 = new Button("Ok");setSize(200,100);setLayout(new FlowLayout( ));add(etiq);add(bout1);setVisible ( true );}public static void main(String[ ] args) {Frame fen = new Frame("Bonjour");AppliUnDialog2 dlg = new AppliUnDialog2(fen);}}voici l'effet visuel obtenu :Si comme prcdemment l'on change l'ordre des instructions d'ajout du bouton et de l'tiquette :setLayout(new FlowLayout( ));add(bout1);add(etiq);on obtient l'affichage invers :D'une manire gnrale, utilisez la mthode < public void setLayout(LayoutManager mgr) >pour indiquer quel genre de positionnement automatique (cf. aide du JDK pour toutespossibilits) vous confrez au Container (ici la fentre) votre faon de grer le positionnementdes composants de la fentre. Voici titre d'information tires du JDK, les diffrentes faons depositionner un composant dans un container.hritant de LayoutManager :GridLayout, FlowLayout, ViewportLayout, ScrollPaneLayout,BasicOptionPaneUI.ButtonAreaLayout, BasicTabbedPaneUI.TabbedPaneLayout,BasicSplitPaneDivider.DividerLayout, BasicInternalFrameTitlePane.TitlePaneLayout,BasicScrollBarUI, BasicComboBoxUI.ComboBoxLayoutManager,BasicInternalFrameUI.InternalFrameLayout.hritant de LayoutManager2 :CardLayout, GridBagLayout, BorderLayout, BoxLayout, JRootPane.RootLayout,OverlayLayout, BasicSplitPaneUI.BasicHorizontalLayoutManager.Vous notez qu'il est impossible d'tre exhaustif sans devenir assommant, chacun d'utiliser lesLayout en observant leurs effets visuels.Les fondements du langage Java - ( rv. 05.09.2004) page152Il est enfin possible, si aucun des Layout ne vous convient de grer personnellement au pixelprs la position d'un composant. Il faut tout d'abord indiquer que vous ne voulez aucunLayoutmanager, puis ensuite prciser les coordonnes et la taille de votre composant.Indiquer qu'aucun Layout n'est utilis :setLayout(null); //on passe la rfrence null comme paramtre la mthode de dfinition duLayoutPrciser les coordonnes et la taille du composant avec sa mthode setBounds :public void setBounds(int x, int y, int width, int height)Exemple, les paramtres de setBounds pour un Button :Si nous voulons positionner nous mmes un composant Component comp dans la fentre, nousutiliserons la mthode add indiquant le genre de faon de ranger ce composant (LayoutManager)public void add(Component comp,Object constraints)add(checkbox1, new FlowLayout( ));ou bienadd(checkbox1, null);Nous construisons une IHM de saisie de renseignements concernant un(e) tudiant(e) :checkbox1checkbox2checkbox3textField1label1button1Les noms des objets utilissUne application fentre pas pasLes fondements du langage Java - ( rv. 05.09.2004) page153ci-aprs le code Java du programme :class AppliIHM { // classe principale//Mthode principalepublic static void main(String[] args) { // lance le programmeCadre1 fenetre = new Cadre1( );// cration d'un objet de classe Cadre1fenetre.setVisible(true);// cet objet de classe Cadre1 est rendu visible sur l'cran}}import java.awt.*; // utilisation des classes du package awtclass Cadre1 extends Frame { // la classe Cadre1 hrite de la classe des fentres FrameButton button1 = new Button( );// cration d'un objet de classe ButtonLabel label1 = new Label( );// cration d'un objet de classe LabelCheckboxGroup checkboxGroup1 = new CheckboxGroup( );// cration d'un objet groupe de checkboxCheckbox checkbox1 = new Checkbox( );// cration d'un objet de classe CheckboxCheckbox checkbox2 = new Checkbox( );// cration d'un objet de classe CheckboxCheckbox checkbox3 = new Checkbox( );// cration d'un objet de classe CheckboxTextField textField1 = new TextField( );// cration d'un objet de classe TextField//Constructeur de la fentrepublic Cadre1( ) { //Constructeur sans paramtreInitialiser( );// Appel une mthode prive de la classe}//Initialiser la fentre :private void Initialiser( ) { //Cration et positionnement de tous les composantsthis.setResizable(false); // la fentre ne peut pas tre retaille par l'utilisateurthis.setLayout(null); // pas de Layout, nous positionnons les composants nous-mmesthis.setBackground(Color.yellow); // couleur du fond de la fentrethis.setSize(348, 253); // widht et height de la fentrethis.setTitle("Bonjour - Filire C.C.Informatique"); // titre de la fentrethis.setForeground(Color.black); // couleur de premier plan de la fentrebutton1.setBounds(70, 200, 200, 30); // positionnement du boutonbutton1.setLabel("Validez votre entre !"); // titre du boutonlabel1.setBounds(24, 115, 50, 23); // positionnement de l'tiquettelabel1.setText("Entrez :"); // titre de l'tiquettecheckbox1.setBounds(20, 25, 88, 23); // positionnement du CheckBoxcheckbox1.setCheckboxGroup(checkboxGroup1); // ce CheckBox est mis dans le groupe checkboxGroup1checkbox1.setLabel("Madame");// titre du CheckBoxcheckbox2.setBounds(20, 55, 108, 23);// positionnement du CheckBoxcheckbox2.setCheckboxGroup(checkboxGroup1);// ce CheckBox est mis dans le groupe checkboxGroup1checkbox2.setLabel("Mademoiselle");// titre du CheckBoxcheckbox3.setBounds(20, 85, 88, 23);// positionnement du CheckBoxcheckbox3.setCheckboxGroup(checkboxGroup1);// ce CheckBox est mis dans le groupe checkboxGroup1checkbox3.setLabel("Monsieur");// titre du CheckBoxcheckboxGroup1.setSelectedCheckbox(checkbox1);// le CheckBox1 du groupe est coch au dparttextField1.setBackground(Color.white);// couleur du fond de l'diteur mono lignetextField1.setBounds(82, 115, 198, 23);// positionnement de l'diteur mono lignetextField1.setText("Votre nom ?");// texte de dpart de l'diteur mono lignethis.add(checkbox1);// ajout dans la fentre du CheckBoxthis.add(checkbox2);// ajout dans la fentre du CheckBoxthis.add(checkbox3);// ajout dans la fentre du CheckBoxthis.add(button1);// ajout dans la fentre du boutonthis.add(textField1);// ajout dans la fentre de l'diteur mono lignethis.add(label1);// ajout dans la fentre de l'tiquette}}Maintenant que nous avons construit la partie affichage de l'IHM, il serait bon qu'elle interagisseLes fondements du langage Java - ( rv. 05.09.2004) page154avec l'utilisateur, par exemple travers des messages comme les vnements de souris ou biend'appui de touches de claviers. Nous allons voir comment Java rgle la gestion des changes demessages entre le systme et votre application.Rappelons ce que nous connaissons de la programmation par vnements (cf.package chap.5.2)Principes de la programmation par vnementsLa programmation vnementielle :Logique selon laquelle un programme est construit avec des objets et leursproprits et daprs laquelle seules les interventions de lutilisateur sur lesobjets du programme dclenchent lexcution des routines associes.Avec des systmes multi-tches premptifs sur micro-ordinateur , le systme dexploitationpasse lessentiel de son " temps " attendre une action de lutilisateur (vnement). Cetteaction dclenche un message que le systme traite et envoie ventuellement une applicationdonne.Nous pourrons construire un logiciel qui ragira sur les interventions de lutilisateur si nousarrivons rcuprer dans notre application les messages que le systme envoie. Nous avons djutilis lenvironnement Delphi de Borland, et Visual Basic de Microsoft, Java autorise aussi laconsultation de tels messages.- Lapproche vnementielle intervient principalement dans linterface entre lelogiciel et lutilisateur, mais aussi dans la liaison dynamique du logiciel avecle systme, et enfin dans la scurit.- Lapproche visuelle nous aide et simplifie notre tche dans la construction dudialogue homme-machine.La combinaison de ces deux approches produit un logiciel habill et adapt ausystme dexploitation.Il est possible de relier certains objets entre eux par des relations vnementielles. Nous lesreprsenterons par un graphe (structure classique utilise pour reprsenter des relations).Les vnementsLes fondements du langage Java - ( rv. 05.09.2004) page155Modle de dlgation de l'vnement en JavaEn Java, le traitement et le transport des messages associs aux vnements sont assurs pardeux objets dans le cadre d'un modle de communication dnomm le modle de traitement desvnements par dlgation (Delegation Event Model) :Le message est envoy par une source ou dclencheur de l'vnement qui sera un composantJava, un rcepteur ou couteur de l'vnement qui est charg de grer l'vnement, ce seraun objet de la classe des couteurs instanci et ajout au composant :La mthode de programmation de l'interception des vnements est nettement plus lourdesyntaxiquement en Java qu'en Delphi et en Visual Basic, mais elle est permet beaucoup plus dechoix et elle est entirement objet. Ce sont des classes abstraites dont le nom gnralement setermine par Listener. Chacune de ces classes tend la classe abstraite d'interface EventListener.Toutes ces classes d'couteurs d'vnements sont situes dans le package java.awt.event, ellesse chargent de fournir les mthodes adquates aux traitements d'vnements envoys par undclencheur.Voici la liste des interfaces d'couteurs d'vnements extraite du JDK 1.4.2Action, ActionListener, AdjustmentListener, AncestorListener, AWTEventListener,BeanContextMembershipListener, BeanContextServiceRevokedListener, BeanContextServices,BeanContextServicesListener, CaretListener, CellEditorListener, ChangeListener,ComponentListener, ContainerListener, DocumentListener, DragGestureListener,DragSourceListener, DropTargetListener, FocusListener, HyperlinkListener,InputMethodListener, InternalFrameListener, ItemListener, KeyListener, ListDataListener,ListSelectionListener, MenuDragMouseListener, MenuKeyListener, MenuListener,MouseInputListener, MouseListener, MouseMotionListener, PopupMenuListener,PropertyChangeListener, TableColumnModelListener, TableModelListener, TextListener,TreeExpansionListener, TreeModelListener, TreeSelectionListener, TreeWillExpandListener,UndoableEditListener, VetoableChangeListener, WindowListener.Les vnements possibles dans Java sont des objets (un vnement est un message contenantplusieurs informations sur les tats des touches de clavier, des paramtres,...) dont les classessont dans le package java.awt.event.Voici quelques classes gnrales d'vnements possibles tires du JDK 1.4.2:ActionEvent, AdjustmentEvent, AncestorEvent, ComponentEvent, InputMethodEvent,InternalFrameEvent, InvocationEvent, ItemEvent, TextEvent.Les fondements du langage Java - ( rv. 05.09.2004) page156Supposons avoir dfini le bouton : Button bouton = new Button("Entrez");Il nous faut choisir une classe d'couteur afin de traiter l'vnement click de souris. Pourintercepter un click de souris nous disposons de plusieurs moyens, c'est ce qui risque de drouterle dbutant. Nous pouvons en fait l'intercepter deux niveaux.Interception de bas niveau :Les classes prcdentes se drivent en de nombreuses autres sous-classes. Par exemple, la classeMouseEvent qui encapsule tous les vnements de souris de bas niveau, drive de la classeComponentEvent :+--java.awt.event.ComponentEvent|+--java.awt.event.InputEvent|+--java.awt.event.MouseEventNous pourrons par exemple, choisir l'interface MouseListener (abstraite donc non instanciable,mais implmentable) dont la fonction est d'intercepter (couter) les vnements de souris (press,release, click, enter, et exit).Il existe une classe abstraite implmentant l'interface MouseListener qui permet d'instancier descouteurs de souris, c'est la classe des MouseAdapter.Dans ce cas il suffit de redfinir la mthode de la classe MouseAdapter qui est charged'intercepter et de traiter l'vnement qui nous intresse (cet vnement lui est pass enparamtre):Mthode redfinir Action dclenchant l'vnementvoid mouseClicked(MouseEvent e)invoque lorsqu'il y a eu un click de sourissur le composant.void mouseEntered(MouseEvent e)invoque lorsque la souris entre dans lerectangle visuel du composant.Intercepter un click de souris sur un boutonLes fondements du langage Java - ( rv. 05.09.2004) page157void mouseExited(MouseEvent e)invoque lorsque la souris sort du rectanglevisuel du composant.void mousePressed(MouseEvent e)invoque lorsqu'un des boutons de la sourisa t appuy sur le composant.void mouseReleased(MouseEvent e)invoque lorsqu'un des boutons de la sourisa t relch sur le composant.L'vnement est pass en paramtre de la mthode : mouseClicked(MouseEvent e)Construire une classe InterceptClick hritant de laclasse abstraite MouseAdapter et redfinir lamthode mouseClicked :class InterceptClick extends MouseAdapter{public void mouseClicked(MouseEvent e){ //.... actions excuter.}}Ensuite nous devons instancier un objet couteurde cette classe InterceptClick :InterceptClick clickdeSouris = new InterceptClick( );Enfin nous devons ajouter cet couteur l'objetbouton :bouton.addMouseListener(clickdeSouris);Dmarche pratique pour grer le click du boutonLes fondements du langage Java - ( rv. 05.09.2004) page158Les tapes 2 et 3 peuvent tre recombines en une seule tape:bouton.addMouseListener( new InterceptClick( ) );Remarque :Afin de simplifier encore plus l'criture du code, Java permet d'utiliser ici une classeanonyme (classe locale sans nom) comme paramtre effectif de la mthode addMouseListener.On ne dclare pas de nouvelle classe implmentant la classe abstraite MouseAdapter, mais on ladfinie anonymement l'intrieur de l'appel au constructeur.Les tapes 1, 2 et 3 peuvent tre alors recombines en une seule, nous comparons ci-dessousl'criture avec une classe anonyme:Classe anonyme Classe drive de MouseAdapterMthode xxx :bouton.addMouseListener ( new MouseAdapter( ) {public void mouseClicked(MouseEvent e){//.... actions excuter.}} );la rfrence l'objet d'couteur n'est pas accessible.class InterceptClick extends MouseAdapter{public void mouseClicked(MouseEvent e){ //.... actions excuter.}}Mthode xxx :InterceptClick clickdeSouris = new InterceptClick( );bouton.addMouseListener(clickdeSouris);La classe anonyme est recommande lorsque la rfrence l'objet d'couteur n'est pas utile. On se trouve dans le cassemblabe Delphi o l'couteur est l'objet de bouton lui-mme.Interception de haut niveau ou smantique :Sun a divis d'une faon trs artificielle les vnements en deux catgories : les vnements debas niveau et les vnements smantiques : Les vnement de bas niveau reprsentent desvnements systme de gestion de fentre de priphrique, souris, clavier et les entres de basniveau, tout le reste est vnement smantique.Toutefois, Java considre qu'un click de souris sur un bouton qui est une action particulire debas niveau, est aussi une action smantique du bouton.Il existe une classe d'vnement gnrique qui dcrit tous les autres vnements dont le casparticulier du click de souris sur un bouton, c'est la classe java.awt.event.ActionEvent. Unvnement est donc un objet instanci de la classe ActionEvent, cet vnement gnrique estpass des couteurs gnriques de l'interface ActionListener, travers l'ajout de l'couteur aucomposant par la mthode addActionListener.Les fondements du langage Java - ( rv. 05.09.2004) page159Nous allons donc reprendre la programmation de notre objet bouton de la classe des Button aveccette fois-ci un couteur de plus haut niveau : un objet construit partir d'implementation del'interface ActionListener.L'interface ActionListener, n'a aucun attribut et ne possde qu'une seule mthode redfinir ettraitant l'vnement ActionEvent :la Mthode redfinir Action dclenchant l'vnementpublic void actionPerformed ( ActionEvent e ) Toute action possible sur le composant.Nous pouvons comme dans le traitement par un vnement de bas niveau, dcomposer les lignesde code en crant une classe implmentant la classe abstraite des ActionListener, ou bien crerune classe anonyme. La dmarche tant identique l'interception de bas niveau, nous livronsdirectement ci-dessous les deux programmes Java quivalents :Version avec une classe implmentantActionListenerVersion avec une classe anonymeimport java.awt.*;import java.awt.event.*;class EventHigh implements ActionListener{ public void actionPerformed(ActionEvent e){ //.... actions excuter.}}class ApplicationEventHigh{public static void main(String [ ] arg){ ....Button bouton = new Button("Entrez");bouton.addActionListener(newEventHigh( ));.... }}import java.awt.*;import java.awt.event.*;class ApplicationEventHigh{public static void main(String [ ] arg){ ....Button bouton = new Button("Entrez");bouton.addActionListener(new EventHigh( ){public void actionPerformed (ActionEvent e){//.... actions excuter.}} );....}}Nous voyons sur ce simple exemple, qu'il est impossible d'tre exhaustif tellement les casparticuliers foisonnent en Java, aussi allons nous programmer quelques interceptionsd'vnements correspondant des situations classiques. Les volutions sont nombreuses depuisla version 1.0 du JDK et donc seuls les principes sont essentiellement retenir dans notreapproche.En outre, tous les objets de composants ne sont pas ractifs l'ensemble de tous les vnementsexistants, ce qui ncessite la connaissance des relations possibles pour chaque composant. Cetapprentissage est facilit par des outils qui classifient les vnements par objet et engendrent lesquelette du code du traitement effectuer pour ch