polyjava

Upload: metalnouh-nouh

Post on 06-Jul-2015

79 views

Category:

Documents


0 download

TRANSCRIPT

Universit de la Mditerrane e e e Facult des Sciences de Luminy e

Le langage JavaMaster CCI, MINT, I2A, BBSG, etc.

Henri Garreta Dpartement dInformatique LIF e

2

c H. Garreta, 2000-2010

` TABLE DES MATIERES

` TABLE DES MATIERES

Le langage JavaHenri GarretaUniversit de la Mditerrane, Facult des Sciences de Luminy e e e e Table des mati`res e1 Introduction 1.1 Pratique eective de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Considrations lexicales e 2.1 Jeu de caract`res . . . e 2.2 Commentaires . . . . . 2.3 Identicateurs . . . . . 2.4 Constantes littrales . e 7 7 8 8 8 8 9 10 10 10 11 11 12 12 12 12 13 13 14 15 16 17 18 20 21 21 22

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

3 Types 3.1 Les types de donnes de Java . . . . . . . . . . . . . . . . . e 3.2 Conversions entre types primitifs . . . . . . . . . . . . . . . 3.3 Rfrences . . . . . . . . . . . . . . . . . . . . . . . . . . . . ee 3.3.1 Smantique des valeurs et smantique des rfrences e e ee 3.3.2 Rfrence sur rien . . . . . . . . . . . . . . . . . . ee 3.3.3 Cas des param`tres des mthodes . . . . . . . . . . . e e 3.4 Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.1 Dclaration et initialisation . . . . . . . . . . . . . . e 3.4.2 Acc`s aux lments . . . . . . . . . . . . . . . . . . . e ee 3.4.3 Tableaux ` plusieurs indices . . . . . . . . . . . . . . a 3.4.4 Tableaux initialiss et tableaux anonymes. . . . . . . e 3.5 Conversions entre types tableaux ou classes . . . . . . . . . 3.6 Copie et comparaison des objets . . . . . . . . . . . . . . . 3.6.1 Copie . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6.2 Dnir la mthode clone . . . . . . . . . . . . . . . e e 3.6.3 Comparaison . . . . . . . . . . . . . . . . . . . . . . 3.7 Cha nes de caract`res . . . . . . . . . . . . . . . . . . . . . e 3.7.1 Les classes String et StringBuffer . . . . . . . . . 3.7.2 Copie et comparaison des cha nes . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

4 Expressions et instructions 23 4.1 Rupture tiquete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 e ec H. Garreta, 2000-2010

3

` TABLE DES MATIERES

` TABLE DES MATIERES

5 Classes, paquets, chiers et rpertoires e 5.1 Paquets et classes . . . . . . . . . . . . . . . . . . . . . 5.1.1 Les noms des paquets et linstruction package 5.1.2 Les noms des classes et linstruction import . . 5.2 Classes, chiers et rpertoires . . . . . . . . . . . . . . e 5.2.1 Classes publiques et non publiques . . . . . . . 5.2.2 Point dentre dun programme. . . . . . . . . e 5.2.3 O` placer les chiers des classes ? . . . . . . . . u 5.2.4 Comment distribuer une application Java ? . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

24 24 24 24 25 25 25 26 27 28 28 28 28 29 30 32 33 33 33 34 35 36 37 37 38 38 39 40 40 41 41 42 42 42 43 44 45 46 46 48 50 51 51 52 52 56 56 57 57 57 59 61 61 61 62 63 64

6 Les objets 6.1 Introduction : les langages orients objets . . . . . . . . . . . . . . e 6.2 Classes, variables et mthodes . . . . . . . . . . . . . . . . . . . . . . e 6.2.1 Dclaration des classes et des objets, instanciation des classes e 6.2.2 Instances et membres dinstance . . . . . . . . . . . . . . . . 6.2.3 Membres de classe (membres statiques) . . . . . . . . . . . . 6.3 Surcharge des noms . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4 Contrle de laccessibilit . . . . . . . . . . . . . . . . . . . . . . . . o e 6.4.1 Membres privs, protgs, publics . . . . . . . . . . . . . . . e e e 6.4.2 Lencapsulation . . . . . . . . . . . . . . . . . . . . . . . . 6.5 Initialisation des objets . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.1 Constructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.2 Membres constants (final) . . . . . . . . . . . . . . . . . . . 6.5.3 Blocs dinitialisation statiques . . . . . . . . . . . . . . . . . . 6.5.4 Destruction des objets . . . . . . . . . . . . . . . . . . . . . . 6.6 Classes internes et anonymes . . . . . . . . . . . . . . . . . . . . . . 6.6.1 Classes internes . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.2 Classes anonymes . . . . . . . . . . . . . . . . . . . . . . . . . 7 Hritage e 7.1 Introduction : raner, abstraire . . . . . . . 7.2 Sous-classes et super-classes . . . . . . . . . . . 7.2.1 Dnition de sous-classe . . . . . . . . . e 7.2.2 Larbre de toutes les classes . . . . . 7.3 Rednition des mthodes . . . . . . . . . . . . e e 7.3.1 Surcharge et masquage . . . . . . . . . . 7.3.2 Rednition des mthodes . . . . . . . . e e 7.4 Hritage et constructeurs . . . . . . . . . . . . e 7.5 Membres protgs . . . . . . . . . . . . . . . . e e 7.6 Le polymorphisme . . . . . . . . . . . . . . . 7.6.1 Gnralisation et particularisation . . . e e 7.6.2 Les mthodes rednies sont virtuelles e e 7.6.3 Mthodes et classes nales . . . . . . . . e 7.7 Abstraction . . . . . . . . . . . . . . . . . . . 7.7.1 Mthodes abstraites . . . . . . . . . . . e 7.7.2 Classes abstraites . . . . . . . . . . . . . 7.7.3 Interfaces . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

8 Exceptions 8.1 Interception des exceptions . . . . . . . . . . . . . . . . . . 8.2 Lancement des exceptions . . . . . . . . . . . . . . . . . . . 8.2.1 Hirarchie des exceptions . . . . . . . . . . . . . . . e 8.2.2 Dclaration des exceptions lances par une mthode e e e 8.3 Assert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Quelques classes utiles 9.1 Nombres et outils mathmatiques . . . . . . . e 9.1.1 Classes-enveloppes des types primitifs 9.1.2 Fonctions mathmatiques . . . . . . . e 9.1.3 Nombres en prcision innie . . . . . . e 9.2 Collections et algorithmes . . . . . . . . . . . 4

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

c H. Garreta, 2000-2010

` TABLE DES MATIERES

` TABLE DES MATIERES

9.3 9.4

9.5

9.2.1 Collections et tables associatives . 9.2.2 Itrateurs . . . . . . . . . . . . . . e 9.2.3 Quelques mthodes des collections e 9.2.4 Algorithmes pour les collections . . 9.2.5 Algorithmes pour les tableaux . . . Rexion et manipulation des types . . . e Entres-sorties . . . . . . . . . . . . . . . e 9.4.1 Les classes de ux . . . . . . . . . 9.4.2 Exemples . . . . . . . . . . . . . . 9.4.3 Analyse lexicale . . . . . . . . . . . 9.4.4 Mise en forme de donnes . . . . . e 9.4.5 Reprsentation des dates . . . . . e 9.4.6 La srialisation . . . . . . . . . . . e Expressions rguli`res . . . . . . . . . . . e e 9.5.1 Principe . . . . . . . . . . . . . . . 9.5.2 Exemples . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

64 68 69 70 72 73 75 75 78 81 83 86 87 89 89 89 93 93 93 95 95 96 97 99 99 100 102 104 105 106 108 109 113 114 114 115 117 118 119 120 121 121 122 122 124 124 124 125 127 130 132 133 135 136 137 142 143 144 146 5

10 Threads 10.1 Cration et cycle de vie dun thread . . . . . . . . . e 10.1.1 Dclaration, cration et lancement de threads e e 10.1.2 Terminaison dun thread . . . . . . . . . . . . 10.2 Synchronisation . . . . . . . . . . . . . . . . . . . . . 10.2.1 Sections critiques . . . . . . . . . . . . . . . . 10.2.2 Mthodes synchronises . . . . . . . . . . . . e e

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

11 Interfaces graphiques 11.1 JFC = AWT + Swing . . . . . . . . . . . . . . . . . . . . . 11.2 Le haut de la hirarchie . . . . . . . . . . . . . . . . . . . . . e 11.3 Le point de dpart : JFrame et une application minimale. . . e 11.4 Le thread de gestion des vnements . . . . . . . . . . . . . . e e e 11.5 Evnements . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.5.1 Exemple : dtecter les clics de la souris. . . . . . . . . e 11.5.2 Adaptateurs et classes anonymes . . . . . . . . . . . . 11.5.3 Principaux types dvnements . . . . . . . . . . . . . e e 11.5.4 Exemple : fermeture prudente du cadre principal . . 11.6 Peindre et repeindre . . . . . . . . . . . . . . . . . . . . . . . 11.6.1 La mthode paint . . . . . . . . . . . . . . . . . . . . e 11.6.2 Les classes Graphics et Graphics2D . . . . . . . . . . 11.6.3 Exemple : la mauvaise mani`re de dessiner . . . . . . e 11.6.4 Exemple : la bonne mani`re de dessiner. . . . . . . . . e 11.7 Gestionnaires de disposition . . . . . . . . . . . . . . . . . . . 11.7.1 FlowLayout . . . . . . . . . . . . . . . . . . . . . . . . 11.7.2 BorderLayout . . . . . . . . . . . . . . . . . . . . . . 11.7.3 GridLayout . . . . . . . . . . . . . . . . . . . . . . . . 11.7.4 GridBagLayout . . . . . . . . . . . . . . . . . . . . . . 11.7.5 Exemple : un panneau muni dun GridBagLayout . . 11.7.6 Exemple : imbrication de gestionnaires de disposition 11.7.7 Bordures . . . . . . . . . . . . . . . . . . . . . . . . . 11.8 Composants prdnis . . . . . . . . . . . . . . . . . . . . . . e e 11.8.1 Exemple : mise en place et emploi de menus . . . . . . 11.8.2 Exemple : construire une boite de dialogue . . . . . . 11.8.3 Exemple : saisie de donnes . . . . . . . . . . . . . . . e 11.8.4 Exemple : choisir un chier . . . . . . . . . . . . . . . 11.8.5 Exemple : une table pour acher des donnes . . . . . e 11.8.6 Exemple : slection et modication dans une table . . e 11.9 Le mod`le MVC (Mod`le-Vue-Controleur) . . . . . . . . . . . e e 11.9.1 Exemple : les vues arborescentes (JTree) . . . . . . . 11.10Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.10.1 Exemple : utiliser des icnes . . . . . . . . . . . . . . . o 11.10.2 Exemple : charger une image depuis un chier . . . . 11.10.3 Exemple : construire une image pixel par pixel . . . .c H. Garreta, 2000-2010

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

` TABLE DES MATIERES

` TABLE DES MATIERES

12 Java 5 12.1 Types numrs . . . . . . . . . . . . . . . . . . . . . . . . . . . e ee 12.1.1 Enums . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.1.2 Mthodes des types numrs . . . . . . . . . . . . . . . e e ee 12.1.3 Aiguillages commands par des types numrs . . . . . e e ee 12.1.4 Dictionnaires et ensembles bass sur des types numrs e e ee 12.2 Emballage et dballage automatiques . . . . . . . . . . . . . . . e 12.2.1 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.2 Oprations drives et autres consquences . . . . . . . e e e e 12.2.3 La rsolution de la surcharge en Java 5 . . . . . . . . . e 12.3 Quelques outils pour simplier la vie du programmeur . . . . . 12.3.1 Importation de membres statiques . . . . . . . . . . . . 12.3.2 Boucle for amliore . . . . . . . . . . . . . . . . . . . . e e 12.3.3 Mthodes avec une liste variable darguments . . . . . . e 12.3.4 Entres-sorties simplies : printf et Scanner . . . . . e e 12.4 Annotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4.1 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4.2 Exploitation des annotations . . . . . . . . . . . . . . . 12.4.3 Annotations prdnies . . . . . . . . . . . . . . . . . . e e 12.4.4 Mta-annotations . . . . . . . . . . . . . . . . . . . . . . e 12.5 Gnricit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e e e 12.5.1 Classes et types paramtrs . . . . . . . . . . . . . . . . e e 12.5.2 Types bruts . . . . . . . . . . . . . . . . . . . . . . . . . 12.5.3 Types paramtrs et jokers . . . . . . . . . . . . . . . . e e 12.5.4 Limitations de la gnricit . . . . . . . . . . . . . . . . e e e 12.5.5 Mthodes gnriques . . . . . . . . . . . . . . . . . . . . e e e Index

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

148 148 148 149 150 150 151 151 152 153 154 154 155 157 158 160 160 162 163 163 164 165 167 167 169 170 172

Ce poly est en chantier, cest son tat normal. e Ceci est la version du 15 fvrier 2010 (premi`re publication janvier 2000). e e

[email protected]

La derni`re version de ce document est ` ladresse e a http://www.dil.univ-mrs.fr/~garreta/Polys/PolyJava.pdf

6

c H. Garreta, 2000-2010

1

INTRODUCTION

1

Introduction

Ce polycopi est le support de plusieurs cours de Java donns ` la Facult des Sciences de Luminy. Tr`s e e a e e succinct, il ne remplace pas la consultation douvrages plus approfondis et illustrs, parmi lesquels : e pour dbuter : e Patrick Niemeyer & Jonathan Knudsen Introduction ` Java, 2 eme dition a e OReilly, 2002 deuxi`me lecture : e Ian Darwin Java en action OReilly, 2002

Ce texte sadresse ` des lecteurs connaissant le langage C. De nombreux lments importants de Java, a ee comme les expressions, les instructions, lappel des fonctions, etc., ne sont pas expliqus ici, tout simplement e parce quils sont raliss en Java comme en C. En outre, lexpos nest pas progressif : chaque notion est e e e introduite comme si les autres concepts du langage avaient dj` t traits. Cela rend la lecture initiale de eaee e ce document plus prouvante, mais la consultation ultrieure plus ecace. e e Ces notes traitent de la version courante de la plate-forme Java (le langage et ses biblioth`ques ocielles) e et de son environnement de dveloppement, appels dsormais respectivement JavaTM Platform Standard e e e Edition 6 et JavaTM SE Development Kit 6 (le numro de version 1.6.x appara parfois ` la place de 6). e t a Cependant, pour la clart des ides, nous avons introduit la plupart des lments comme il convenait de le faire e e ee a e ` lpoque de Java 1.4 (par exemple, lhritage et le polymorphisme sont dabord expliqus sans mentionner e e ni la gnricit ni lemballage automatique). Les principales nouveauts introduites lors du passage de Java e e e e 1.4 ` Java 5 sont prsentes ` la section 12. a e e a Un document est rigoureusement indispensable pour programmer en Java : la documentation en ligne de lAPI (Interface du Programmeur dApplications). Cest un chier hypertexte qui contient tout ce quil faut savoir ` propos de tous les paquets, interfaces, classes, variables et mthodes de la plate-forme Java. On peut a e le consulter en ligne et le tlcharger ` ladresse http://java.sun.com/javase/6/docs/api/ ee a Enn, un excellent document pour apprendre Java est le tutoriel ociel, quon peut consulter en ligne ou tlcharger ` ladresse http://java.sun.com/tutorial/ ee a

1.1

Pratique eective de Java

Dans cette section nous supposons que vous travaillez sur un syst`me Windows, Linux, Solaris ou e Mac OS X. Certains des produits mentionns ici ont galement des versions pour des syst`mes plus cone e e dentiels. Pour pratiquer le langage Java, cest-`-dire pour saisir, compiler et excuter vos programmes, il vous faut a e un environnement de dveloppement Java, comportant un compilateur, une machine Java et des biblioth`ques e e au moins la biblioth`que standard. Vous obtenez tout cela en installant le JDK (Java Development Kit), e que vous pouvez tlcharger gratuitement depuis le site de Sun, ` ladresse http://java.sun.com/javase/ ee a downloads. Vous pouvez utiliser nimporte quel diteur de textes pour saisir vos programmes. Supposons que vous e ayez tap le texte de la cl`bre classe Bonjour : e ee public class Bonjour { public static void main(String[] args) { System.out.println("Bonjour ` tous!"); a } } Le chier dans lequel vous avez enregistr ce texte doit sappeler Bonjour.java. Vous en obtenez la e compilation en tapant la commande javac Bonjour.java Si le programme est correct, la compilation se droule sans produire aucun message. Vous lancez alors e lexcution de votre programme (pour obtenir lachage du texte Bonjour ` tous ! ) en tapant la commande e a java Bonjour Notez bien qu` la commande javac on donne un nom de chier (Bonjour.java), tandis qu` la commande a a java on doit donner un nom de classe (Bonjour ). Quel que soit le syst`me dexploitation que vous utilisez, vous pouvez vous constituer un environnement e de travail plus agrable en installant le JDK puis un petit diteur de textes orient Java. Vous en trouverez e e e plusieurs sur le web, par exemple Jext, ` ladresse http://www.jext.org/. ac H. Garreta, 2000-2010

7

2

CONSIDERATIONS LEXICALES

Vous obtenez un confort incomparablement suprieur si, apr`s JDK, vous installez Eclipse, un puise e sant IDE (environnement de dveloppement intgr) avec de nombreuses fonctionnalits pour aider ` la e e e e a programmation en Java, telles que la compltion automatique des expressions tapes, la compilation au fur e e et ` mesure de la frappe, la suggestion de la mani`re de corriger les erreurs, etc. Vous pouvez librement a e tlcharger Eclipse ` ladresse http://www.eclipse.org/ ee a Enn, si vous voulez programmer des interfaces graphiques rien quen jouant de la souris 1 vous pouvez gratuitement installer NetBeans de Sun (http://www.netbeans.org/) ou JBuilder Foundation de Borland (http://www.borland.fr/jbuilder/).

22.1

Considrations lexicales eJeu de caract`res e

Java utilise le codage des caract`res UTF-16, une implmentation de la norme Unicode, dans laquelle e e chaque caract`re est reprsent par un entier de 16 bits, ce qui ore 65 536 possibilits au lieu des 128 (ASCII) e e e e ou 256 (Latin-1) imposs par dautres langages de programmation. Il y a donc de la place pour la plupart e des alphabets nationaux ; en particulier, tous les caract`res franais y sont reprsents sans crer de conit e c e e e avec des caract`res dautres langues. e Cela vaut pour les donnes manipules par les programmes (caract`res et cha e e e nes) et aussi pour les programmes eux-mmes. Il est donc possible en Java de donner aux variables et aux mthodes des noms e e accentus. Mais on ne vous conseille pas dutiliser cette possibilit, car vous ntes jamais ` labri de devoir e e e a un jour consulter ou modier votre programme ` laide dun diteur de textes qui ne supporte pas les accents. a e

2.2

Commentairesint nbLignes; // nombre de variables du syst`me e

Il y a trois sortes de commentaires. Dabord, un texte compris entre // et la n de la ligne :

Ensuite, un texte compris entre /* et */, qui peut stendre sur plusieurs lignes : e /* Recherche de lindice ik du "pivot maximum" c.-`-d. tel que k de C). Puisque les objets a e sont toujours accds par rfrence, une expression comme e e ee5. Comme dans tous les langages qui ont la notion daectation, il y a une exception : place au membre gauche dune e aectation, une expression ne reprsente pas une valeur mais un emplacement de la mmoire. e e 6. Plus prcisment, les rfrences sont des renvois a la heap, cest-`-dire la partie de la mmoire dans laquelle se font les e e ee ` a e allocations dynamiques (par new, le moyen de crer un tableau ou un objet). e 7. Attention, abus de langage ! Imaginer un pointeur est sans doute une bonne mani`re dapprhender une rfrence, mais il e e ee ne faut pas oublier quen Java on sinterdit de parler de pointeurs, car le programmeur nest pas cens conna e tre les dtails du e procd par lequel Java dsigne de mani`re interne les objets quil cre dans la mmoire. e e e e e e

c H. Garreta, 2000-2010

11

3.4

Tableaux

3

TYPES

unPoint.x est sans ambigu e ; elle signie : le champ x de lobjet rfrenc par unPoint. t ee e 3.3.2 Rfrence sur rien ee

La valeur particuli`re null indique quune variable dun type rfrence nest pas une rfrence ` un objet e ee ee a valide. Cest la valeur quil convient de donner ` une telle variable lorsque lobjet rfrenc nexiste pas a ee e encore, ou bien lorsque la variable a cess dtre utile en tant que rfrence sur un objet : e e ee Point unPoint = null; // ... // unPoint = new Point(10, 20); ... // unPoint = null; ... // dclaration et initialisation de unPoint e ici, unPoint ne reprsente pas un objet valide e ici on peut travailler avec lobjet unPoint a ` nouveau, unPoint nest pas un objet valide

Le compilateur se charge dinitialiser ` null les variables dinstance et de classe dun type objet qui nont a pas dinitialisation explicite. Les variables locales ne sont pas initialises 8 . e 3.3.3 Cas des param`tres des mthodes e e

Les explications prcdentes sont valables pour toutes sortes dexpressions, quels que soient les contextes e e o` elles apparaissent (sauf les membres gauches des aectations, qui chappent ` cette discussion). Cela vaut u e a en particulier pour les param`tres eectifs des appels des mthodes ; par consquent : e e e un param`tre dun type primitif est pass par valeur : lors de lappel de la mthode, la valeur du e e e param`tre eectif est copie dans le param`tre formel correspondant, qui est une variable locale de la e e e mthode ; en particulier, si un tel param`tre eectif est une variable, lappel de la mthode ne pourra e e e pas en changer la valeur, quoi quelle fasse au param`tre formel correspondant ; e un param`tre dun type tableau ou classe est pass par rfrence 9 : lors de lappel de la mthode, le e e ee e param`tre formel est initialis avec une rfrence sur le tableau ou lobjet que reprsente le param`tre e e ee e e eectif ; il en dcoule que le tableau ou lobjet en question pourra tre rellement modi par les actions e e e e que la mthode fera sur le param`tre formel. e e

3.43.4.1

TableauxDclaration et initialisation e

Tous les tableaux utiliss en Java sont des tableaux dynamiques. Cela veut dire que le nombre dlments : e ee nest pas un lment constitutif du type du tableau et na pas besoin dappara dans sa dclaration, ee tre e nest pris en compte quau moment de lexcution du programme, mme sil est connu pendant la e e compilation. Il y a deux syntaxes rigoureusement quivalentes pour dclarer un tableau tab dont les lments sont, e e ee par exemple, des int : int tab[]; et int[] tab; // tab dsigne un tableau de int e Dans lun et lautre cas, la variable tab ainsi dclare est une rfrence et, pour le moment, elle ne e e ee rfrence rien. Si les expressions prcdentes sont la dclaration dune variable dinstance ou de classe, tab ee e e e aura t initialise avec la valeur null. Sil sagit de la dclaration dune variable locale, tab est indtermine ee e e e e et il aurait probablement t plus sage de la complter par une initialisation explicite, comme : ee e int[] tab = null; // tab dsigne un tableau de int e // tab dsigne un tableau de int e

Le tableau lui-mme commence eectivement ` exister lors de lappel de loprateur new : e a e tab = new int[nombreDeComposantes];8. Les variables locales ne sont pas initialises mais toute utilisation dune variable locale susceptible de ne pas avoir t e e e initialise est dtecte par le compilateur et signale comme une erreur. e e e e 9. En toute rigueur on peut dire que le passage dun objet ou dun tableau comme param`tre dune mthode se traduit par e e le passage par valeur de la rfrence ` lobjet ou au tableau en question. ee a

12

c H. Garreta, 2000-2010

3

TYPES

3.4

Tableaux

o` nombreDeComposantes est une expression, dun type entier, qui dnit la taille du tableau. u e Note. On peut joindre dans la mme expression la dclaration de la variable et la cration du tableau e e e correspondant : int[] tab = new int[nombreDeComposantes]; cela est plus commode, car il y a moins de choses ` crire, et plus able, car on limine la priode pendant ae e e laquelle la variable existe sans rfrencer un tableau. En gnral cest faisable, car Java permet dcrire les ee e e e dclarations l` o` on veut. e a u 3.4.2 Acc`s aux lments e ee

Une fois le tableau cr, on acc`de ` ses composantes en utilisant la mme notation quen C : ee e a e tab[i ] o` i est une expression de type entier 10 . Pour que lexpression ci-dessus soit lgitime il faut et il sut que u e 0 i < nombreDeComposantes. Autrement dit, les lments du tableau prcdent sont ee e e t[0], t[1], ... t[nombreDeComposantes1] Le schma de la gure 2 est la bonne mani`re de se reprsenter lacc`s tab[i ] : e e e e

+i ... tab tab[0] tab[i] tab[N-1]

Figure 2 Un tableau de N lments ee Taille effective dun tableau. Lexpression unTableau.length permet de conna le nombre dltre ee ments dun tableau. Cela est bien utile pour crire des traitements de tableaux dont la taille est inaccessible e lors de la compilation. Par exemple, le programme suivant ache les arguments crits sur la ligne de come mande (` la suite des deux mots java ArgumentsLigneCommande) quel que soit leur nombre : a class ArgumentsLigneCommande { public static void main(String[] args) { for (int i = 0; i < args.length; i++) System.out.println(args[i]); } } Controle de lindice. Lors de lacc`s ` un lment dun tableau, Java contrle toujours la validit de e a ee o e lindice. Autrement dit, lors de lvaluation dune expression comme tab[i] les deux erreurs possibles les e plus frquentes sont dtectes et dclenchent une exception : e e e e NullPointerException, pour indiquer que tab = null, cest-`-dire que la variable tab nest pas a une rfrence valide (en clair, le plus souvent : la variable tab a bien t dclare, mais le tableau ee ee e e correspondant na pas encore t cr), e e ee ArrayIndexOutOfBoundsException, pour indiquer que la condition 0 i < tab.length nest pas satisfaite. 3.4.3 Tableaux ` plusieurs indices a

Les tableaux ` plusieurs indices sont dynamiques eux aussi. A titre dexemple, examinons le cas des a matrices (tableaux ` deux indices). Les dclarations suivantes sont tout ` fait quivalentes : a e a e int mat[][]; int[] mat[]; int[][] mat; // mat dsigne un tableau de int ` deux indices e a // " " " " " " // " " " " " "

Ces trois expressions introduisent mat comme une variable de type tableau ` deux indices de int. On a peut les lire mat est un tableau-`-un-indice de tableaux-`-un-indice de int . Aucun tableau nexiste pour a a le moment ; selon le contexte, la valeur de mat est soit null, soit indtermine. e e La matrice commence ` exister lorsquon appelle loprateur new. Par exemple, de la mani`re suivante : a e e10. Ne pas oublier quune expression de type char est toujours spontanment convertible dans le type int. e

c H. Garreta, 2000-2010

13

3.4

Tableaux

3

TYPES

mat = new int[NL][NC]; o` NL et NC sont des expressions enti`res dnissant le nombre de lignes et de colonnes de la matrice souhaite. u e e e Linstruction prcdente a le mme eet que le code suivant : e e e mat = new int[NL][]; for (int i = 0; i < NL; i++) mat[i] = new int[NC]; // un tableau de NL [rfrences de] tableaux e e // un tableau de NC int

Lacc`s aux lments dun tableau ` deux indices se fait comme en C : e ee a mat[i][j] Lvaluation de cette expression dclenchera la vrication successive des conditions : e e e 1 2 3 4 mat = null 0 i < mat.length mat[i] = null 0 j < mat[i].length

Ainsi, un tableau ` deux indices dont les lments sont par exemple des int est ralis en Java comme a ee e e un tableau ` un indice dont les lments sont des [rfrences sur des] tableaux ` un indice dont les lments a ee ee a ee sont des int. La gure 3 reprsente cette conguration. em +i m[0] ... m[i] ... ... m[NL-1][NC-1] m[NL-1]

m[NL-1][0] +j ... m[i][0] ... m[0][0] m[0][NC-1] ... m[i][j]

m[i][NC-1]

Figure 3 Acc`s ` m[i][j], m tant une matrice ` NL lignes et NC colonnes e a e a Note. Java permet de manipuler, sous la mme syntaxe, des tableaux rectangulaires et des tableaux qui e ne le sont pas ; il sut pour cela de faire soi-mme linitialisation des lignes. Par exemple, le code suivant e cre une matrice triangulaire infrieure de dimension N dans laquelle chaque ligne a la longueur requise par e e son rang : float[][] mt = new float[N][]; for (int i = 0; i < N; i++) mt[i] = new float[i + 1]; 3.4.4 Tableaux initialiss et tableaux anonymes. e

Deux syntaxes permettent dindiquer un ensemble de valeurs devant remplir un tableau. Dans lune comme dans lautre, le nombre de valeurs fournies dtermine la taille du tableau. Dans la premi`re forme, e e analogue ` celle qui existe en C, on initialise le tableau au moment de sa dclaration : a e int[] tab = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 }; La deuxi`me forme permet de crer un tableau garni de valeurs, mais pas forcment ` lendroit de la dclae e e a e ration du tableau : 14c H. Garreta, 2000-2010

3

TYPES

3.5

Conversions entre types tableaux ou classes

int[] tab; ... tab = new int[] { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 }; En fait, cette deuxi`me syntaxe permet de crer des tableaux garnis anonymes, ce qui est bien utile e e lorsquun tableau ne sert quune seule fois. Par exemple, si la variable tab avait t dclare et construite ee e e dans lunique but de gurer dans lappel dune mthode (cela arrive) comme dans : e int tab[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 }; traiter(tab); alors il aurait t plus simple de ne pas dclarer de variable tab : ee e traiter(new int[] { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 }); Cas des matrices. Les mmes mcanismes permettent de crer des tableaux multidimensionnels garnis, e e e y compris lorsque leurs lignes ne sont pas de mme longueur : e int[][] mat = { { 11, 12, 13, 14, 15 }, { 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }, { }, null, { 51, 52, 53 } }; Notez la dirence entre la troisi`me et la quatri`me ligne du tableau prcdent : la troisi`me existe mais est e e e e e e vide (cest un tableau de 0 lments), tandis que la quatri`me nexiste pas. ee e Note. Contrairement ` ce qui se passe dans dautres langages, en Java linitialisation des tableaux se a fait pendant lexcution du programme, non pendant la compilation. Premi`re consquence : initialiser un e e e tableau par une liste de constantes est plus commode, mais pas notablement plus ecace, que la collection daectations qui aurait le mme eet. Par exemple, la dclaration e e int[] tab = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; a le mme eet mais est plus agrable ` crire et ` lire que la squence e e ae a e int[] tab = new int[10]; tab[0] = 1; tab[1] = 2; ... tab[9] = 10; Deuxi`me consquence : les expressions avec lesquelles on initialise des tableaux nont pas ` tre ncessaie e ae e rement des constantes. Des expressions quelconques, values pendant lexcution du programme, peuvent y e e e gurer : int[] tab = { x + 1, 2 * x + 1, 4 * x + 1, (int) Math.atan(y) };

3.5

Conversions entre types tableaux ou classes

Attention, section indigeste ! Pour bien comprendre cette section il faut conna les notions de tre classe et dhritage. e Le type statique dune expression E est dtermin par les dclarations des variables apparaissant dans e e e E, ainsi que par les constantes, oprateurs et mthodes qui forment E. Par exemple, avec la dclaration e e e Object e = "Bonjour"; le type statique de e est Object. Le type dynamique dune expression E est celui qui rsulte des valeurs eectives des variables intervee nant dans E, ainsi que des constantes, oprateurs et mthodes constituant E. Par exemple, avec la mme e e e dclaration ci-dessus, le type dynamique de e est String. e Dans ces conditions, soit E une expression, Ts son type statique, Td son type dynamique ` un instant a donn et Tf un deuxi`me type. Nous nous intressons ` la conversion de la valeur de E vers le type Tf , e e e a lorsque Ts et Tf ne sont pas identiques et que ce ne sont pas deux types primitifs. Voici ce quil faut savoir a ` ce sujet : 1. Aucune conversion nest possible entre un type primitif et un type tableau ou classe, ou rciproquement. e Dans les points suivants on suppose donc que Ts et Tf sont tous les deux des types tableaux ou classes.c H. Garreta, 2000-2010

15

3.6

Copie et comparaison des objets

3

TYPES

2. La conversion de la valeur de E vers le type Tf , lorsquelle est lgitime, est une conversion sans travail : e elle se rduit ` considrer lobjet dsign par E comme ayant le type Tf , sans que cet objet subisse la e a e e e moindre modication (ne pas oublier que E ne reprsente quune rfrence sur un objet). e ee 3. Sauf le cas particulier examin au point 7, la conversion de E vers le type Tf nest accepte ` la e e a compilation que si Ts et Tf sont des classes apparentes, cest-`-dire des classes dont lune est souse a classe, directe ou indirecte, de lautre (autrement dit, Ts et Tf sont sur une mme branche de larbre e dhritage). e 4. Si Tf est une super-classe, directe ou indirecte, de Ts la conversion de E vers le type Tf est correcte et ne requiert aucune indication particuli`re. On peut appeler cela une gnralisation du type de E. e e e Par exemple, si la classe Article est une super-classe de la classe ArticleSportif, elle-mme supere classe de Velo, qui est super-classe de VTT, alors laectation suivante est correcte (elle contient la conversion dun objet de type Velo vers le type Article) : Article unArticle = new Velo( ...caractristiques dun vlo... ); e e Lobjet Velo cr ci-dessus nest en rien modi par son aectation ` la variable unArticle mais, aussi ee e a longtemps quil est accd ` travers cette variable, il est considr comme un Article, non comme une e ea ee Velo (Article est un concept plus gnral que Velo). e e 5. Si Tf est une sous-classe, directe ou indirecte, de Ts , la conversion de E vers le type Tf est une sorte de particularisation du type de E et : nest accepte ` la compilation que si on utilise explicitement loprateur de transtypage. Exemple : e a e Article unArticle; Velo unVelo; ... unVelo = unArticle; unVelo = (Velo) unArticle;

// Erreur ` la compilation a // Ok (pour la compilation)

nest correcte, ` lexcution, que si Td est une sous-classe, directe ou indirecte, de Tf . Exemple : a e unArticle = new VTT( ... caractristiques dun VTT ... ); e ... unVelo = (Velo) unArticle; // Ok, un VTT peut ^tre vu comme une Velo e dclenche lorsquelle est incorrecte, ` lexcution, lexception ClassCastException. Exemple : e a e unArticle = new BallonDeBasket( ... caractristiques dun ballon ... ); e ... unVelo = (Velo) unArticle; // dclenche ClassCastException (un ballon e // ne peut pas ^tre vu comme un vlo) e e 6. Aucune conversion nest accepte entre types tableaux dirents (mais noubliez pas que le nombre e e dlments dun tableau ne fait pas partie de la dnition de son type : pour Java, un tableau de 10 ee e entiers et un tableau de 20 entiers ont exactement le mme type). e 7. Enn, les seules conversions correctes entre une classe et un tableau concernent ncessairement la classe e Object, super-classe de toutes les classes et de tous les tableaux. Exemple : int[] uneTable = new int[nombre]; ... Object unObjet = uneTable; // Ok (Object super-classe de tous les objets) ... uneTable = (int[]) unObjet; // Ok (dapr`s le type dynamique de unObjet) e En resume. Lessentiel ` retenir des r`gles prcdentes : a e e e ` la compilation, la conversion dune expression de type objet ou tableau est accepte sauf si on a e peut prdire avec certitude quelle chouera ` lexcution ; elle requiert parfois lemploi explicite de e e a e loprateur de transtypage ; e ` lexcution, la conversion du type dun objet est toujours contrle ; elle nest accepte que si elle a e oe e correspond ` une gnralisation du type dynamique de lobjet. a e e

3.6

Copie et comparaison des objets

Attention, section indigeste ! On mentionne ici des concepts, concernant notamment les superclasses et les interfaces, qui ne seront expliques qu` la section 7. e a 16c H. Garreta, 2000-2010

3

TYPES

3.6

Copie et comparaison des objets

3.6.1

Copie

Une consquence du fait que les objets et les tableaux sont toujours manipuls ` travers des rfrences e e a ee est la suivante : laectation dune expression de type objet ou tableau ne fait pas une vraie duplication de la valeur de lexpression, mais uniquement une duplication de la rfrence (ce quon appelle parfois une copie ee supercielle). Par exemple, considrons : e Point p = Point(10, 20); Point q = p; A la suite de laectation prcdente on peut penser quon a dans q un duplicata de p. Il nen est rien, il e e ny a pas deux points, mais un seul point rfrenc par deux variables distinctes, comme le montre la gure 4. ee e Dans certaines situations cette mani`re de copier est susante, mais elle prsente un inconvnient vident : e e e e chaque modication de la valeur de p se rpercute automatiquement sur celle de q. e

q

p

10 20

Figure 4 Copie de la rfrence sans duplication de lobjet (copie supercielle) ee

Pour obtenir la duplication eective dun objet, il faut appeler sa mthode clone. Tous les objets sont e censs possder une telle mthode 11 car elle est dclare dans la classe Object, la super-classe de toutes les e e e e e classes. Il appartient ` chaque classe de rednir la mthode clone, pour en donner une version adapte au a e e e rle et aux dtails internes de ses instances. o e La mthode clone rend un rsultat de type Object 12 , il faut donc lutiliser comme suit (la nature mme e e e de la mthode clone garantit que la conversion du rsultat de p.clone() vers le type Point est lgitime) : e e e Point q = (Point) p.clone();

q

p

10 20

10 20

Figure 5 Duplication eective dun objet (copie profonde)

Si clone a t correctement dnie (dans la classe Point) lexpression prcdente aecte ` q une copie ee e e e a profonde de lobjet qui est la valeur de p, comme montr sur la gure 5. e Il appartient au programmeur dune classe de dnir ce quil entend par copie profonde, notamment e lorsque les objects ont pour membres dautres objets. Sauf indication contraire on suppose que le clone dun objet est un deuxi`me objet nayant avec le premier aucun bout de mmoire en commun (comme les points e e montrs ci-dessus), mais ce nest pas une obligation. Par exemple, on verra ` la section suivante que le clone e a ociel dun tableau dobjets nest pas disjoint du tableau original.11. La mthode clone existe dans tous les objets mais, si le programmeur na pas pris certaines prcautions (consistent e e soit ` dnir explicitement la mthode clone, soit ` dclarer que la classe implmente linterface Cloneable), une exception a e e a e e CloneNotSupportedException sera lance a lexcution. e ` e 12. Cest regrettable mais ncessaire, car la dnition initiale de clone, dans la classe Object, ne peut tre dclare rendant e e e e e autre chose quun Object ; ensuite les rdnitions de clone dans les sous-classes doivent rendre strictement le mme rsultat, e e e e cest une contrainte du mcanisme de la rednition des mthodes. e e e

c H. Garreta, 2000-2010

17

3.6

Copie et comparaison des objets

3

TYPES

Cas des tableaux La mthode clone fonctionne en particulier dans le cas des tableaux : si t est un tableau, le rsultat e e de t.clone() est un tableau de mme type et mme taille que t dont les lments ont t initialiss par e e ee ee e aectation de ceux de t. Par exemple, les instructions suivantes crent deux tableaux distincts, lun rfrenc par les variables e ee e tab1 et tab2 et lautre rfrenc par tab3 : ee e int[] tab1 = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; int[] tab2 = tab1; // ceci nest pas une duplication int[] tab3 = (int[]) tab1.clone(); // ceci est une duplication effective Attention. Le rsultat rendu par t.clone() est un tableau nouvellement cr, de mme type et mme e ee e e taille que t, dont les lments sont initialiss par aectation, non par clonage, de ceux de t. Autrement dit, ee e la mthode clone des tableaux neectue pas une duplication profonde, mais seulement une duplication ` e a un niveau : si les lments du tableau sont des objets 13 le tableau initial et son clone ne sont pas disjoints ee car ils partagent les mmes lments. Il faut se demander si cest cela quon voulait obtenir. Cette question e ee est reprise dans la section suivante. Note Java 5. La mthode clone tant introduite au niveau de la classe Object, elle est dclare comme e e e e rendant un rsultat de type Object ce qui, dans le cas des tableaux, obligeait jusqu` Java 1.4 ` lutiliser e a a munie dun changement de type : Point[] t = new Point[n]; ... Point[] q = (Point[]) t.clone(); A partir de la version 5 du langage ce nest plus une obligation. Le compilateur rserve un traitement e spcial ` lappel de clone sur un tableau de mani`re ` rendre correctes des expressions comme : e a e a Point[] t = new Point[n]; ... Point[] q = t.clone(); 3.6.2 Dnir la mthode clone e e

La mthode clone doit tre rednie dans chaque classe o` cela est utile ; elle doit tre public. Exemple : e e e u e class Point { int x, y; public Point(int a, int b) { x = a; y = b; } public Object clone() { return new Point(x, y); } } On peut crire la mthode clone ` partir de rien, comme ci-dessus, mais on peut aussi allger ce travail e e a e et utilisant la mthode Object.clone() hrite de la classe Object. Pour cela, la classe quon crit doit e e e e comporter lnonc implements Cloneable; 14 sans quoi lexception CloneNotSupportedException sera e e lance ` lexcution. Exemple : e a e class Rectangle implements Cloneable { Point coinNO, coinSE; public Rectangle(int x1, int y1, int x2, int y2) { coinNO = new Point(x1, y1); coinSE = new Point(x2, y2); } public Object clone() throws CloneNotSupportedException { return super.clone(); // notre version de clone se rduit ` e a } // la version hrite de la classe Object e e }13. Cas particulier remarquable : les matrices, qui sont des tableaux de tableaux. Puisque les tableaux sont des objets, il en rsulte que la mthode clone ne duplique pas les coecients des matrices, mme lorsque ceux-ci sont dun type primitif. e e e 14. Linterface Cloneable est enti`rement vide, lnonc implements Cloneable nest quune marque par laquelle le programe e e meur saccorde le permis dutiliser la mthode hrite Object.clone() . e e e

18

c H. Garreta, 2000-2010

3

TYPES

3.6

Copie et comparaison des objets

Leet de la mthode hrite Object.clone() est la cration dun objet de mme type que celui quon e e e e e clone, puis linitialisation de chacune des variables dinstance de lobjet cr par aectation de la variable ee dinstance correspondante de lobjet original. Cest donc une copie ` un niveau , moins supercielle que a la copie des rfrences, mais ce nest pas la vraie copie en profondeur : si des membres sont ` leur tour des ee a objets cette sorte de copie ne sut pas pour faire que lobjet clon soit enti`rement spar de lobjet original. e e e e Par exemple, la gure 6 montre ` quoi ressemblerait le couple form par un objet de la classe Rectangle, a e dnie ci-dessus, et son clone, crs par les instructions suivantes : e ee Rectangle p = new Rectangle(10, 20, 30, 40); Rectangle q = (Rectangle) p.clone();q

p

coinNO coinSE 10 20 30 40

coinNO coinSE

Figure 6 La copie ` un niveau que fait Object.clone() a Pour avoir une duplication compl`te la mthode clone aurait d tre crite comme ceci : e e ue e class Rectangle { Point coinNO, coinSE; ... public Object clone() { return new Rectangle(coinNO.x, coinNO.y, coinSE.x, coinSE.y); } } ou bien, en supposant que la classe Rectangle a un constructeur sans argument : class Rectangle { Point coinNO, coinSE; ... public Object clone() { Rectangle r = new Rectangle(); r.coinNO = (Point) coinNO.clone(); r.coinSE = (Point) coinSE.clone(); return r; } } Note. Il est regrettable que lutilisation de la mthode clone hrite de la classe Object soit alourdie e e e par la ncessit dattraper ou dclarer CloneNotSupportedException, puisque cette exception est susceptible e e e dtre lance, mme lorsque, comme ici, il est certain quelle ne sera pas lance (puisque lnonc implements e e e e e e Cloneable a bien t crit dans la dclaration de la classe). eee e Dans lexemple ci-dessus, cette exception a t dclare. On aurait pu aussi bien lattraper et la faire ee e e dispara (puisque que de toute faon elle ne sera pass lance) en crivant clone de cette mani`re : tre c e e e class Rectangle implements Cloneable { ... public Object clone() { try { // notre version de clone se rduit ` e a return super.clone(); // la version hrite de la classe Object e e } catch (CloneNotSupportedException e) { return null; } } ... }c H. Garreta, 2000-2010

19

3.6

Copie et comparaison des objets

3

TYPES

3.6.3

Comparaison

Des remarques analogues aux prcdentes peuvent tre faites au sujet de loprateur de comparaison. Si e e e e a et b sont dun type classe ou tableau, la condition a == b ne traduit pas lgalit des valeurs de a et b, e e mais lgalit des rfrences. Autrement dit, cette condition est vraie non pas lorsque a et b sont des objets e e ee gaux, mais lorsque a et b sont le mme objet. e e Dans beaucoup de situations une telle notion dgalit est trop restrictive. Cest pourquoi tous les objets e e sont censs possder la mthode equals qui implmente une notion dgalit plus utile. e e e e e e Point p = new Point(10, 20); Point q = new Point(10, 20); ... System.out.println(p == q); System.out.println(p.equals(q)); ...

// ceci ache false // ceci ache true (si equals a t bien dnie) ee e

La mthode equals est dnie une premi`re fois au niveau de la classe Object, o` elle nest rien de plus e e e u que lgalit des rfrences : e e ee class Object { ... public boolean equals(Object o) { return this == o; } } mais chaque classe peut la rednir pour en donner une version adapte au rle et aux dtails internes de e e o e ses instances. Pour notre classe Point voici une premi`re version, pas tr`s juste : e e class Point { ... public boolean equals(Point o) { return x == o.x && y == o.y; } }

// VERSION ERRONE !!! E

Bien que rpondant en partie aux besoins, cette version de Point.equals est errone car, ` cause du e e a type de largument, elle ne constitue pas une rednition de la mthode Object.equals(Object o) 15 . Voici e e une version plus correcte : class Point { ... public boolean equals(Object o) { return o instanceof Point && x == ((Point) o).x && y == ((Point) o).y; } } Maintenant, la mthode ci-dessus est une vraie rednition de Object.equals, mais elle nest pas encore e e parfaite. Il faut savoir, en eet, que x instanceof K ne signie pas forcment que x est instance de K ( x e est un K ), mais uniquement que x est instance dune sous-classe de K ( x est une sorte de K ). Ainsi, si on suppose que Pixel est une sous-classe de Point (un Pixel est un Point avec, en plus, lindication dune couleur), ` la suite de a Point cePoint = new Point(11, 22); Pixel cePixel = new Pixel(11, 22, "rouge"); la condition cePoint.equals(cePixel) sera vraie. Est-ce ce que lon souhaite ? Probablement non. Voici une nouvelle version de equals qui corrige ce probl`me : e class Point { ... public boolean equals(Object o) {15. Il nest pas lmentaire de comprendre pourquoi cette version simple de equals nest pas correcte. Il faut imaginer la ee condition p.equals(q) lorsque les valeurs de p et q sont des objets Point alors que la variable q est dclare de type Object (une e e telle situation se produit, par exemple, chaque fois quon consid`re une Collection dont les lments sont des objets Point). e ee Si q est dclare de type Object, p.equals(q) nutilisera pas notre mthode Point.equals(Point p), mais Obe e e ject.equals(Object o) qui nest pas rednie dans la classe Point. e

20

c H. Garreta, 2000-2010

3

TYPES

3.7

Cha nes de caract`res e

return o != null && o.getClass() == Point.class && ((Point) o).x == x && ((Point) o).y == y; } } Toute surcharge de la mthode Object.equals(Object o) doit tre une relation dquivalence (cest-`e e e a dire une relation binaire rexive, symtrique et transitive) telle que si x = null alors x.equals(null) est e e faux. De plus, bien que ce ne soit pas une obligation, il semble naturel de faire en sorte que si y = x.clone() alors x == y soit certainement faux et x.equals(y) soit certainement vrai.

3.73.7.1

Cha nes de caract`res eLes classes String et StringBuffer

Deux classes permettent de reprsenter les cha e nes de caract`res : e les instances de la classe String sont invariables ; une fois cres, les caract`res dont elles sont formes ee e e ne peuvent plus tre modis, e e les instances de la classe StringBuffer, au contraire, sont destines ` subir des oprations qui modient e a e les caract`res dont elles sont faites (remplacements, ajouts, suppressions, etc.). e Les dtails de lutilisation de ces deux classes, extrmement utiles lune et lautre, sont dcrits dans e e e la documentation de lAPI Java. Limitons-nous ici ` signaler certains privil`ges tout ` fait originaux et a e a intressants de la classe String : e 1. Il existe une notation spcique pour les constantes littrales : toute suite de caract`res encadre par e e e e des guillemets produit une instance de la classe String : String nom = "Gaston Lagaffe"; 2. Lopration de concatnation (mise bout ` bout) de deux cha e e a nes se note par loprateur 16 + : e String formule = "Monsieur " + nom; // vaut "Monsieur Gaston Lagaffe" 3. Toutes les classes poss`dent la mthode String toString(), qui renvoie une expression dun objet e e sous forme de cha de caract`res. La classe Object fournit une version minimale de cette mthode, ne e e chaque classe peut en donner une dnition plus adapte. Exemple : e e class Point { int x, y; ... public String toString() { return "(" + x + "," + y + ")"; } } 4. Loprateur +, lorsquun de ses oprandes est une cha e e ne, provoque la conversion de lautre oprande e vers le type cha Cette conversion est eectue ne. e dans le cas dun type primitif, par lappel dune des mthodes statiques valueOf de la classe String, e dans le cas dun objet, par lappel de sa mthode toString e Par exemple, si p est un objet Point (voir ci-dessus), lexpression "rsultat: " + p e quivaut ` lexpression e a "rsultat: " + p.toString() e dont la valeur est, par exemple, la cha "rsultat: (10,20)". ne e 5. La conversion vers le type cha est pratique galement par certaines mthodes dintrt gnral. Par ne e e e ee e e exemple, les mthodes print et println de la classe PrintStream (la classe de lobjet System.out) ont e des dnitions spciques pour les cas o` leur argument est dun type primitif ou String et rcup`rent e e u e e tous les autres cas ` laide de la mthode toString. Par exemple, on peut imaginer print(Object o) a e ainsi crite : e public void print(Object o) { print(o.toString()); } // print(Object) est ramene ` print(String) e a

16. Les programmeurs C++ noteront que cet emploi du + est le seul cas de surcharge dun oprateur en Java. e

c H. Garreta, 2000-2010

21

3.7

Cha nes de caract`res e

3

TYPES

3.7.2

Copie et comparaison des cha nes

1. Clone. La classe String ne comporte pas de mthode clone : puisque les instances de cette classe e sont immuables, il nest jamais ncessaire de les cloner. e 2. Equals. La classe String ore une version de la mthode equals dont il est facile dimaginer ce e quelle fait : parcourir les deux cha nes en comparant les caract`res correspondants. Deux cha e nes construites sparment lune de lautre doivent tre compares ` laide de cette mthode. Par exemple, si reponse est e e e e a e de type String, lexpression reponse == "oui" vaut souvent false indpendamment de la valeur de reponse et na donc aucun intrt. Il faut crire ` la e ee e a place reponse.equals("oui") ou bien "oui".equals(reponse).

3. Intern. La mthode equals est utile mais relativement onreuse, puisquelle doit examiner les deux e e cha nes en comparant les caract`re homologues. Les programmes qui comportent des comparaisons frquentes e e entre des cha nes (en nombre raisonnable) peuvent tirer avantage de la mthode intern() qui renvoie une e cha ayant les mmes caract`res que la cha donne, mais appartenant ` un ensemble de cha ne e e ne e a nes sans rptition, au sein duquel deux cha e e nes gales sont forcment la mme cha Lorsquune cha appartient e e e ne. ne a ` cet ensemble on dira quelle a t internalise. ee e Ainsi, par exemple, tant donnes deux variables s1 et s2 de type String, quelles que soient les valeurs e e des cha nes t1 et t2, ` la suite de a s1 = t1.intern(); s2 = t2.intern(); les conditions s1.equals(s2) et s1 == s2 sont quivalents (mais lvaluation de la deuxi`me est e e e videmment plus rapide). e Note. Les cha nes de caract`res constantes crites dans le programme source sont garanties internalises, e e e contrairement aux cha nes construites pendant lexcution (chaque appel de new doit produire la cration e e dun nouvel objet). Ainsi, le code suivant ache certainement true false true : ... String a = "bonjour"; ... String b = "bonjour"; ... String c = new String("bonjour"); ... String d = c.intern(); ... System.out.println((a == b) + " " + (a == c) + " " + (a == d));

22

c H. Garreta, 2000-2010

4

EXPRESSIONS ET INSTRUCTIONS

4

Expressions et instructions

Cette section ridiculement courte est consacre aux dirences notables existant entre les expressions 17 e e et instructions de Java et celles de C. Bonne nouvelle : pour lessentiel, ce sont les mmes. Les expressions e sont formes avec les mmes oprateurs, les instructions emploient les mmes mots-cls, les unes et les autres e e e e e sont soumises aux mmes r`gles de syntaxe, renvoient les mmes valeurs et ont les mmes eets. e e e e Exceptions : deux mcanismes sont ralises de mani`re originale en Java et mritent dtre expliques, e e e e e e e mme dans un polycopi succinct comme celui-ci : e e linstruction de rupture tiquete, explique ci-dessous, e e e la boucle for amliore explique ` la section 12.3.2. e e e a

4.1

Rupture tiquete e e

Linstruction goto de certains langages nexiste pas ici. Cependant, an de bncier dun service impore e tant que cette instruction rend parfois, la ma trise de labandon des boucles imbriques, on a ajout ceci ` e e a Java : les instructions, et notamment les boucles (for, while, do...while, etc.), peuvent tre tiquetes, e e e linstruction break peut tre suivie dune tiquette an de provoquer labandon de plusieurs boucles e e imbriques au lieu dune seule. e Une tiquette est un identicateur quil nest pas ncessaire de dclarer ; il sut de lcrire, suivi de : , e e e e devant une instruction, pour quil soit connu ` lintrieur de celle-ci et inconnu ` lextrieur. a e a e Par exemple, le code purement dmonstratif suivant ache les dates comprises entre le 1er janvier e 2000 et le 30 dcembre 2005, en supposant que tous les mois ont 30 jours. A chaque achage, un entier e pseudo-alatoire de lintervalle [ 0, 100 [ est tir : si cest un multiple de 3, le mois en cours est abandonn e e e (on passe au 1er du mois suivant) ; si cest un multiple de 13, lanne en cours est abandonne (on passe au e e 1er janvier de lanne suivante) ; si le nombre est 0, le travail est abandonn : e e ... grandeBoucle: for (int a = 2000; a