Documente Academic
Documente Profesional
Documente Cultură
Structures de donnes Notions en Gnie Logiciel et Programmation Oriente Objet H. Mounier Universit Paris Sud
Notations
Les sigles suivants seront frquemment utiliss Point notable, auquel il faut prter attention Point positif, agrable, du langage Point ngatif, dsagrable, du langage Implication logique
Tout code source java sera crit dans une police particulire, type courier. Une notion dnie, explique ou prcise apparatra comme ceci. Des termes jugs importants apparatront comme ceci. Des termes jugs cruciaux apparatront comme ceci.
Table des matires I Entre en matire I.1 Quest-ce que Java, en trois lignes . . . . . . . . . . . . . . . . . I.2 Exemples de Hello World en dirents langages . . . . . . . . I.3 Un autre exemple . . . . . . . . . . . . . . . . . . . . . . . . . . Historique et proprits de Java II.1 Proprits du langage ; Technologies disponibles . . . . . . . . . II.2 Manifeste en 11 points . . . . . . . . . . . . . . . . . . . . . . .
ii 1 1 1 4 7 7 9 15 15 23 25 25 30 34 39 39 41 42 47 49 49 51 56
II
III Paquetages de Java III.1 Technologies et paquetages . . . . . . . . . . . . . . . . . . . . . III.2 Sources de documentation externes . . . . . . . . . . . . . . . . IV Bases procdurales de Java IV.1 Variables et types de donnes . . . . . . . . . . . . . . . . . . . IV.2 Oprateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IV.3 Contrle de ux . . . . . . . . . . . . . . . . . . . . . . . . . . . V Notions de gnie logiciel V.1 La lgende des sept singes . . . . . V.2 Buts du gnie logiciel . . . . . . . . V.3 Principes de gnie logiciel . . . . . V.4 Stratgie de dveloppement oriente
. . . . . . . . . . . . objet
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
VI Notions de programmation oriente VI.1 POO, Objets, Classes . . . . . . . . VI.2 Type ou classe ; objet . . . . . . . . VI.3 Relations . . . . . . . . . . . . . . ii
objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
iii VII Bases orientes objet de Java VII.1 Classes et objets Java . . . . VII.2 Hritage . . . . . . . . . . . VII.3 Surcharge, rednition . . . VII.4 Paquetages et interfaces . . 61 61 68 69 77 83 83 91 91 94 95 99 109 109 111 116 125 139 141
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
VIIIExceptions VIII.1 Fonctionnement gnral du systme dexceptions . . . . . . . . . IX Classes utilitaires de base IX.1 Classes Object, System, PrintStream . . . . . . . . . . . . IX.2 Mthode main() et classes demballage des types primitifs IX.3 Scanner (java.util.Scanner) . . . . . . . . . . . . . . . . IX.4 Classes java.applet.Applet et java.lang.String . . . . X java.util : Conteneurs et autres utilitaires X.1 Classes de java.util ; Classes et interfaces de comparaison X.2 Classes et interfaces conteneurs . . . . . . . . . . . . . . X.3 Conteneurs de type Map . . . . . . . . . . . . . . . . . . X.4 Conteneurs de type Collection et Listes . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
Bibliographie Index
Prface
Ces notes de cours rassemblent des lments de base du langage Java. Les chapitres I, II et III sont introductifs ; les chapitres V et VI introduisent des concepts gnraux essentiels en programmation, indpendamment de tout langage ; enn les chapitres IV, VII, VIII, IX et X fournissent de manire concrte les bases du langage. Aprs les trois premiers chapitres qui donnent des aperus gnraux sous divers angles, le chapitre IV expose les bases purement procdurales (c..d. non oriente objet) du langage. Au chapitre V des notions de gnie logiciel gnriques sont exposes. Le chapitre suivant contient des dnitions prcises de ce que sont une classe, un objet, ainsi que les relations (notamment lhritage) qui les relient. La substance concrte de ce qui est dcrit au chapitre VI fait lobjet du chapitre VII. Le mcanisme dexceptions de Java est ensuite expos au chapitre VIII. Diverses classes utilitaires simples sont donnes au chapitre IX. Enn, le chapitre X concerne les classes de Java implantant diverses structures de donnes (telles les tableaux dynamiques, les listes, les tables de hachage, les arbres) et algorithmes (tels le tri) associs.
I Entre en matire
Rfrences bibliographiques
Java examples in a Nutshell, D. Flanagan, 2ime dition [Flaa]
I.1
Le dbut de louvrage de rfrence, The Java Language Specication par J. Gosling, B. Joy et G. Steele [GJS96] rsume fort bien lesprit dans lequel le langage a t conu ainsi que le but poursuivi : Java is a general purpose, concurrent, class-based, object-oriented language. It is designed to be simple enough that many programmers can achieve uency in the language. Java is related to C and C++ but is organized rather dierently, with a number of aspects of C and C++ ommited and a few ideas from other languages included. Java is intended to be a production language, not a research language, and so, as C.A.R. Hoare suggested in his classic paper on language design, the design of Java has avoided including new and untested features.
I.2
typedef struct APP_DATA { char *mtext; char *etext; } APP_DATA, *P_APP_DATA; static XrmOptionDescRec options[] = { /* options de la ligne de commande */ {"-mtext", "*mtext", XrmoptionSepArg, NULL}, {"-etext", "*etext", XrmoptionSepArg, NULL} }; static XtResource resources[] = { /* ressources */ {"mtext", "Mtext", XtRString, sizeof(String), XtOffset(P_APP_DATA, mtext), XtRString, "Maison pauvre, voie riche"}, {"etext", "Etext", XtRString, sizeof(String), XtOffset(P_APP_DATA, etext), XtRString, "Quitter"} }; static Arg args[10]; /* arguments passes aux widgets */ static void quit_action(Widget w, caddr_t client_data, XmAnyCallbackStruct *call_data); void main(int argc, char *argv[]) { APP_DATA data; Widget main_widget, form_widget, hello_message, exit_button; main_widget = XtInitialize(argv[0], "Xmhello", options, XtNumber(options), &argc, argv); XtGetApplicationResourceds(main_widget, &data, resources, XtNumber(resources), NULL, 0); form_widget = XtCreateManagedWidget("Form", xmFormWidgetClass, main_widget, NULL, 0); XtSetArg(args[0], XmNtopAttachment, XmATTACH_FORM); XtSetArg(args[1], XmNleftAttachment, XmATTACH_FORM); XtSetArg(args[2], XmNLabelString, XmStringCreateLtoR(data.etext, XmSTRING_DEFAUKT_CHARSET)); exit_button = XtCreateManagedWidget("Exit", xmPushButtonWidgetClass, form_widget, (ArgList) args, 3); XtAddCallback(exit_button, XmNactivateCallback, quit_action, NULL); XtSetArg(args[0], XmNtopAttachment, XmATTACH_WIDGET); XtSetArg(args[1], XmNtopWidget, exit_button);
Avantage : souple. Dsavantages : code long, ne fonctionne que sous XWindows (pas sur
graphique.
Code dune fentre simple
proc helloWorld { toplevel .helloworld label .helloworld.label -text "La haine seule fait des choix" button .helloworld.button -text "Quitter" -command exit pack .helloworld.label .helloworld.button }
Avantage : codage de mini applications simple. Dsavantage : Langage de mauvaise qualit (au sens du gnie logiciel) et
lent.
4
import java.awt.* import java.awt.event.*
class HelloWorld extends CloseableFrame { public void paint(Graphics g) { this.setLayout(new FlowLayout(FlowLayout.CENTER, 15, 15)); button b = new Button("Quitter"); this.add(b); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent a) { System.exit(0); } }); g.drawString("Jour apres jour, cest un bon jour", 75, 100); } public static void main(String args[]) { Frame f = new HelloWorld(); f.show(); } }
Avantages :
Code trs compact (3 fois plus court quen OSF/Motif, 6 fois plus court quen Xlib). Langage de bonne qualit (en gnie logiciel). Ncessairement orient-objet. Fonctionne sans modications sous UNIX, Windows 98/NT, MacOS.
I.3
Un autre exemple
II.1
1.1 Oak
Originellement Oak, 1991, James Gosling, Sun Microsystems. But de Oak : langage embarqu pour des appareils de communication (tl-
taille rduite ( codage compact). abilit ( fonctionnement en mode dgrad, en rponse des exceptions).
Java hrite principalement sa syntaxe (procdurale) du C. Langage gnraliste, aussi versatile que C++. Plusieurs simplications notables par rapport au C++. Trs vaste bibliothque de classes standard (plus de 3000 classes dans plus de 160 paquetages pour le JDK 1.5) A partir de 1993, chez Sun, dveloppement pour crer un langage adapt Internet. En 1995, annonce ocielle de Java (concu, entre autres, par James Gosling, Patick Naughton, Crhis Warth, Ed Frank, Mike Sheridan et Bill Joy). Milieu 1996, sortie de Java 1.02, premire version distribue par JavaSoft (liale de Sun). Dbut 1997, sortie de Java 1.1. Beaucoup damliorations signicatives. Premire version tre juge srieuse du langage. t 2004, sortie de Java 1.5 ; diverses amliorations et ajouts intressants.
Web (transfert de pages HTML et excution de programmes distante via Internet) ? Le schma client/serveur classique est le suivant :[-2.5ex] envoi de requte du client vers le serveur, traitement de la requte par le serveur, envoi de la rponse du serveur au client.
Lorsquil y a plusieurs requtes, la 1ere prend du temps, les suivantes ne sourent pas du transfert via Internet.
frents, avec des OS dirents. Le source java doit tre traduit en un bytecode indpendant de la plate forme logicielle et matrielle. Ce bytecode (code dont les instructions sont longues d1 ou 2 octet) est un langage sur une machine imaginaire, une machine virtuelle. Ressemble un assembleur gnrique. Transformation du bytecode en code machine via : [-3ex] des interprteurs. des compilateurs juste--temps (JIT : Just In Time) de performances plus proches dun excutable C ou C++ classique. Apparition de compilateurs natifs, c..d. transformant du code source Java en code machine natif pour tel ou tel processeur (jove ; cygnus, au dessus de gcc, . . . ).
1.8 Scurit
Un programme sexcutant sur un serveur ne peut faire beaucoup de dgts
sur la machine client. Un programme sexcutant cot client peut, en thorie, avoir accs beaucoup de ressources, do un danger. gestionnaire de scurit, sur le client, limitant les actions possibles du programme envoy par le serveur. Par ex., interdiction daccder au systme de chiers ou de transmettre dautres que le client ou le processeur du serveur.
II.2
Manifeste en 11 points
10
Support de cours Java sr, indpendant de larchitecture, portable, ecace multitches ou multi-activits (multi-thread) et dynamique.
Nombreux mots cls limins. Pas de pr-processeur. Bibliothque trs tendue et directement intgre au langage. Pas de surcharge doprateurs, de fonctions indpendantes, de goto, de structures, dunions ni de pointeurs. Pas de chiers den-tte. Pas dhritage multiple ; la place, notion dinterface, venant dObjective C. Bien moins complexe. Pas de pointeurs visibles au niveau du programmeur. Bien sr, en interne, les pointeurs sont largement utiliss ; mais ceci est cach pour lutilisateur.
laccs aux URL (Universal Resource Locators), la programmation client/serveur via des sockets TCP et UDP, lexcution de mthodes distantes (RMI : Remote Method Invocation). la conception dapplications rparties selon le modle despaces (issus du langage Linda) avec JavaSpaces, la gestion de serveurs Web via les Servlets, la communication dobjets distants inter-langages avec des IDL (Interface Denition Language) CORBA (Common Request Broker Architecture),
11
ladministration de rseaux via SNMP (Simple Network Management Protocol) avec JMAPI.
chine imaginaire, une machine virtuelle. Cet assembleur, ou bytecode, peut tre interprt. Dsavantage : lenteur dexcution. Notion de compilateur la vole ou juste temps. La Traduction du bytecode au langage machine est eectue juste avant lexcution. Performances avoisinant celles des langages compils classiques. Puis, apparition de compilateurs natifs, avec des performances gales celles du C.
Exemples : ouverture dun chier inexistant, division par zro, cration dun point de communication rseau (socket) vers une @IP inexistante, . . . Le programmeur est forc de grer diverses exceptions. Gestion automatique de la mmoire ; prsence dun ramasse-miettes (pas de possibilit de new sans delete). Verication lexcution des compatibilits de type lors dun cast.
test de bon accs aux classes, tests de congestion et de famine de la pile des oprandes, test de conversion illgale de donnes, test daccs aux ressources : chiers, ...
lencontre de C++.
12
lente (environ 20 fois plus lente que du C). Les compilateurs la vole (JIT) la rendent presque aussi rapide que des programmes compils classiques. Des compilateurs natifs, fournissent du code machine natif pour tel ou tel processeur ; performances gales celles du C (jove ; cygnus, au dessus de gcc, . . . ).
(threads) dexcution. La coordination des activits est aise (moniteurs de Hoare et vnements).
dautres langages. Chargement des classes en cours dexcution, lorsque ncessaire, ventuellement travers le rseau. Chargement dynamique des classes possible grce des informations de typage consultables en cours dexcution. La liste est donne par thme, chaque lment tant suivi, entre parenthses, du nom de la technologie Java correspondante. Son ventuelle disponibilit apparat ensuite : au sein du JDK, paquetage optionnel ou extension en accs davant premire.
13
3. Interoprabilit rseau inter-langage via CORBA (IDL ou Interface Denition Langage ; JDK). 4. Appel de mthodes distantes au dessus du protocole Internet dinteroprabilit rseau inter-langage (RMI-IIOP ou Remote Method Invocation over Internet Inter-Orb Protocol ; paquetage optionnel). 5. Fonctions de serveurs HTTP (Java Servlets ; paquetage optionnel).
14
III.1
Technologies et paquetages
15
16
Support de cours Java 1. Gestion dinterfaces graphiques (AWT ou Abstract Window Toolkit et Swing, formant les JFC ou Java Foundation Classes ; JDK) 2. Composants rutilisables, ditables au sein dun concepteur dinterfaces graphiques ou GUI builder (Java Beans ; JDK) 3. Dessin vectoriel 2D (Java2D ; JDK) 4. Traitement diamges de base (Java advanced imaging ; extension standard) 5. Synthse dimages et VRML (Java3D ; extension standard) 6. Gestion multimdia (JMF, Java Media Framework ; extension standard ) 7. Synthse vocale (Java Sound)
Scurit :
1. Liste de contrle daccs ou ACLs (JDK) 2. Authentication et autorisation (JAAS ou Java Authentication and Authorization Service) 3. Flux rseau scuris par des SSL ou Secure Socket Layer (JSSE ou Java Secure Socket Extension ; paquetage optionnel) 4. Cryptographie (JCE ou Java Cryptography Extension ; extension standard)
Gestion de donnes :
1. Structures de donnes de base (listes, arbres, tables de hachage) et tri (Collections ; JDK) 2. Accs des bases de donnes par SQL (JDBC ou Java Database Connectivity ; JDK)
java.awt
But Fournit les classes ncessaires pour crer une applet et celles quune applet utilise pour communiquer avec son contexte. Contient toutes les classes pour crer des interfaces graphiques et pour dessiner des graphiques et des images (API de base ; voir swing plus loin).
17
Classes pour les couleurs. Interfaces et classes pour le transferts de donnes entre applications. Drag and Drop ou glisser-placer un lment graphique laide dun pointeur (en gnral la souris). Interfaces et classes de gestion des dirents vnements associs aux composants AWT. Interfaces et classes relies aux polices de caractres. Classes Java 2D pour dnir et raliser des oprations sur des objets bi-dimensionnels. Classes et interfaces du cadre de mthodes dentre (input method framework). Ce cadre permet des composants de recevoir des entres clavier en Japonais, Chinois ou Coren (pour lesquelles il faut plusieurs touches pour un caractre). Interfaces permettant le dploiement dentres pour tout environnement dexcution Java. Classes pour crer et modier des images. Classes et interfaces pour produire des images indpendantes du rendu (du prihrique dafchage ou dimpression). Classes et interfaces pour une API gnrale dimpression. Classes relies au dveloppement de composants beans (composants rutilisables pouvant tre dits graphiquement). Classes et interfaces relis un contexte de bean (conteneur qui dnit un environnement dexcution du ou des bean(s) quil contient). Entres/sorties systmes au travers de ux de donnes, de la srialisation et le systme de chiers. Classes fondamentales du langage Java. . Classes dagents dinstrumentation de programmes tournant sur une JVM. Gestion de la machine virtuelle et du systme dexploitation hte.
java.awt.im.spi
java.awt.image java.awt.image.renderable
java.awt.print java.beans
java.beans.beancontext
java.io
18
java.lang.ref
java.lang.reflect
java.security.cert java.security.interfaces
java.security.spec
java.sql java.text
19
Contient le cadre des collections, le modle dvnements, des utilitaires de gestion du temps et de la date ainsi que dautres utilitaires divers (un analyseur lexical, un gnrateur de nombres alatoires et un tableau de bits). Classes de programmation concurrente. Classes de programmation sans verrou adaptes la multiplicit des threads (lock-free and thread-safe). Classes de verrou et dattente (distinctes des synchronisation (synchronized) et moniteurs de Hoare (wait())). Classes pour lire et crire dans des chiers JAR (Java ARchive), bas sur le standard de chier ZIP avec un chier optionnel de manifeste. Classes de sauvegarde en ligne (logging). Classes de sauvegarde et restauration des prfrences utilisateur et systme. Classes de manipulation des expressions rgulires. Classes pour lire et crire dans des chiers JAR (Java ARchive), bas sur les standards de chier ZIP et GZIP. Dnit un contrat entre des composants dinterface utilisateur et des technologies dassitance (par exemple aux personnes handicapes). Classes de cryptographie. Classes dinterfaces pour les cls de DieHellman. Classes de spcication de cls et de paramtres dalgorithme. Classes dentres/sorties dimages. Classes de gestion dvenements synchrone durant la lecture et lcriture dimages. Classes de lecture et dcriture de mtadonnes dimages. Classes de plugin BMP. Classes de plugin JPEG. Classes de interfaces pour les lecteurs, crivains, transcodeurs et ux dimages.
java.util.concurrent java.util.concurrent.atomic
java.util.concurrent.locks
java.util.jar
javax.accessibility
20
javax.imageio.stream javax.management javax.management.loading javax.management.modelmbean javax.management.monitor javax.management.openmbean javax.management.relation javax.management.remote javax.management.remote.rmi
javax.management.timer javax.naming javax.naming.directory javax.naming.event javax.naming.ldap javax.naming.spi javax.net javax.net.ssl javax.print javax.print.attribute javax.print.attribute.standard javax.print.event javax.rmi javax.rmi.CORBA javax.security.auth javax.security.auth.callback
javax.security.auth.kerberos javax.security.auth.login
21
Classes dinterface pour implanter des modules dautentication. Classes de gestion X500 (Principal and Private Credentials). Classes de certicats cl publique. Classes de gestion de SASL. Classes et interfaces dentre/sortie, de squenage et de synthse de donnes MIDI. Classes de gestion dimplantation de priphriques MIDI. Classes dacquisition, de traitement et de rejeu de donnes audio chantillonnes. Classes de gestion dimplantation de priphriques audio. Classes daccs de donnes cot serveur. Classes de gestion de JDBC RowSet. Classes de srialisation entre types SQL et types Java . Classes de gestion dimplantation de fournisseur de synchronisation. Ensemble de composants lgers (entirement Java) qui se comportent de manire quasi-identique sur toutes les plates-formes. Classes et interfaces pour acher des bodures autour dun composant Swing. Classes et interfaces utilises par le composant JColorChooser. vnements crs par des composants Swing. Classes et interfaces utilises par le composant JFileChooser. Une interface et plusieurs classes abstraites utilises par Swing pour fournir des possibilits de rendu adaptables (pluggable look-andfeel capabilities). Objets dinterface utilisateur construits conformment au rendu standard (the Basic look-and-feel). Objets dinterface utilisateur construits conformment au rendu mtallique (metal look-and-feel). le rendu (look and feel) multiplex permet un utilisateur de combiner un rendu auxiliaire avec le rendu par dfaut.
javax.swing.plaf.basic
javax.swing.plaf.metal
javax.swing.plaf.multi
22
javax.swing.plaf.synth javax.swing.table javax.swing.text javax.swing.text.html javax.swing.text.html.parser javax.swing.text.rtf javax.swing.tree javax.swing.undo
javax.transaction javax.transaction.xa
javax.xml javax.xml.datatype javax.xml.namespace javax.xml.parsers javax.xml.transform javax.xml.transform.dom javax.xml.transform.sax javax.xml.transform.stream javax.xml.validation javax.xml.xpath org.ietf.jgss org.omg.CORBA
23
Gestionnaires SAX2 optionnels. Classes daide SAX.
III.2
http ://www.javasoft.com
Les API Java XX (par ex. 1.5) de Sun
http ://www.javasoft.com/products/jdk/XX/docs/api/index.html
Lalmanach Java, une liste de mini exemples pour chaque classe du langage.
Trs utile
http ://javaalmanac.com/
Divers cours sur Java, en franais
http ://java.developpez.com/cours/
http ://java.sun.com/docs/
Les tutoriels
http ://java.sun.com/docs/books/tutorial
Documentations ENST, dont le JDK et le Java Tutorial de Sun
http ://www-inf.enst.fr/softs/
Compilateur GNU pour Java, GCJ (compilation en code machine)
http ://gcc.gnu.org/java/
Plusieurs cours sur les rseaux de lUREC
http ://www.urec.fr/cours/
Java-Linux
http ://www.blackdown.org
Liens sur Java
http ://www.webreference.com/programming/java.html
Cours en ligne sur Java
http ://www.eteks.com
Beaucoup de liens sur Java
www.teamjava.com/links
Les RFC en HTML luniversit dOhio
http ://www.cis.ohio-state.edu/hypertext/information/rfc.html
24
Plus de 16 000 liens sur les objets et composants
http ://www.sente.ch/cetus/software.html
IV.1
1.1 Identicateurs
Identicateur : suite de
lettres minuscules ou majuscules, chires, underscore (_) et dollar ($). Un identicateur ne doit pas commencer par un chire. Java distingue minuscules et majuscules (Valeur dire de VALEUR). Conventions Toute mthode publique et variable dinstance commence par une minuscule. Tout changement de mot descriptif se fait via une majuscule. Exs. : nextItem, getTimeOfDay. Variables locales et prives : lettres minuscules avec des underscores. Exs. : next_val, temp_val. Variables dites final reprsentant des constantes : lettres majuscules avec underscores. Exs. : DAY_FRIDAY, GREEN. Tout nom de classe ou dinterface commence par une majuscule. Tout changement de mot descriptif se fait via une majuscule. Exs. : StringTokenizer, FileInputStream. 25
26
les valeurs octales commencent avec un 0. Ainsi 09 gnre une erreur : 9 en dehors de la gamme octale 0 7. Ajouter un l ou L pour avoir un entier long. Nombres virgules : par dfaut des double. Ajouter un f ou F pour avoir un float. boolens : 2 valeurs possibles, true et false. true (resp. false) nest pas gal 1 (resp. 0). Chanes de caractres : doivent commencer et se terminer sur la mme ligne . . . Caractres : unicode (sur 16 bits), manipulables comme des entiers, par a, @, . . .
Description Caractre octal ddd Caractre hexadcimal unicode xxxx Apostrophe Guillemets Backslash (barre oblique inverse) Carriage return New line Form feed Tabulation Backspace
1.3 Variables
exemple (Pythagore) :
class Variables { public static void main(String args[]) { double a = 3; double b = 3; double c; c = Math.sqrt(a*a + b*b); System.out.println("c = " + c); } }
27
Rgles de visibilit usuelles pour une variable dnie lintrieur dun bloc
entre {}.
Une variable ne peut avoir le mme nom quune dclare dans un bloc
englobant :
class Scope { public static void main(String args[]) { int var = 3; { int var = 2; // Erreur de compilation } } }
28
analogues aux types correspondants dans des langages non orients objets.
Huit types primitifs :
Entiers : byte, short, int et long, tous signs. Nombres virgule ottante : float et double. Caractres : char. boolens : boolean, pour les valeurs logiques.
byte : nutiliser que pour des manipulations de bits. short : relativement peu utilis car sur 16 bits. int : dans toute expression avec des byte, short, int, tous sont promus des int avant calcul.
29
sible lorsque le compilateur sait que la variable destination est assez grande.
Si des bytes, short, int et long font partie dune expression, tout le monde
est promu long. Si une expression contient un float et pas de double, tout le monde est promu float. Sil y a un double, tout le monde est promu double. Tout littral virgule est considr comme double.
1.10 Caractres
Un caractre est cod par un entier allant de 0 65536 (selon le standard
Dans quatre : 4. un a t promu int dans lexpression, do la conversion en char avant lassignation.
1.11 Boolens
Type renvoy par tous les oprateurs de comparaison, comme (a < b). Type requis par tous les oprateurs de contrle de ux, comme if, while
et do.
1.12 Tableaux
Cration pouvant tre faite en deux temps :
bornes du tableau.
30
Ce qui revient
double matrice[][] = new double[4][]; matrice[0] = new double[4]; matrice[1] = new double[4]; matrice[2] = new double[4]; matrice[3] = new double[4];
double m[][] { { { };
IV.2
Oprateurs
Les oprateurs arithmtiques fonctionnent comme en C. Une dirence : le modulo agit galement sur les nombres virgule.
Exemple dincrmentation
IV.2 Oprateurs
class IncDec { public static void main(String args[]) { int a = 1; int b = 2; int c = ++b; int d = a++; c++; System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); System.out.println("d = " + d); } }
31
byte laide des oprateurs suivants Op. & | >> >>> << Rsultat NON unaire bit--bit ET bit--bit OU bit--bit OU exclusif bit--bit dcalage droite dcalage droite avec remplissage de zros dcalage gauche Op. &= |= ^= >>= >>>= <<= Rsultat assignation avec ET bit--bit assignation avec OU bit--bit assignation avec OU exclusif bit--bit assignation avec dcalage droite assignation avec dcalage droite et remplissage de zros assignation avec dcalage gauche
int a = -1;
32
a = a >>> 24;
Tout type java, y compris les types primitifs et les rfrences des instances
dobjets peuvent tre compars avec == et != Seuls les types numriques peuvent tre compars avec les oprateurs dordre. Les entiers, ottants et caractres peuvent tre compars avec les oprateurs dordre strict. Chaque oprateur renvoie un type boolean.
Rsultat ET logique assignation avec ET OU logique assignation avec OU OU exclusif logique assignation avec OU exclusif OU avec court cricuit
IV.2 Oprateurs
== && != ! ? : gal ET avec court circuit dirent de NON unitaire logique if-then-else ternaire
33
les courts circuits (&& et ||) fonctionnent comme en C (la deuxime oprande
est excute conditionnellement la valeur boolenne de la premire). Ansi le code suivant ne gnre pas derreur lexcution.
if (denom != 0 && num / denom > 10)
Les versions non court circuites donnent lieu valuation des deux oprandes. Le code suivant gnre une erreur
if (denom != 0 & num / denom > 10) java.lang.ArithmeticException : / by zero
les versions mono-caractre que dans le cas doprations bit--bit. Loprateur if-then-else ternaire ( ? :) fonctionne comme en C. Par exemple
ratio = (denom == 0 ? 0 : num / denom) ;
Sens de priorit ! - (unaire) () (cast) gauche droite new droite gauche gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite gauche droite droite gauche
<= instantceof
Appel de mthode.
34
IV.3
Contrle de ux
sion mme si elle nest pas compose. Ce qui permet, lorsque lon veut rajouter une expression, de ne rien oublier, comme cest le cas ci-aprs
IV.3 Contrle de ux
break b; System.out.println("Jamais execute"); } System.out.println("Jamais execute"); } System.out.println("Apres b:"); } }
35
} break suivi du nom de marquage du bloc permet une sortie du bloc marqu
type quexpression) Cest une erreur rpandue que doublier un break. Il est donc de BONNE PRATIQUE dutiliser des commentaires du type // CONTINUER. Exemple dquivalent de wc (word count, comptage du nombre de lignes, mots et caractres) Exemple dquivalent de wc (word count, comptage du nombre de lignes, mots et caractres) class WordCount { static String texte = "Trente rayons convergent au moyeu "mais cest le vide median
" + " +
36 "qui fait marcher le char. "On faconne largile pour en faire des vases, "mais cest du vide interne "que depend leur usage.
"Une maison est percee de portes et de fenetres, " + "cest encore le vide " + "qui permet lhabitat. " +"\n"+ "LEtre donne des possibilites, "cest par le non-etre quon les utilise. "Tao-to king, Lao-tseu, XI static int long = text.length(); " + " +"\n"+ \n";
public static void main(String args[]) { booelan dansMot = false; int nbreCars = 0, nbreMots = 0, nbreLignes = 0; for (int i = 0; i < long; i++) { char c = texte.charAt(i); nbreCars++; switch (c) { case \n : nbreLignes++; // CONTINUER case \t : // CONTINUER case : if (dansMot) { nbreMots++; dansMot = false; } break; default : dansMot = true; } } System.out.println("\t" + nbreLignes + "\t" + nbreMots + "\t" + nbreCars); } // main() } // class WordCount
IV.3 Contrle de ux
37
java.
V.1
40
Support de cours Java Deux autres singes font une apparition tapageuse de temps en temps : Le singe rutilisable dont le slogan est : Ton code doit tre rutilisable ! Le singe scuritaire : Ton Code doit tre parfaitement sr !
constat fait au dpartement de la dfense amricaine : En 1968-1970 au DoD (Departement of Defense) : cots matriels cots logiciels De 1968 1973 : accroissement de 59 % des cots informatiques et baisse trs forte des cots matriels (pour le logiciel, budget en 1970 : 3.109 $, en 1990 30.109 $) ceci pour un produit ni en gnral insatisfaisant : Adquation : non correspondance aux besoins des utilisateurs Fiabilit : logiciel tombant souvent en panne Cot : cots rarement prvisibles, peru comme excessifs Modiabilit : maintenance souvent complexe, coteuse et non able Ponctualit : logiciel souvent en retard ; livr avec des capacits infrieures celles promises Transportabilit : logiciel dun systme rarement utilisable sur un autre Ecacit : non utilisation optimale par le logiciel des ressources disponibles (temps de calcul, RAM) ce qui rend les dirents singes tous malheureux. Cot de maintenance logicielle > cot du dveloppement original. En 1975, un industriel dpense entre 40 et 75 % de son budget informatique pour la maintenance logicielle. En 1973, 450 langages gnraux au DoD. Notamment pour des logiciels embarqus, De 1975 1977, valuation de 2800 langages, aucun rellement appropri, bien que Pascal, ALGOL et PL/1 comportent des lments intressants. En 1977 appels does international, 17 rponses, 4 slectionnes, dont une de CII Honeywell Bull. En 1979 slection nale de la proposition de CII ; le langage, cr par Jean Ichbiah, prend pour nom Ada (Augusta Ada Byron, mathmaticienne ayant travaill avec Babbage sur ses machines direntielle et analytique) En 83, manuel de rfrence Ada, approuv comme norme ANSI, puis en 1987 adopte par lISO
41
V.2
2.2 Modiabilit
Deux raisons de vouloir modier un logiciel : changement des spcications (par exemple daprs une demande dun client) correction dune erreur Dans un logiciel modiable, on peut introduire des changements sans complexication (ni perte de lisibilit)
2.3 Ecacit
Utilisation optimale des ressources en temps et en espace Pour des systmes
temps rel : dont la ressource en temps est prdominante. Pour des systmes embarqus, o il y a limitation de place (dans un satellite, une automobile) : ressource en espace prdominante On se proccupe souvent trop tt de lecacit, se polarisant de ce fait sur la micro-ecacit au dtriment de la macro-ecacit ; dans [RGI80] : Une bonne perspicacit retant une comprhension plus unie dun problme a beaucoup plus impact sur lecacit nimporte quel tripotage de bits dans une structure dciente
2.4 Fiabilit
Peut-tre critique (systme de navigation dun engin spatial) : La abilit doit la fois viter les dfauts de conception, dtude et de construction, et permettre de rcuprer les pannes et les dfauts de performances (cf. [RGI80]). Pour toute panne, prvisible ou non, le logiciel doit entrer en mode dgrad en douceur, sans eet de bord dangereux (par exemple, une orbite dgrade)
42
2.5 Intelligibilit
Sans doute le but le plus crucial pour bien grer la complexit dun systme
logiciel Pour quun systme soit comprhensible, il doit tre un modle exact de notre vue du monde rel Pour amliorer la comprhensiblit : Au bas niveau, lisibilit par un bon style de codage, Au plus haut niveau, il tre facile disoler les structures de donnes (objets) et les actions (oprations) correspondantes celles du monde rel. Le langage choisi est important pour cela.
V.3
(i) chiers denregistrements (ii) disques logiques (i-noeuds, blocs) (iii) carte contrleur de disque On veut extraire les proprits essentielles en omettant les dtails qui ne le sont pas Au niveau (i) une structure (par exemple une adresse) Au niveau (ii) une suite de blocs Au niveau (iii) une suite de secteurs physiques Pour manipuler chier on fera : Ouvrir, lire (crire) un enregistrement, fermer. On ne soccupe pas du niveau intrieur qui correspond (ii) : Lecture, criture de bloc, mise jour di-noeud qui lui ne soccupe pas du niveau (iii) : Dplacement de ttes de lecture, lecture ou criture dune suite de bits par tte magntique. Pour manipuler chier on fera : Ouvrir, lire (crire) un enregistrement, fermer. On ne soccupe pas du niveau intrieur qui correspond (ii) : Lecture,
43
criture de bloc, mise jour di-noeud qui lui ne soccupe pas du niveau (iii) : Dplacement de ttes de lecture, lecture ou criture dune suite de bits par tte magntique On a donc galement une abstraction des oprations ou abstraction algorithmique. On utilise la dissimulation dinformation : Abstraction extraire les dtails essentiels dun niveau Dissimulation rendre inaccessibles des dtails qui ne doivent dinformations pas inuencer dautres parties du systme Exemple : on ne doit pas permettre un utilisateur (niveau (i)) de pouvoir crire directement sur un disque logique (niveau (ii)). On empche ainsi les modules de haut niveau de reposer directement sur des dtails de bas niveau autre exemple : une pile, code en C supposons avoir un type pile dans
pile.h typedef struct __pile { int elements[TAILLE]; /* donnees, ici un tableau int *dessus; /* bas de la pile; ne varie pas int *dessous; /* haut de la pile; variable } *pile; */ */ */
ma_pile = creer_pile(); /* remplissage de la pile */ for(i = 0; i < 100; i++) elt_pile = depiler(ma_pile);
et
int pile elt_pile; ma_pile;
la deuxime solution doit tre rejete. Si lon change la structure de donnes utilise pour une pile (par exemple une liste chane au lieu dun tableau), la dernire partie de code est dsastreuse.
44
le nombre de dtails connatre chaque niveau. La dissimulation dinformations aide la abilit (empcher toute opration non autorise).
typedef struct __pile { int elements[TAILLE]; /* donnees, ici un tableau int *dessus; /* bas de la pile; ne varie pas int *dessous; /* haut de la pile; variable } *pile; pile void int void creer_pile(); empiler(pile ma_pile, int i); depiler(pile ma_pile); detruire_pile(pile ma_pile);
*/ */ */
/** initialiser une pile **/ pile creer_pile() { pile nouvelle_pile = (pile) NULL; nouvelle_pile = (pile)calloc(1, sizeof(struct __pile)); if (nouvelle_pile == (pile)NULL) { fprintf(stderr, "Creation de pile impossible\n"); perror("Message systeme : "); exit(1); } /* bas de la pile */ nouvelle_pile->dessous = &(nouvelle_pile->elements)[0]; /* au debut la pile est vide */ nouvelle_pile->dessus = &(nouvelle_pile->elements)[0];
45
/** empiler une valeur **/ void empiler(pile ma_pile, int i) { (ma_pile->dessus)++; if( ma_pile->dessus == ((ma_pile->dessous) + TAILLE) ) { printf("Debordement de pile\n"); exit(1); } *(ma_pile->dessus) = i; }/* empiler() */
/** depiler une valeur **/ int depiler(pile ma_pile) { if(ma_pile->dessus == ma_pile->dessous) { printf("Assechement de pile\n"); exit(1); } (ma_pile->dessus)--; return(*((ma_pile->dessus)+1)); }/* depiler() */
/** destruction dune pile **/ void detruire_pile(pile ma_pile) { if (ma_pile == (pile)NULL) { fprintf(stderr, "Destruction de pile impossible\n"); return; }
46
free((void *)ma_pile); }/* detruire_pile() */
/** main() **/ void main(void) { int valeur_entree; pile une_pile; une_pile = creer_pile(); do { printf("\t\tEntrez une valeur a empiler \n \ (-1 pour sortir, 0 pour depiler) : "); scanf("%d", &valeur_entree); if(valeur_entree != 0) empiler(une_pile, valeur_entree); else printf("Valeur du dessus de pile : %d\n", depiler(une_pile)); } while(valeur_entree != -1); detruire_pile(une_pile); }/* main() */
Abstraction : extrait les dtails essentiels Intgralit garantit que les lments importants sont prsents Abstraction et intgralit : modules ncessaires et susants Ecacit amliore (on peut ajouter les modules de bas niveau indpendamment de ceux de niveau suprieur) La validabilit implique un dveloppement tel que le logiciel puisse tre aisment test, rendant le systme aisment modiable Validabilit et intgralit sont des proprits peu aises mettre en oeuvre. Un fort typage aide la validabilit bilit.
47
V.4
de 7 2 entits la fois au sein dun mme niveau. Un objet du monde rel devient un objet informatique ; abstraction et dissimulation dinformations sont la base de tout dveloppement orient objet Les spcications et leur passage en objets est un cycle en quasi-perptuelle volution. Il faut donc un schma cyclique o lon peut modier seulement une partie sans toucher au reste. On oprera donc comme suit : 1. Identier les objets et leurs attributs. Les objets dcoulent des groupes nominaux utiliss pour les dcrire (exemple : une pile) 2. Identier les oprations. Ce sont les verbes que lon utilise pour dcrire les actions possibles sur lobjet (exemple : creer_pile(), empiler(), depiler()) 3. tablir la visibilit. Par exemple un objet pourra avoir accs toutes les actions dune pile mais ne pourra pas voir les fonctions dallocation dont la pile se sert 4. tablir linterface. Description de chaque opration avec ses arguments 5. Implanter chaque objet.
VI.1
50
complexit est connue depuis trs longtemps : divide et impera (diviser pour rgner) [Dij79]. Lorsque lon conoit un logiciel complexe. il est impratif de le dcomposer en parties de plus en plus petites, chacune delles pouvant tre ensuite ane indpendamment. Dans la dcomposition algorithmique, on ralise une analyse structure descendante o chaque module du systme est une tape majeure de quelque processus gnral.
les entits fondamentales du domaine du problme. Le monde est alors vu comme une srie dagents autonomes qui collaborent pour raliser un certain comportement de plus haut niveau. De ce point de vue, un objet est une entit tangible, qui rvle un comportement bien dni. Les objets eectuent des oprations, que nous leur demandons en leur envoyant des messages. Laquelle des deux dcompositions est-elle la plus meilleure ? Les deux sont importantes, la vue algorithmique souligne lordre des vnements, alors que la vue oriente objets met laccent sur les agents responsables dune action et sur les sujets dune opration. Mais on ne peut construire un systme logiciel complexe des 2 manires, car elles sont orthogonales. On utilise lune, avec lautre en ligrane pour exprimer lautre point de vue.
1.4 Terminologie
De manire plus prcise La programmation oriente objets est une mthode mise en oeuvre dans laquelle les programmes sont organiss comme des ensembles dobjets cooprants. Chacun reprsente une instance dune certaine classe, toutes les classes tant des membres dune hirarchie de classes unie par des relations dhritage. On dsigne donc par langage orient objets un langage rpondant aux conditions suivantes : Un langage orient objets est tel que : Il supporte des objets qui sont des abstractions de donnes avec une interface doprations nommes et un tat interne cach, les objets ont un type associ (la classe),
51
les types (les classes) peuvent hriter dattributs venant de super-types (les super-classes). La conception oriente objets est une mthode de conception incorporant le processus de dcomposition orient objets et une notation permettant de dpeindre la fois les modles logiques et physiques, aussi bien que statiques et dynamiques du systme concevoir. Lanalyse oriente objets est une mthode danalyse qui examine les besoins daprs la perspective des classes et objets trouvs dans le vocabulaire du domaine du problme.
entit tangible reprsentant quelque comportement bien dni. Nous verrons quun objet a un tat, un comportement et une identit ; la structure et le comportement dobjets similaires sont dnis dans leur classe commune. Les termes instance et objet sont interchangeables. Une classe est un squelette pour un ensemble dobjets qui partagent une structure commune et un comportement commun.
VI.2
clarations doprations (ou signatures de mthodes) et de descriptions extensives doprations (ou corps de mthodes) Ce que lon peut rsumer par la formule suivante
o sig_methi dsigne la signature de mthode n i et corps_methi dsigne le corps de mthode n i. Un type est par essence une entit statique, par opposition un objet, de nature dynamique. Dune certaine manire, le type est un squelette, lobjet son incarnation.
52
des attributs. Dans un type Point, les coordonnes sont des attributs
Matrice n m
class Matrice { int nombreLignes, nombreColonnes; double valeurs[]; ... }
du nom de la mthode suivi de ses paramtres et prcd de son type de retour. Par exemple, lopration daddition de matrices peut se dclarer comme suit :
Matrice ajouterMatrice(Matrice m1, Matrice m2)
des oprations (primitives ou non) quelle ralise. Une opration primitive est une instruction du langage.
53
tiques) de lobjet plus les valeurs courantes (gnralement dynamiques) de chacune de ces proprits. Une proprit est une caractristique naturelle ou discrminante, un trait, une qualit ou une particularit qui contribue rendre un objet unique. Par exemple, dans un distributeur, un numro de srie est une proprit statique et la quantit de pices quil contient est une valeur dynamique.
54
de changement dtat et de transmission de messages. Gnralement, un message est simplement une opration quun objet eectue sur un autre, bien que le mcanisme utilis soit quelque peu dirent. Dans la suite, les termes opration et message sont interchangeables. Dans la plupart des langages orients objets et bass sur objets, les oprations que les clients peuvent eectuer sur un objet sont typiquement appeles des mthodes, qui font partie de la classe de lobjet. La transmission de messages est une partie de lquation qui dnit le comportement dun objet. Ltat dun objet inuence aussi son comportement. Par exemple, dans le cas dun distributeur de boissons, nous pouvons dclencher une action (appuyer sur un bouton) pour raliser notre slection. Si nous navons pas introduit susamment dargent, il ne se passera probablement rien. Si nous avons mis assez dargent, la machine lencaissera et nous servira une boisson (modiant ainsi son tat). Nous pouvons donc aner la notion dtat : Ltat dun objet reprsente les eets cumuls de son comportement. La majorit des objets intressants nont pas dtat entirement statique. Ils contiennent des proprits dont les valeurs sont lues et modifes en fonction des actions sur ceux-ci.
tique, nous avons constat quun client eectuait typiquement 5 sortes doprations sur un objet. Les 3 les plus courantes sont les suivantes : Modicateur une opration qui altre ltat dun objet Slecteur une opration qui accde ltat dun objet, mais qui naltre pas celui-ci. Itrateur une opration qui permet daccder toutes les parties dun objet dans un ordre bien dni. Deux autres types dopration sont courants : Constructeur une opration qui cre un objet et/ou initialise son tat. Destructeur Une opration qui libre ltat dun objet et/ou dtruit lobjet lui-mme. Avec des langages orients objets, comme Java ou Smalltalk, les oprations peuvent seulement tre dclares comme mthodes (c..d. au sein dune classe), le langage ne nous autorisant pas dclarer des procdures
55
ou des fonctions spares de toute classe. Ce nest pas le cas en C++ et en AdA, qui autorisent le programmeur crire des oprations en dehors de toute classe.
dernier dnit la totalit des comportements autoriss pour lobjet. Il est utile de diviser ce protocole en groupes logiques de comportements. Ces groupes dsignent les rles que lobjet peut jouer ; un rle sapparente un masque port par lobjet et dnit un contrat entre une abstraction et un client. Les responsabilits dun objet sont constitues dune part de la connaissance que lobjet maintient et dautre part des actions quil peut raliser. En dautres termes, Ltat et le comportement dun objet dnissent lensemble des rles quil peut jouer, lesquels dnissent les responsabilits de labstraction. La majorit des objets jouent plusieurs rles au cours de leur existence, par exemple : Un compte bancaire peut tre crditeur ou dbiteur, ce qui inue sur le comportement dun retrait dargent. Durant une mme journe, un individu peut jouer le rle de mre, de mdecin, de jardinier.
tions sont invoques est important. Chaque objet peut donc tre vu comme une petite machine ou un automate tat nis quivalent. Les objets peuvent tre actifs ou passifs. Un objet actif contient sa propre tche de contrle, contrairement un objet passif. Les objets actifs sont gnralement autonomes, ce qui signie quils peuvent prsenter un certain comportement sans quun autre objet agisse sur eux. Les objets passifs ne peuvent subir un changement dtat que lorsque lon agit explicitement sur eux.
autres objets.
56
gaux au sens de leur rfrences (les pointeurs internes qui rfrencent les donnes de lobjet en mmoire) ou au sens de leur contenu (galit de leur tat), bien quils soient situs des emplacements mmoire dirents.
ensemble des variables dinstance (pointeur sur) la mthode dinstance n i (pointeur sur) un emplacement mmoire contenant ltat et des rfrences internes vers les oprations (pointeurs sur les mthodes) Exemple dobjet, de type tasse caf. Des attributs dune tasse caf pourront tre : sa couleur, la quantit de caf quelle contient, sa position dans le caf (la brasserie ou le bar) Tasse caf est un type et la tasse caf rouge qui contient actuellement 38 millilitres de caf et qui se trouve sur la dernire table du fond est un objet. Rouge, 38 millilitres et sur la dernire table du fond constituent ltat de cet objet. Un type, ou une classe sert de modle partir duquel on peut instancier (crer) des objets contenant des variables dinstance et des mthodes dnies dans la classe.
opi ref
o etat
VI.3
Relations
implantation.
Linterface dun objet est constitue des messages quil peut accepter dautres
comportement en rponse aux messages reus. Dans un monde orient-objets, un objet expose son interface aux autres objets, mais garde son implantation prive. Limplantation doit donc tre spare de linterface. De lextrieur, le seul moyen pour interagir avec
VI.3 Relations
57
un objet est de lui envoyer un message (dexcuter lune de ses oprations). La sparation de linterface et de limplantation permet aux objets davoir la responsabilit de grer leur propre tat. Les autres objets ne peuvent manipuler cet tat directement et doivent passer par des messages (ou oprations). Lobjet qui reoit un message peut dcider de changer ou non son tat. Par contre, il ne contrle pas quel instant il va recevoir des messages. Un aspect fondamental de la programmation oriente objet est que chaque objet dune classe particulire peut recevoir les mmes messages. Linterface externe dun objet ne dpend donc que de sa classe.
La gnralisation/spcialisation, dsignant une relation est un. Par exemple, une rose est une sorte de eur : une rose est une sous-classe plus spcialise de la classe plus gnrale de eur. Lensemble/composant, dnotant une relation partie de. Par exemple, un ptale est une partie dune eur. Lassociation, traduisant une dpendance smantique entre des classes qui ne sont pas relies autrement. Par exemple, une eur et une bougie peuvent ensemble servir de dcoration sur une table. La plupart des langages orients objets comprennent des cominaisons des relations suivantes entre classes : Association. Hritage. Agrgation. Utilisation. Instanciation. Mta-classe.
Une association dnote une dpendance smantique. Par exemple, les objets de type Client et ceux de type Facture peuvent tre associs dans le cas dune commande dun produit. On associe souvent ce type de relation une cardinalit. Lexemple prcdent exhibe une cardinalit de 1 pour n, un client pouvant avoir plusieurs factures qui lui sont associes. On distingue les cardinalits : 1 pour 1, 1 pour n,
58
Support de cours Java n pour n. Une association 1 pour 1 est trs troite. Par exemple entre la classe Facture et la classe TransactionCarteBancaire.
ou le comportement dni dans une (hritage simple) ou plusieurs (hritage multiple) autres classes. On nomme super-classe la classe de laquelle une autre classe hrite. On appelle une classe qui hrite dune ou plusieurs classes une sous-classe. Par exemple, prenons une classe Surface2DSymetrique. Considrons les classes Pave2D et Disque hritant de Surface2DSymetrique. Lhritage dnit donc une hirarchie de la forme est un entre classes. Cest le test de vrit de lhritage. Dans une relation dhritage, les sous-classes hritent de la structure de leur super-classe. Par exemple, la classe Surface2DSymetrique peut avoir comme champs : labscisse de son centre de symtrie x lordonne de son centre de symtrie y sa taille size sa couleur color Et les classes Pave2D et Disque hriteront de ces champs. Une sous-classe peut dnir dautres champs qui viennent sajouter ceux hrits des superclasses. De plus, toujours dans une relation dhritage, les sous-classes hritent du comportement de leur super-classe. Par exemple, la classe Surface2DSymetrique peut avoir comme oprations : getSize() pour obtenir la taille de la surface getX() pour obtenir labscisse du centre de gravit getY() pour obtenir lordonne du centre de gravit setXY() pour xer la position de la surface setColor() pour xer la couleur de la surface Et les classes Pave2D et Disque hriteront de ces champs. Une sous-classe peut dnir dautres oprations qui viennent sajouter celles hrites des super-classes. En outre, une sous-classe peut rednir tout ou partie des oprations hrites des super-classes. Le polymorphisme est un mcanisme par lequel un nom peut dsigner des objets de nombreuses classes direntes, tant quelles sont relies par une super-classe commune. Tout objet dsign par ce nom est alors capable de rpondre de direntes manires un ensemble commun doprations.
VI.3 Relations
59
inclusion de valeur, auquel cas lobjet inclus ne peut exister sans linstance de lobjet englobant, inclusion de rfrence, le lien tant plus indirect ; on peut alors crer et dtruire indpendamment les instances de chaque classe. On peut avoir une reprsentation daggrgation plus indirecte, seulement smantique. Par exemple, on peut dclarer une classe Investisseur contenant une cl dans une base de donnes qui permette de retrouver les actions que possde linvestisseur. Le test de relation daggrgation est le suivant : si (et seulement si) il existe une relation ensemble/composant entre deux objets, il doit y avoir une relation daggrgation entre leurs classes respectives.
VII.1
p. 49) : Classe : squelette ; structure de donnes et code des mthodes ; statique, sur disque Objet : incarnation ; tat, comportement, identit ; dynamique, en mmoire Une classe dnit gnralement deux choses : les structures de donnes associes aux objets de la classe ; les variables dsignant ses donnes sont appels champs. les services que peuvent rendre les objets de cette classe qui sont les mthodes dnies dans la classe. Une Classe java est dclare par le mot cl class, plac devant lidenticateur de la classe (son nom).
61
62
... }
Une mthode est constitue de :
un nom constitu par un identicateur des paramtres formels : ceux-ci sont spars par des ,. Lorsque la mthode na pas de paramtre, contrairement au langage C , il ne faut pas prciser void. Le nombre de paramtres est xe : il nest pas possible de dnir des mthodes arguments variables. du type de retour est soit void (si la mthode ne retourne aucune valeur), soit un type primitif ou une rfrence vers un objet. du corps de la mthode. Exemple de classe dcrivant un cercle
class Cercle { // champs : rayon du cercle double r; // methode de calcul dune surface double calculeSurface() { return(3.1416*r*r); } }// Fin de class Cercle
63
Les dclaration et implantation dune mthode sont dans le mme chier. Ceci donne parfois de gros chier source (.java), mais il est plus facile (pour la maintenance) davoir les spcication, dclaration et implantation au mme endroit.
Cette classe dnit une classe Bonjour qui ne possde quune seule mthode. La mthode main() doit tre dclare static et public pour quelle puisse tre invoque par linterprteur Java. Largument args est un tableau de String qui correspond aux arguments de la ligne de commande lors du lancement du programme. args[0] est le 1er argument, args[1] est le 2ime argument, . . .
1.5 Compilation
Avant de pouvoir excuter ce programme, il faut tout dabord le compiler,
par exemple avec la commande javac (sous le JDK standard, c..d. lenvironnement de base).
javac Bonjour.java
La commande javac traduit le code source en code intermdiaire (p-code) java. Ce code (une forme dassembleur gnrique) est videmment indpendant de la plate forme sur laquelle il a t compil.
64
1.6 Excution
Autant de chiers que de classes qui ont t dnies dans le chier source sont produits. Les chiers compils ont lextension .class. Enn, pour excuter ce programme, il faut utiliser linterprteur de code Java et lui fournir le nom de la classe publique que lon veut utiliser comme point de dpart de notre programme (celle contenant la mthode main(...)), ans lextension.
java Bonjour
teurs est impossible en java. Seule chose permise : changer la valeur de la rfrence pour pouvoir faire rfrence un autre objet. Plus prcisment, une rfrence pointe sur une structure o se trouve des informations sur le type ainsi que ladresse relle des donnes de linstance dobjet.
Ligne 2 : tout changement p2 aecte lobjet rfrenc par p. p2 = p : aucune copie de lobjet ou allocation mmoire. Ligne 3 : dcrochage de p de lobjet originel. p2 permet toujours dy accder. Objet qui nest plus rfrenc le ramasse-miettes (garbage collector) rcupre automatiquement la mmoire associe.
65
faut dnir une instance (dobjet) de cette classe. Or les objets ne sont accessibles qu travers des rfrences . Donc une dnition qui spcie un objet comme une variable ayant le type de la classe choisie ne fait que dnir une rfrence vers un ventuel objet de cette classe.
Date d;
La variable d reprsente une rfrence vers un objet de type Date. En interne, cela rserve de la place pour le pointeur sous-jacent la rfrence d. Mais cela ne rserve pas de place mmoire pour une variable de type Date. Si lon veut une instance dobjet eective, il faut la crer explicitement avec le mot cl new et le constructeur de la classe Date.
Date d; d = new Date();
jet. Pour acher la date contenue dans lobjet d, on lui envoie le message imprimer : d.imprimer() ; De telles mthodes sont appeles mthodes dinstance.
66
y = b; } }
En C, mthode sans paramtre : nommethode(void). illgal en java. Les objets sont passs par rfrence (rfrences dinstances un objet passs par valeur). Les types primitifs sont passs par valeur. Les mthodes java sont donc similaires aux fonctions virtuelles du C++.
1.14 Constructeurs
Mme nom que celui de la classe. Pas de type de retour (pas mme void). Classe dcrivant un cercle
class Cercle { double r; // champs : rayon du cercle // Constructeur : initialisation des champs Cercle(double nouvRayon) { r = nouvRayon; } double calculeSurface() { return(3.1416*r*r); // methode de calcul } }// Fin de class Cercle
Exemple animalier
67
class Point { int x, y; // constructeur exhaustif Point(int x, int y) { this.x = x; // var dinstance Point.x this.y = y; } // Appel du constructeur exhaustif Point() { this(-1, -1); // Point(int x, int y) } }
class Chat { String nom; int age; Color[] couleurPelage; float tauxRonronnement;
// // // //
public Chat(String sonNom, int sonAge, float sonTauxRonron, Color[] sesCouleurs) { nom = sonNom; age = sonAge; tauxRonronnement = sonTauxRonron; couleurPelage = sesCouleurs; } public Chat() { this(new String("minou"), 1, 0.5, {Color.black, Color.white});
68
} }
VII.2
Hritage
2.1 Hritage
Les descendants par hritage sont nomms des sous classes. Le parent direct
est une super classe. Une sous classe est une version spcialise dune classe qui hrite de toutes les variables dinstance et mthodes. Mot-cl extends
class Point3D extends Point { int z; Point3D(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } Point3D() { Point3D(-1, -1, -1); } }
Syntaxe gnrique
class NomClasse { type variableInstance1; type variableInstanceN; type nomMethode1(liste-parametres) { corps-methode; } type nomMethodeN(liste-parametres) { corps-methode; } }
Pas dhritage multiple, pour des raisons de performances et de com-
69
De la mme manire que lon peut assigner une variable int un byte, on
peut dclarer une variable de type Object et y stocker une rfrence une instance de toute sous classe dObject.
VII.3
Surcharge, rednition
class Point3D extends Point { int z; Point3D(int x, int y, int z) { super(x, y); // Appel de Point(x,y). this.z = z; } }
Cet appel au constructeur de la classe mre doit tre la 1ire ligne du
constructeur. super peut galement se rfrer aux mthodes de la super classe : super.distance(x, y) appelle la mthode distance() de la super classe de linstance this. Exemple animalier (voir lexcellent ouvrage le mystre des chats peintres de Heather Busch et Burton Silver, http ://www.monpa.com/wcp/index.html)
class ChatPeintre extends Chat { // Variables dinstances String style; int coteMoyenne; // cote moyenne dune oeuvre // Constructeurs public ChatArtiste(String sonNom, int sonAge, float sonTauxRonron, Color[] sonPelage, String sonStyle, int saCote) { super(sonNom, sonAge, sonTauxRonron, sonPelage); style = sonStyle; coteMoyenne = saCote; } // Methodes public peindre() { ...
70
} }
71
parente) ; la mthode miauler() est dnie dans Chat. La mthode peindre() nest dnie que dans ChatPeintre.
Chat gouttiere = new Chat("zephir", 1, 0.9); ChatPeintre moustacheDeDali = new ChatPeintre("dali", // nom de lartiste 2, // son age 0.1, // son taux rr {Color.white, Color.black}, "aLaDali",// son style 20000); // sa cote moyenne moustacheDeDali.peindre(); gouttiere.peindre(); // valide // illegal
// true System.out.print(gouttiere instanceof Chat); // true System.out.print(moustacheDeDali instanceof Chat); // false System.out.print(gouttiere instanceof ChatPeintre); moustacheDeDali = null; // false System.out.print(moustacheDeDali instanceof ChatPeintre);
Transtypage (ou cast en anglais) permet de changer le type, lorsque cela
est permis.
Chat ch = new Chat("zephir", 1, 0.9); ChatPeintre chP; chP = ch; // Erreur de compilation if (ch instanceof ChatPeintre)// Bonnes manieres chP = (ChatPeintre)ch; // transtypage
mtres. Deux mthodes dune mme classe de mmes nom et signature de type est illgal. Exemple de surcharge
72
class Chat { .... void vieillir() { age += 1; } void vieillir(int n) { age += n; } // Surcharge de methode
73
// Surcharge
class Point3D extends Point { int z; Point3D(int x, int y, int z) { super(x, y); // Appel de Point(x,y) this.z = z; } double distance (int x, int y, int z) { int dx = this.x - x; int dy = this.y - y; int dz = this.z - z; return Math.sqrt(dx*dx + dy*dy + dz*dz); } double distance(Point3D other) { // Surcharge return distance(other.x, other.y, other.z); } double distance(int x, int y) { // Redefinition double dx = (this.x / z) - x; double dy = (this.y / z) - y; return Math.sqrt(dx*dx + dy*dy); } } class Point3DDist { public static void main(String args[]) { Point3D p1 = new Point3D(30, 40, 10); Point3D p2 = new Point3D(0, 0, 0); Point p = new Point(4, 6); System.out.println("p1.distance(p2) = " + p1.distance(p2)); System.out.println("p1.distance(4, 6) = " + p1.distance(4, 6)); System.out.println("p1.distance(p) = " + p1.distance(p));
74
} }
Appel de distance sur un Point3D (p1) : excution de distance(Point p) hrite de la super classe (mthode non rednie). Mais ensuite appel de distance(int x, int y) de Point3D, pas de Point.
dans laquelle la mthode courante sexcute : rpartition de mthode dynamique.
Le compilateur vrie que Parent a une mthode appel(), lenvironnement dexcution remarque que la rfrence moi est en fait vers une instance dEnfant appel de Enfant.appel() Il sagit dune forme de polymorphisme lexcution. Cela permet des bibliothques existantes dappeler des mthodes sur des instances de nouvelles classes sans recompilation.
75
riables, convention de majuscules final int FILE_QUIT = 1 ; Les sous classes ne peuvent rednir les mthodes final. Petites mthodes final peuvent tre optimises (appels en ligne par recopie du code). final pour les variables est similaire au const du C++. Il ny a pas dquivalent de final pour les mthodes en C++.
de la librer. Ajout dune mthode finalize() la classe. Appele chaque libration dune instance dobjet de cette classe.
peut utiliser this ou super. Ne peut utiliser une variable dinstance. Variables static : visibles de toute autre portion de code. Quasiment des variables globales. utiliser avec parcimonie . . . Bloc static : excut une seule fois, au premier chargement de la classe. Exemple
class Statique { static int a = 3; static int b; static void methode(int x) { System.out.println("x = " + x + ", a = " + a + ", b = " + b); } static { System.out.print("Initialisation" + " du bloc statique"); b = a * 4; } public static void main(String args[]) { methode(42);
76
} }
Lachage est
Prompt > java Statique Initialisation du bloc statique x = 42, a = 3, b = 12
Initialisation de a et b. Excution du bloc static. Appel de main(). Appel dune variable ou mthode static par le nom de la classe
class ClasseStatique { static int a = 42; static int b = 99; static void appel() { System.out.println("a = " + a); } } class StatiqueParNom { public static void main(String args[]) { ClasseStatique.callme(); System.out.println("b = " + ClasseStatique.b); } }
Exemple animalier
class Chat { String int Color[] float static int nom; age; couleurPelage; tauxRonronnement; ageSevrage = 1; // // // // // nom annees couleurs de 0 a 1 statique
boolean estAdoptable() { if (age > ageSevrage) { return true; } else { return false; } } }
77
classes : mthodes abstraites. Cest la responsabilit de sous classe. Toute classe contenant des mthodes abstraites (mot cl abstract) doit tre dclare abstraite. Les classes abstraites ne peuvent tre instancies par new. Pas de constructeurs ou de mthodes static. Une sous classe dune classe statique soit implante toutes les mthodes abstraites, soit est elle-mme abstraite. Exemple
abstract class ParentAbstrait { abstract void appel(); void moiaussi() { System.out.print("Dans ParentAbstrait.moiaussi()"); } } class EnfantConcret extends ParentAbstrait { void appel() { System.out.print("Dans EnfantConcret.moiaussi()"); } } class AbstractionMain { public static void main(String args[]) { ParentAbstrait etre = new EnfantConcret(); etre.appel(); etre.moiaussi(); } }
VII.4
Paquetages et interfaces
4.1 Paquetages
la fois un mcanisme de nommage et un mcanisme de restriction de
78
une unique declaration de classe publique declarations de classes privees (optionnel)
tage par dfaut, sans nom. Une classe dclare dans le paquetage monPaquetage le source doit tre dans le rpertoire monPaquetage (il y a distinction minuscule-majuscule). Syntaxe gnrique :
package pkg1[.pkg2[.pkg3]] ;
Par exemple package java.awt.image ; doit tre stock dans java/awt/image (sous UNIX), java\awt\image (sous Windows) ou java :awt :image (sous Macintosh). La racine de toute hirarchie de paquetage est une entre de la variable denvironnement CLASSPATH. Ayant une classe ClasseTest dans un paquetage test, il faut soit se mettre dans le rpertoire pre de test et lancer java test.ClasseTest, soit ajouter le rpertoire test la variable CLASSPATH :
CLASSPATH=.;c:\code\test;c:\java\classes
soit lancer :
java -dclasspath=.;c:\code\test;c:\java\classes ClasseTest
Chargement de gros paquetages perte de performance en compilation. Pas deet lexcution. Toutes les classes livres dans la distribution java sont dans le paquetage java. Les Classes de base du langage se trouvent dans java.lang. Il y a une importation implicite de import java.lang.* Deux classes de mme nom dans 2 paquetages dirents imports avec * : le compilateur ne dit rien jusqu lutilisation dune des classes, o cest une erreur de compilation. Utilisation de noms complets. Au lieu de
import java.util.*; class MaDate extends Date { ... }
VII.4 Paquetages et interfaces on peut utiliser class MaDate extends java.util.Date ...
79
Dclar public : peut tre vu de partout. Dclar private : ne peut tre vu en dehors dune classe. Pas de modicateur : visible des sous classes et des autres classes du
sous classes. Dclar private protected : ne peut tre vu que des sous classes. protected pas la mme signication quen C++. Plutt similaire au friend du C++. Le protected du C++ est mul par private protected en java. Exemple animalier
class Chat { // Les differents champs sont protected (et non private), // de facon a etre visibles des sous-classes protected String nom; // nom du fauve protected int age; // en annees protected Color[] couleurPelage; // ses couleurs
80
// Les constructeurs doivent etre vus de partout public Chat(String sonNom, int sonAge, float sonTauxRonron, Color[] sesCouleurs) { nom = sonNom; age = sonAge; tauxRonronnement = sonTauxRonron; couleurPelage = sesCouleurs; } public Chat() { this(new String("minou"), 1, 0.5, {Color.black, Color.white}); }
// Accesseurs public int retournerAge() { return(age); } public String retournerNom() { return(nom); } public Color[] retournerCouleurPelage() { return(couleurPelage); } public float retournerTauxRonron() { return(tauxRonronnement); } // Autres methodes public void vieillir() { age += 1; } public void vieillir(int n) { age += n; } public boolean estAdoptable() { if (age > ageSevrage) { return true; } else { return false; } }
81
4.4 Interfaces
Interfaces : comme des classes, mais sans variable dinstance et des m-
la classe doit fournir limplantation de toutes les mthodes de linterface. La signature de type doit tre respecte. Les interfaces vivent dans une hirarchie dirente de celles des classes deux classes sans aucun lien hirarchique peuvent implanter la mme interface. Les interfaces sont aussi utiles que lhritage multiple, mais donnent du code plus facile maintenir. En eet, ne repose pas sur des donnes, juste sur des mthodes. Syntaxe gnrique
interface nom { type-retour nom-methode1(liste-parametres); type nomvariable-finale = valeur; }
Toutes les mthodes implantant une interface doivent tre dclares public. Variables dclares lintrieur dune interface implicitement final.
82
corps-de-classe }
Les crochets dsignent des mots optionnels Exemple
interface Callback { void callback(int parametre) { } class Client implements Callback { void callback(int p) { System.out.println("Callback de " + p); } }
terface comme type au lieu dune classe. Toute instance dune classe implantant cette interface peut tre stocke dans cette variable. Si lon veut appeler une mthode via une telle variable, limplantation correcte sera appelle selon linstance courante. Les classes peuvent donc tre cres aprs le code qui les appelle. Cette technique de rsolution dynamique de mthode est coteuse en temps. Aspect dencapsulation
class TestInterface { public static void main(String args[]) { Callback c = new Client(); c.callback(12); } } c ne peut tre utilis que pour accder la mthode callback() et non un autre aspect de Client.
On peut dclarer des variables rfrences des objets utilisant une in-
VIII Exceptions
Rfrences bibliographiques
The Java Language Specication, J. Gosling, B. Joy et G. Steele [GJS96]
VIII.1
un objet reprsentant cette exception est cr ; cet objet est jet (thrown) dans la mthode ayant provoqu lerreur. Cette mthode peut choisir : de grer lexception elle-mme, de la passer sans la grer. De toutes faons lexception est capte (caught) et traite, en dernier recours par lenvironnement dexcution Java. Les exceptions peuvent tre gnres par lenvironnement dexcution Java, manuellement par du code. Les exceptions jetes (ou leves) par lenvironnement dexcution rsultent de violations des rgles du langage ou des contraintes de cet environnement dexcution.
83
84
dans un bloc prcd de linstruction try. Le code peut capter cette exception en utilisant catch et la grer. Les exceptions gnres par le systme sont automatiquement jetes par lenvironnement dexcution Java. Pour jeter une exception manuellement, utiliesr throw. Toute exception qui est jete hors dune mthode doit tre spcie comme telle avec throws. Tout code qui doit absolument tre excut avant quune mthode ne retourne est plac dans un bloc finally.
1.3 Schma
Le schma est donc
try { // bloc de code a surveiller } catch (EceptionType1 exceptObj) { // gestionnaire dexception pour ExceptionType1 } catch (EceptionType2 exceptObj) { // gestionnaire dexception pour ExceptionType2 } ... finally { // bloc de code a executer // avant de sortir de la methode }
Exception : conditions exceptionnelles que les programmes utilisateur devraient traiter. Error : exceptions catastrophiques que normalement seul lenvironnement dexcution devrait grer. Une sous-classe dException, RuntimeException, pour les exceptions de lenvironnement dexcution.
85
programme :
class ExcepDiv0 { public static void main(String args[]) { int d = 0; int a = 42 / d; } }
Lorsque lenvironnement dexcution essaie dexcuter la division, il construit
un nouvel objet exception an darrter le code et de grer cette condition derreur. Le ux de code est alors interrompu et la pile dappels (des direntes mthodes invoques) est inspecte en qute dun gestionnaire dexceptions. Nayant pas fourni de gestionnaire au sein du programme, le gestionnaire par dfaut de lenvironnement dexcution se met en route. Il ache la valeur en String de lexception et la trace de la pile dappels :
/home/mounier> java ExcepDiv0 java.lang.ArithmeticException: / by zero at ExcepDiv0.main(ExcepDiv0.java:4)
tible de survenir. Juste derirre un bloc try, il faut mettre un bloc catch qui sert de gestionnaire dexception. Le paramtre de linstruction catch indique le type et le nom de linstance de lexception gre.
class ExcepDiv0 { public static void main(String args[]) { try { int d = 0; int a = 42 / d; } catch (ArithmeticException e) { System.out.println("Div par zero"); } } }
La porte dun bloc catch est restreinte aux instructions du bloc try imm-
diatement prcdent.
86
tructions catch les unes aprs les autres, dans lordre o elles ont t crites. Il faut donc mettre les exceptions les plus spciques dabord.
trow
TrhowableInstance ; Cette instance peut tre cre par un new ou tre une instance dune exception dja existante. Le ux dexcution est alors stopp et le bloc try immdiatement englobant est inspect, an de voir sil possde une instruction catch correspondante linstance gnre. Si ce nest pas le cas, le 2ime bloc try englobant est inspect ; et ainsi de suite. Exemple class ThrowDemo { static void demoproc() { try { throw new NullPointerException("demo"); } catch (NullPointerException e2) { System.out.print("attrapee ds demoproc()"); throw e2; } public static void main(String args[]) { try { demoproc(); } catch(NullPointerException e1) { System.out.print("attrapee ds main()"); } } }
gre pas, elle doit le spcier, de faon que ceux qui lappellent puissent se prmunir contre lexception.
87
Linstruction throws est utilise pour spcier la liste des exceptions quune
mthode est susceptible de gnrer. Pour la plupart des sous-classes dException, le compilateur forcera dclarer quels types dexception peuvent tre gnres (sinon, le programme ne compile pas). Cette rgle ne sapplique pas Error, RuntimeException ou leurs sousclasses.
Lexemple suivant ne compilera pas :
class ThrowsDemo1 { static void proc() { System.out.println("dans proc()"); throw new IllegalAccessException("demo"); } public static void main(String args[]) { proc(); } }
Ce programme ne compilera pas : parce que proc() doit dclarer quelle peut gnrer IllegalAccessException ; parce que main() doit avoir un bloc try/catch pour grer lexception en question.
Lexemple correct est :
class ThrowsDemo1 { static void proc() throws IllegalAccessException { System.out.println("dans proc()"); throw new IllegalAccessException("demo"); } public static void main(String args[]) { try { demoproc(); } catch(IllegalAccessException e) { System.out.println(e + "attrapee"); } } }
88
dException.
On peut alors utiliser ou rednir lune des mthodes, hrite de Throwable :
Outre le constructeur sans argument, un constructeur Exception(String message) avec un message derreur disponible via getMessage(). la mthode String getMessage() qui renvoie le message fourni au constructeur prcdent. la mthode String toString(), qui fournit une chane forme du nom de la classe de lobjet courant, suivi dun :, suivi du rsultat de getMessage() la mthode fillInStackTrace() qui enregistre dans lobjet courant des informations propos de la pile dappels en cours. la mthode void printStackTrace(PrintStream stream) qui envoie sur le ux stream le rsultat de toString(), suivi de la pile dappels enregistre par la mthode fillInStackTrace(). Si stream est absent, System.err est utilis. Une autre forme, void printStackTrace(PrintWriter stream) est disponible.
1.12 Conclusion
Le code suivant
FileInputStream fis; try { fis = new FileInputStream("readme.txt"); } catch (FileNotFoundException e) { fis = new FileInputStream("default.txt"); }
est plus propre que
#include <sys/errno.h>
89
IX.1
But Renvoie une vue en chane de caractres de this ; par dfaut, renvoie le nom de la classe suivi de son code de hachage. Renvoie le code de hachage associ lobjet. Teste lgalit, la plus smatiquement signicative possible. Renvoie une copie supercielle (champ champ) de lobjet (throws CloneNotSupportedException). Appele en libration mmoire (throws Throwable). Relche le moniteur de lobjet et rveille une thread bloque en attente de ce moniteur par un wait().
91
92
final void notifyAll()
impliquec1.hashCode() == c2.hashCode() Donc, si lon rednit equals(), on doit rednir galement hashCode().
de type Object.
Exemple sur des classes de nombres complexes :
public class Complexe { protected double partieReelle, partieImaginaire; public Complexe(double r, double i) { partieReelle = r; partieImaginaire = i; } public boolean equals(Object obj) { if(!(obj instanceof Complexe)) { return false;
93
tive. Vrier galement lidempotence (plusieurs valuations de x.equals(y) donne toujours le mme rsultat), et que null est absorbant : x.equals(null) est toujours false.
static InputStream in entre standard (par dfaut le clavier) static PrintStream out sortie standard (par dfaut lcran) static PrintStream err sortie erreur standard (par dfaut lcran) Mthodes :
methode() static long currentTimeMillis() static void exit(int status) static void gc() static void setIn(InputStream in) static void setOut(PrintStream out) static void setErr(PrintStream err)
But renvoie le nombre de millisecondes depuis le 1er janvier 1970. arrte la machine virtuelle java en cours dexcution. demande au ramasse-miettes de rcuprer la mmoire inutilise. rassigne lentre standard. rassigne la sortie standard. rassigne la sortie erreur standard.
94
void print(...)
IX.2
class TestMain { public static void main(String args[]) { for(int i = 0; i < args.length; i++) System.out.println("arg no " + i+1 + " : " + arg[i] + " de longueur : " + args[i].length()); } }
Par un appel dans une fentre Dos (resp. une fentre terminal Unix/Linux)
95
primitifs. Hritent de la classe abstraite Number. Les classes demballage des types primitifs sont : Boolean, Byte, Character, Short, Integer, Long, Float et Double. Mthode xxxValue(), o xxx est lun des noms de type primitf correspondant ; elle permet dobtenir une variable du type primitif correspondant.
Integer un = new Integer(1); int i = un.intValue();
Mthode parseXXX(String) o XXX est lun des noms de classe prcdent ;
elle permet dobtenir un objet de type numrique ou boolen partir dune chane de caractres. Par ex. parseDouble("2.5") ; renvoie un Double. Linverse est ralis par toString(). Les constantes MIN_VALUE et MAX_VALUE contiennent les valeurs minimale et maximale.
IX.3
Scanner (java.util.Scanner)
String au clavier.
Il sut de crer un objet Scanner avec en argument le ux lire, puis
Scanner sc = new Scanner(System.in); // Creation dun Scanner sur // le flux System.in (le clavier) int i = sc.nextInt(); // prise dun entier sur ce flux // (au clavier)
96
But Construit un objet de type Scanner produisant des valeurs partir du chier spci. Construit un objet de type Scanner produisant des valeurs partir du ux dentre spci. construit un objet de type Scanner produisant des valeurs partir de lentre spcie. Cette entre doit implanter linterface Readable, qui spcie une source de caractres. titre indicatif, lensemble des classes implantant cette interface est : BufferedReader, CharArrayReader, CharBuffer, FileReader, FilterReader, InputStreamReader, LineNumberReader, PipedReader, PushbackReader, Reader, StringReader. Construit un objet de type Scanner produisant des valeurs partir de la chane spcie.
Scanner(InputStream source)
Scanner(Readable source)
Scanner(String source)
correspond au type attendu. La chane XXX prcdente est lune des suivantes : BigDecimal, BigInteger, Boolean, Byte, Double, Float, Int, Long, Short, Line selon le type attendu, qui sera respectivement BigDecimal, BigInteger, boolean, byte, double, float, int, long, short pour les 9 premires, et une nouvelle ligne pour la dernire. Ainsi, hasNextInt() renvoie true si le prochain lexme est un int.
97
le type correspondant la chane XXX Ainsi, int nextInt() renvoie le prochain int, String nextLine() renvoie la prochaine ligne, int nextDouble() renvoie le prochain double, etc. La mthode boolean hasNext() renvoie true sil y a un prochain lexme. La mthode String next() renvoie le prochain lexme disponible.
But Ferme ce Scanner (le ux associ). Cherche la prochaine occurence du motif pattern, en ignorant les dlimiteurs. Renvoie true si le prochain lexme correspond au motif spci par pattern. Renvoie le prochain lexme sil correspond au motif spci par pattern. saute les entres qui correspondent au motif spci par pattern. Fixe le dlimiteur au motif spci par pattern.
98
System.out.println(s.next()); s.close();
99
IX.4
viewer). Diverses restrictions de scurit. Une applet na pas de mthode main(). On tend la classe java.Applet, en rednissant diverses mthodes. Une applet nest pas sous le contrle de lactivit (thread) dexcution : elle rpond lorsque le navigateur le lui demande. Donc, pour des tches longues, lapplet doit crer sa propre activit.
100
void stop() Applele lorsque lapplet est masque.
Une mthode hrite de Container : public void paint(Graphics g) que le navigateur appelle pour demander lapplet sa mise a jour graphique. Autres mthodes dApplet : String getAppletInfo() Pour obtenir des informations propos de lapplet String[][] getParameterInfo() Description des paramtres de lapplet. AudioClip getAudioClip(URL url) Renvoie une rfrence une instance dobjet de type AudioClip. void play(URL url) joue lAudioClip spci ladresse url. Image getImage(URL url) Renvoie une rfrence une instance dobjet de type Image.
x, y; size; color;
public Disk(int Xpos, int Ypos, int radius) { x = Xpos; y = Ypos; size = radius; color = Color.red; // Initialement rouge } // methodes public void public void public void fixant des attributs (modificateurs) setXY(int newX, int newY) { x = newX; y = newY;} setSize(int newSize) { size = newSize; } setColor(Color newColor) { color = newColor;}
// methodes accedant aux attributs (accesseurs) public int getX() { return public int getY() { return public int getSize() { return public Color getColor() { return // Afficher le disque public void paint(Graphics g) { g.setColor(color);
x; } y; } size; } color; }
101
// Dessiner le disque public void paint(Graphics g) { // Demander au navigateur dappeler la methode paint() // pour afficher le disque theDisk.paint(g); } public void start() { ; } public void stop() { ; } }// class DiskField
102
Exemples :
char desChars[] = {a, b, c, d, e, f }; String s1 = new String(desChars); String s2 = new String(desChars, 2, 3); s1 contient la chane "abcde" et s2 contient "cde". Le contenu du tableau est copi lorsque lon cre une chane partir dun tableau. Si lon modie le tableau aprs avoir cr la chane, le contenu de linstance de String restera inchang. Constructeur de recopie public String(String original). Il y a une syntaxe spciale pour les chanes qui permet une cration-initialisation rapide : String s = "abc"; System.out.println(s.length()); System.out.println("abcdef".length());
vent lieu des abus et rendant les gros programmes diciles lire. Il y a une exception cette rgle : loprateur +, qui existe galement pour les chanes. Le + agit alors comme un oprateur de concatnation, de faon augmenter la lisibilit. Par exemple :
String s = "Impossible " + "deternuer " + "les yeux ouverts.";
qui est exactement ce qui se passe lorsque le code est excut. On ne peut insrer de caractres dans une String, ni changer ceux qui y sont dja. Il nest pas possible non plus de faire de la concatnation. Les modications sont alors ralises sur une insantce de la classe soeur StringBuffer. Puis, il y a conversion en une String via la mthode toString().
103
davoir des performances plus grandes lors de manipulations (frquentes) de String. La priorit des oprateurs peut jouer des tours. Par exemple, la ligne suivante : String s = "quatre : " + 2 + 2 ; ne mettra pas "quatre : 4" dans s, mais "quatre : 22" ; en eet, "quatre : " + 2 est valu dabord, et le rsultat de ceci (une chane) est ensuite concatn 2. Il faut donc des parenthses : String s = "quatre : " + (2 + 2) ;
possibles.
append() appelle en fait la mthode valueOf(). Pour des types primitifs,
Cest une BONNE PRATIQUE que de rednir toString() pour ses propres classes. Exemple
class Point { int x, y; Point(int x, int y) { this.x = x; this.y = y; } public String toString() { return "Point[" + x + "," + y + "]"; } class toStringDemo { public static void main(String args[]) { Point p = new Point(20, 20); System.out.println("p = " + p); } }
4.7 Extraction
charAt() permet dextraire un caractre. Par ex. "abc".charAt(1) renvoie
b.
Pour extraire plus dun caractre, utiliser getChars(). Prototype :
104
Support de cours Java o srcBegin et srcEnd sont les indices de dbut et de n dextraction dans la String appelante. dst est le tableau de caractres contenant les caractres extraits. dstBegin est lindice partir duquel les caractres extraits vont tre copis dans dst. On peut galement convertir une String entire en tableau de caractres, laide de la mthode toCharArray() : char [] toCharArray() Enn, on peut convertir une String en tableau de byte, loctet de poids fort tant jet. ceci est utile pour exporter une chane en environnement ASCII (chier texte de protocoles internet par ex.) : byte [] getBytes()
4.8 Comparaison
equals(String s) teste si la String appelante est forme des mmes carac-
tres que s.
equalsIngnoreCase() ralise la mme chose sans faire de distinction minuscule-
majuscule.
regionMatches() compare une rgion de la String appelante une rgion
o toffset est lindice du dbut de comparaison de la chane appelante, other est lautre String, oofset est lindice de dbut de comparaison de lautre chane et len est la longueur de compraraison. Il existe une autre forme de regionMatches() qui peut ignorer la distinction majuscule-minuscule :
boolean regionMatches(int toffset, String other, int oofset, int eln);
4.9 Extraction/Comparaison
startsWith() (resp. endsWith() teste si la chane appelante commence (resp.
nit) par la chane fournie en paramtre. "Nabuchodonosor".endsWith("nosor") et "Nabuchodonosor".startsWith("Nabu") renvoient tous deux true. On peut galement spcier lindice de dbut de comparaison. Par exemple lexpression "HoueiNeng".startsWith("Neng", 5) renvoie true.
4.10 galit
La mthode equals() et loprateur == ralisent 2 oprations distinctes. equals() teste lgalit caractre caractre. == teste lgalit des rfrences (des adresses mmoires, ou pointeurs) pour
105
class EgalOuPasEgal { public static void main(String args[]) { String s1 = "Bonjour"; String s2 = new String(s1); System.out.println("s1 + "equals()" + s2 " -> " + s1.equals(s2)); System.out.println("s1 + "==" + s2 " -> " + (s1 == s2)); } }
est infrieure s (le paramtre), 0 si elles sont gales et un rsultat positif sinon. Moyen mnmotechnique : caller.compareTo(parameter) renvoie un entier du mme signe que caller - parameter.
une chane. 2 mthodes : indexOf() et lastIndexOf() sous plusieurs formes. Renvoient -1 en cas dchec.
int indexOf(int car);
renvoient lindice de la premire (resp. la deernire) occurence (c..d. apparition) du caractre car.
int indexOf(String str);
renvoient lindice du premier caractre de la premire (resp. la deernire) occurrence de la sous-chane str.
int indexOf(int car, int fromIndex);
renvoient lindice de la premire (resp. la dernire) occurrence du caractre car aprs (resp. avant) formIndex.
int indexOf(String str, int fromIndex);
renvoient lindice du premier caractre de la premire (resp. la dernire) occurrence de la sous-chane str aprs (resp. avant) formIndex.
106
utiliser un StringBuffer ou utiliser lune des mthodes suivantes, qui fournissent une copie modie dune String. substring() extrait une String dune autre. Par exemple :
"Bonjour a tous".substring(8) -> "a tous" "Bonjour a tous".substring(6, 5) -> "r a t"
concat() cre un nouvel objet, la concatnate de la chane appelante et
du paramtre :
"Bonjour".concat(" a tous") -> "Bonjour a tous"
replace(char carSrc, char carDst) remplace toutes les occurrences de carSrc
par carDst :
"Bonjour".replace(o, a) -> "Bajaur"
toLowerCase() et toUpperCase() : conversion en majuscules (resp. minus-
cules)
"Grenouille".toUpperCase() -> "GRENOUILLE" "BOEuf".toLowerCase() -> "bouef"
trim() enlve les espaces avant et aprs :
".trim() ->
But Concatnation de this celle fournie en argument. renvoie true si this contient la String argument. renvoie true si this est gale (au sens du contenu) la StringBuffer argument. Conversion dun tableau de caractres en String. Renvoie une String formatte (voir la documentation des API pour les chanes format). renvoie true si this correspond lexpression rgulire regex.
107
4.15 StringBuffer
Cest une chane modiable et susceptible de crotre et de dcrotre. Elle peuvent tre construites avec un constructeur :
sans paramtre ; ce qui rserve de la place pour 16 caractres ; avec un paramtre int, spciant la taille initiale du tampon ; avec un paramtre String, spciant le contenu initial et rservant de la place pour 16 caractres supplmentaires. La longueur sobtient par length() et la taille (en nombre de caractres) de la zone mmoire alloue (nomme la capacit du tampon) par capacity(). On peut pr-allouer de la place mmoire pour le tampon aprs quun StringBuffer ait t cr via ensureCapacity(). setLength() xe la taille du tampon mmoire. Si la chane tait plus longue que la nouvelle taille, elle est tronque. Si la nouvelle taille est plus longue, il y a remplissage par le caractre nul (unicode 0). charAt() renvoie un caractre n indice donn ; setCharAt() remplace un caractre un indice donn ; exemple :
class setCharAtDemo { public static void main(String args[]) { StringBuffer sb = new StringBuffer("Bonjour"); System.out.println("tampon avant : " + sb); System.out.println("charAt(1) avant : " + sb.charAt(1)); sb.setCharAt(1, a); sb.setLength(2); System.out.println("tampon apres : " + sb); System.out.println("charAt(1) apres : " + sb.charAt(1)); } }
qui ache
tampon avant : Bonjour charAt(1) avant : o tampon apres : Ba charAt(1) apres : a
getChars() fonctionne de la mme manire que son homologue de String.
Prototype identique :
108
void getChars(int srcBegin, int srcEnd, char [] dst, int dstBegin);
via +.
insert() insre une sous-chane n indice spci :
rsulte en
"Lenvie de tout sauf detre roi"
4.16 StringBuilder
Cest une chane modiable ayant les mme fonctionnalits que StringBuffer
mais sans synchronisation multi-threads. Il est conseill de lutiliser pour les applications mono-thread.
X.1
Stockage de paramtres (paquetage java.util.prefs). Classe BitSet, ensemble de bits arbitrairement grand. Des classes de gestion de zone gographique, de gestion des fuseaux horaires, de gestion du calendrier. Deux classes, dprcies, qui sont encore prsentes pour des raisons de compatibilit : Classe Vector, tableau dobjets de grandeur variable. Classe Properties, extension de Hashtable permettant de lire et dcrire des paires cl/valeur dans un ot. On trouve diverses interfaces : 10 interfaces associes aux conteneurs. EventListener, interface marqueur pour tous les gestionnaires dvnements. Comparator, pour les objets dnissant une relation dordre (via compare(Object o1, Object o2) et equals(Object o)). Observer, dnit la mthode update() ncessaire pour quun objet observe des sous-classes de Observable.
dordre induite.
int compare(Object o1, Object o2), orant le mme service que compareTo() de java.lang.Comparable boolean equals(Object o) testant lgalit de contenu. Les mthodes de comparaison doivent en gnral tre compatibles avec le test dgalit.
111
X.2
Type (interface) Collection, ou groupe dobjets. Type (interface) Map, table dassociation de couples cl-valeur. Dans Collection, deux sous-catgories : Type Set, ne pouvant contenir 2 fois le mme lment. Type List, lments indics par des entiers positifs. Dans Map, lobjet cl permet daccder lobjet valeur. Dans Map, couple cl-valeur : entre, de type Map.entry.
Interfaces
HashSet HashMap
LinkedList
values() renvoie une Collection des valeurs de la table keySet() renvoie un Set des cls de la table entrySet() renvoie un Map.entry des entres (paires cls/valeur) de la table Ce sont des vues de la table. Une modication dune vue est faite sur la table et vice versa. Dans Collection :
112
Support de cours Java toArray() renvoie un tableau contenant tous les objets de la collection. Ce nest pas une vue qui est renvoye. Dans la classe utilitaire Arrays : toArray() renvoie un tableau contenant tous les objets de la collection. Ce nest pas une vue qui est renvoye.
si la collection a t modie par lopration (un Set ne peut contenir 2 fois le mme lment). boolean addAll(Collection c) ajoute les lments de c la collection. void clear() vide la collection. boolean contains(Object o) teste si la collection contient o boolean containsAll(Collection c) teste si la collection contient la collection c boolean equals(Object o) teste lgalit de contenu de la collection avec o. int hashCode() renvoie le code de hachage de la collection. boolean isEmpty() teste si la collection est vide. Iterator iterator() renvoie un itrateur sur les lments de la collection. boolean remove(Object o) enlve une instance de o de la collection. boolean removeAll(Collection c) enlve de la collection tous les lments de c. boolean retainAll(Collection c) enlve de la collection tous les lments qui ne sont pas dans c (ne retient que ceux qui sont dans c). int size() renvoie le nombre dlments de la collection. Object[] toArray() renvoie un tableau contenant tous les lments de la collection. Object[] toArray(Object[] a) renvoie un tableau contenant tous les lments de la collection qui, lexcution, sont du type de a.
la cl spcie.
boolean containsValue(Object value) teste si la table contient une entre
avec la valeur spcie. Set entrySet() renvoie une vue ensembliste de la table.
113
boolean equals(Object o) teste lgalit de contenu de la table avec o. Object get(Object key) renvoie la valeur de la table correspondant la
cl key. int hashCode() renvoie le code de hachage de la table. boolean isEmpty() teste si la table est vide. Set keySet() renvoie une valeur ensembliste des cls de la table. Object put(Object key, Object value) associe la valeur value la cl key dans la table. Si une valeur tait dja associe, la nouvelle remplace lancienne et une rfrence vers la nouvelle est renvoye, sinon null est renvoy. void putAll(Map t) copie toutes les entres de t dans la table. Object remove(Object key) enlve lentre associe key de la table. Renvoie une rfrence sur la valeur retire ou null si elle nest pas prsente. int size() renvoie le nombre dentres (paires cl-valeur) de la table. Collection values() renvoie une vue de type Collection des valeurs de la table.
a.
Sinon, 4 groupes de mthodes principales (en tout 54 mthodes) :
Dans ce qui suit, Type dsigne soit un type primitif, soit Object. Voir la documentation Java des API pour les signatures prcises des mthodes. static int binarySearch(Type[] a, Type key) eectuant une recherche de key dans a. static int equals(Type[] a, Type[] b) teste lgalit lt. lt. de a et b. static int fill(Type[] a, Type val) aecte tous les lments de a val. static int sort(Type[] a) trie a selon un alogrithme quicksort modi.
comme optionnelles. On doit les rednir, mais le code peut juste lever une UnsupportedException. Si toutes ces mthodes lvent une telle exception, le conteneur est dit immuable.
114
(public static final) reprsentant des collections vides : EMPTY_MAP, de type Map, EMPTY_SET de type Set et EMPTY_LIST de type List. Singletons immuables : static Set singleton(Object o), singleton de type Set, static List singletonList(Object o), singleton de type List, static Map singletonMap(Object key, Object value), singleton de type Map. Vues immuables dun conteneur : static Collection unmodifiableCollection(Collection c), static ListunmodifiableList(List list), static MapunmodifiableMap(Map m), static SetunmodifiableSet(Set s), Vues immuables tries dun conteneur : static SortedMapunmodifiableSortedMap(SortedMap m), static SortedSetunmodifiableSortedSet(SortedSet s)
du langage et conserves pour des raisons de compatibilit), les implantations de Map et de Collection sont non synchronises. La classe Collections contient des mthodes renvoyant des vues synchronises : static Collection synchronizedCollection(Collection c), static List synchronizedList(List list), static Map synchronizedMap(Map m), static Set synchronizedSet(Set s). Et, pour les collections tries : static SortedMap synchronizedSortedMap(SortedMap m), static SortedSet synchronizedSortedSet(SortedSet s).
lments dune collection. Elle spcie 3 mthodes : boolean hasNext() renvoie true sil y a encore des lments dans la collection,
115
Object next() renvoie une rfrence sur linstance suivante de la collection, remove() enlve llment renvoy dernirement par litrateur. Ces itrateurs sont chec rapide (fail-fast)
Collection col = new ArrayList(); for (int i = 0; i < 10; i++) col.add(new Integer(i)); Iterator i1 = col.iterator(); System.out.println(i1.next());// Affiche 0 Iterator i2 = col.iterator(); System.out.println(i2.next());// Affiche 0 i1.remove(); // modification via i1 // leve une ConcurrentModificationException System.out.println(i2.next()); Le code suivant, par contre, sexcute normalement Collection col = new ArrayList(); for (int i = 0; i < 10; i++) col.add(new Integer(i)); Iterator i1 = col.iterator(); System.out.println(i1.next()); i1.remove(); System.out.println(i1.next()); Iterator i2 = col.iterator(); System.out.println(i2.next());
Noter que ce code est polymorphe (il fonctionne pour toute instance de Collection)
de AbstractCollection et dimplanter Iterator iterator() et int size() Pour dnir des conteneurs modiables, il faut implanter boolean add(Object o) et la mthode boolean remove(Object o) de litrateur renvoy par Iterator iterator().
116
AbstractList et AbstractSequentialList.
X.3
: implante) :
Map
Map
une valeur autant que possible unique, nomme code de hachage (voir ce qui suit pour une brve description du hachage). Le code hachage est alors utilis comme indice auquel les donnes associes la cl sont stockes.
On fournit un objet utilis comme cl et des donnes que lon souhaite voir lies cette cl.
117
La cl est hache. Le code de hachage rsultant est utilis comme indice auquel les donnes sont stockes dans la table. Les valeurs de codes de hachage sont caches (encapsules). Une table de hachage ne peut stocker que des cls qui rednissent les mthodes hashCode() et equals() de Object.
renvoyer.
equals() compare 2 objets. Beaucoup de classes courantes de Java implantent la mthode hashCode().
HashMap(), constructeur par dfaut, construit une table de hachage vide. HashMap(int capaciteInitiale), construit une table de hachage de taille initiale capaciteInitiale. HashMap(int capaciteInitiale, float tauxCharge), construit une table de hachage de taille initiale capaciteInitiale et de taux de remplissage tauxCharge ; ce taux, ncessairement compris entre 0.0 et 1.0, dtermine quel pourcentage de remplissage la table sera re-hache en une plus grande. Si tauxCharge nest pas spci, 0.75 est utilis.
hashCode() et equals() de Object. La valeur (int) renvoye par hashCode() est ensuite automatiquement r-
mment que possible les valeurs renvoyes entre 0 et capaciteInitiale, la taille initiale de la table.
118
But Rinitialise et vide la table de hachage. Renvoie un duplicata de lobjet appelant. Toute la structure de la table de hachage est copie, mais ni les cls, ni les valeurs ne le sont. Il sagit dune copie supercielle (shallow copy). Renvoie true sil existe une cl gale key (comme dtermin par la mthode equals()) dans la table de hachage. Renvoie false sinon. Renvoie true sil existe une valeur gale value (comme dtermin par la mthode equals()) dans la table de hachage. Renvoie false sinon. Renvoie une vue de type Collection des entres contenues dans la table. Renvoie une rfrence sur lobjet contenant la valeur associe la cl key. Si key nest pas dans la table de hachage, une rfrence null est renvoye. Renvoie true si la table de hachage est vide et false sinon. Renvoie une vue de type Set des cls contenues dans la table. Insre une cl et sa valeur dans la table de hachage. Renvoie null si la cl key nest pas dja dans la table de hachage, ou la valeur prcdente associe key si elle est dja dans la table de hachage. Copie toutes les entres de t dans la table. Dans le cas o une entre de mme cl tait dj prente dans la table, elle est crase par celle de t. Enlve la cl key et sa valeur. Renvoie la valeur associe key. Si key nest pas dans la table de hachage, une rfrence null est renvoye. Renvoie le nombre dentres la table de hachage.
void putAll(Map t)
int size()
119
Renvoie une forme achable dune table de hachage. Il sagit de la liste des entres de la table, chaque entre tant entoure daccolades et spare de la suivante par une virgule. Chaque entre est constitue de la forme achable (via toString()) de la cl, suivi du signe =, suivi de la forme achable (via toString()) de la valeur associe. Renvoie une vue de type Collection des valeurs de la table.
Collection values()
transforme une trs longue entre x en une sortie h nettement plus courte, (typiquement de 106 bits 200 bits) et qui a la proprit suivante : (Phach) : Il nest pas calculatoirement faisable de trouver deux entres direntes x et x telles que f (x) = f (x ). Lexpression lopration O nest pas calculatoirement faisable signie simplement tous les algorithmes actuellement connus pour raliser O sont de complexit exponentielle.
120
hachage f choisie la transforme en h = f (x) un indice entre 1 et p (il y a p indices dirents dans la table de hachage).
distribues, en un sens probabiliste, dans [1, p]. Prenons comme exemple de fonction de hachage simple la fonction modulo un nombre premier. Prenons alors pour p un nombre premier (par exemple 101) et considrons la cl suivante : VERYLONGKEY
lalphabet considr) :
22.3210 + 5.329 + 18.328 + 25.327 + 12.326 + 15.325 + 14.324 + 7.323 + 11.322 + 5.32 + 25 La fonction de hachage considre ne prend pas directement ce nombre pour
en faire lopration modulo 101, sa repsentation machine tant lourde manier ; il scrit en eet en binaire par
1011000101100101100101100011110111000111010110010111001 Il est bien plus ecace de se servir de la reprsentation dun polynme
121
fournit 97.
Le calcul dun indice partir dune cl est rapide, mais rien ne garantit
que 2 cls distinctes donneront des indices distincts. On nomme collision dindice le fait que 2 cls distinctes donnent le mme indice. Il faut alors une stratgie de rsolution de collision.
a une collision pour lindice i, les cls sont ranges dans une liste chane n i, associe la case dindice i de la table. Les dirents lments de la liste chane peuvent tre rangs en ordre alphabtique croissant des cls, pour un accs plus rapide. Cette stratgie est bien adapte au cas o lon ne connat pas, a priori, le nombre denregistrements (de paires cls/valeurs) traiter, ce qui est le cas de la classe HashMap de Java.
nie dans la classe Object. Elle renvoie alors en gnral une conversion de ladresse de lobjet en int, bien que ceci ne soit pas une obligation dimplantation du langage. La mthode hashCode() est rednie par les types suivants : BitSet, Boolean, Character, Date, Double, File, Float, Integer, Long, Object et String,
122
sa longueur. Soit n la longueur de la suite de caractres et ci le caractre dindice i. Si n 15, le code de hachage est calcul par
n1
ci .37i
i=0
ci.k .39i
i=0
en utilisant larithmtique des int, o k = n et m = n , ne prenant 8 k (dans la dcomposition) que 8 ou 9 caractres de la chane. Pour les implantations des autres types, voir [GJS96].
prsente 2 inconvnients : (1) Lordre ditration est indtermin. (2) La complexit de litration est linaire en la capacit de la table. Pour un conteneur adapt litration, cest une fonction linaire de la taille du conteneur.
une table de hachage ainsi quune liste doublement chane de ses lments.
Litration est ainsi de complexit linaire en la taille de la table. Lordre ditration est celui dinsertion des cls. Il existe un constructeur supplmentaire par rapport HashMap, public
LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) dont le dernier paramtre spcie le type dordre daccs. Si accessOrder est
123
gal false, lordre daccs est celui des cls (valeur par dfaut prise dans les autres constructeurs) ; sil est gal true, lordre ditration est lordre daccs des entres du plus ancien au plus rcent. La mthode protge removeEldestEntry(Map.Entry eldest) renvoie un boolen reprsentant une condition impliquant la destruction de lllement transmis en paramtre.
import java.util.*; public class CacheMap extends LinkedHashMap { int maxSize; // Construit un cache de taille maxSize de taille initiale // vide avec une capacite de 16 et un facteur de charge de 75% public CacheMap(int maxSize) { super(16, 0.75f, true); // true pour choisir lordre dacces this.maxSize = maxSize; } // Determine si "le plus ancien elt" doit etre jete protected boolean removeEldestEntry(Map.Entry eldest) { return (size() > maxSize); } public static void main(String args[]) { ChacheMap map = new CacheMap(3); // cache de taille 3 map.put("1", "un"); map.get("1"); map.put("2", "deux"); map.put("3", "trois"); map.put("4", "quatre"); Set entrySet = map.entrySet(); // Iteration sur le conteneur for (Iterator it = entrySet.iterator(); it.hasNext(); ) System.out.println(it.next() + " "); }
Les cls ne sont pas compares avec equals() mais par galit des rfrences
(==).
on utilise System.identityHashCode() qui utilise les rfrences et non hashCode(). On donne au constructeur la taille maximale de la table (et non la capacit
et le facteur de charge). La taille est augmente si besoin est. Utilise en srialisation, o lenvironnement dexcution associe un identicateur chaque rfrence. Lorsquon rencontre une rfrence dj prise en compte, on utilise son identicateur pour la reprsenter.
124
les cls.
Il faut fournir 2 constructeurs suplmentaires :
lun avec un paramtre de type SortedMap, ralisant une copie de la table fournie, avec le mme ordre. lautre avec un paramtre de type Comprarator xant lordre.
Comparator comparator() renvoie le comparateur associ la table trie, ou null sil utilise lordre naturel des cls. Object firstKey() renvoie la plus petite cl de la table trie. SortedMap headMap(Object toKey) renvoie une vue de la partie de la table trie dont les cls sont strictement plus petites que toKey.
rel des cls, ou selon un objet de comparaison fourni la cration, selon le constructeur utilis.
125
X.4
126
Support de cours Java int lastIndexOf(Object o) renvoie lindice de la dernire occurrence de o dans la liste. ListIterator listIterator() renvoie un listIterator des lts. de cette liste. Returns a list iterator of the elements in this list (in proper sequence). ListIterator listIterator(int index) renvoie un listIterator des lts. de cette liste partir de index. Object remove(int index) enlve llt. spci de la liste. boolean removeAll(Collection c) enlve de la liste tous les lts. de c. boolean retainAll(Collection c) ne garde dans la liste que les lts. de c. Object set(int index, Object element) remplace llt. de la liste la position index par element. int size() renvoie le nombre dlts. de la liste. List subList(int fromIndex, int toIndex) renvoie une vue de la portion de liste comprise entre fromIndex inclus et toIndex, exclus. Object[] toArray() renvoie un tableau des lts. de la liste. Object[] toArray(Object[] a) renvoie un tableau des lts. de la liste. Le type du tableau renvoy est le type de a lexcution.
But insre llment spcif dans la liste. teste si la liste contient un prdcesseur de llment courant. renvoie lindice de llment renvoy par next(). renvoie llment prcdent de la liste. renvoie lindice de llment renvoy par previous(). remplace le dernier lment renvoy par next() ou previous() par llment cpci.
4.4 Ensembles
Sous-type de Collection ne pouvant contenir 2 lts. identiques.
127
Ensembles implantent Set, ensembles ordonns implantent SortedSet. Mmes mthodes que Collection, smantique modie : pas 2 lts identiques au sens dequals(). Classe abstraite AbstractSet admet 3 sous-classes concrtes : HashSet, LinkedHashSet, TreeSet.
But renvoie le 1er elt. de lensemble tri. renvoie le dernier elt. de lensemble tri.
renvoie une vue des lts strictement compris entre toElement et fromElement. renvoie une vue des lts strictement plus grands que fromElement.
128
4.8 Suites
Suites accs direct (dans nimporte quel ordre) : implantent RandomAccess. Suites accs squentiel (pour accder i +1, accder i dabord) : hritent de AbstractSequentialList. Suites accs direct : ArrayList. Suites accs squentiel : LinkedList.
rfrences des objets. ArrayList nest pas synchronise par dfaut. Si lon dsire avoir un tableau longueur variable synchronis, utiliser
static Collection synchronizedCollection(Collection c) de la classe Collections.
On dispose de 3 constructeurs :
ArrayList() cr une liste de taille initiale 10 rfrences. ArrayList(int size) cr une liste de taille initiale size rfrences. ArrayList(Collection c) cr une liste avec les lts de c. La capacit initiale de la liste est de 110% celle de c. Les direntes mthodes sont :
methode() void add(int index, Object element)
But Lobjet spci par element est ajout lendroit spci de la liste.
129
protected void removeRange(int fromIndex, int toIndex) Object set(int index, Object element) int size() Object[] toArray() Object[] toArray(Object[] a)
void trimToSize()
Lobjet spci par element est ajout la n de la liste. Les lts. de c sont ajouts la n de la liste. Les lts. de c sont ajouts lendroit spci de la liste. vide la liste. Renvoie un duplicata (copie supercielle) de la liste appelante. Renvoie true si element est contenu dans la liste et false sinon. Fixe la capacit minimale de la liste size. renvoie lllement situ la position spcie de la liste. Renvoie lindice de la 1ire occurrence de element. Si lobjet nest pas dans la liste, -1 est renvoy. Renvoie true si la liste ne contient aucun lment et false sinon. Renvoie lindice de la dernire occurrence de element. Si lobjet nest pas dans la liste, -1 est renvoy. Enlve la premire occurrence de element trouve dans la liste. Renvoie une rfrence sur llment enlev. Enlve les lments situ entre les indice fromIndex (inclus) et toIndex (exclus). Remplace llment la position spcie par element. Renvoie la taille de la liste. renvoie un tableau des lts. de la liste. renvoie un tableau des lts. de la liste. Le type du tableau renvoy est le type de a lexcution. Fixe la capacit de la liste au nombre dlments quelle contient actuellement.
130
class DemoArrayList { public static void main(String args[]) { // Taille initiale de 3 ArrayList l = new ArrayList(3); System.out.println("Taille initiale : " + l.size()); l.add(new Integer(1)); l.add(new Integer(2)); l.add(new Integer(3)); l.add(new Integer(4)); l.add(new Double(18.23)); l.add(new Integer(5)); System.out.println("1er element : " + (Integer)l.get(0)); System.out.println("Dernier element : " + (Integer)l.get(l.size()-1)); if (l.contains(new Integer(3))) System.out.println("l contient lentier 3"); // Listons les elements de la liste ListIterator it = l.listIterator(); System.out.println("\n Elements dans la liste : "); while (it.hasNext()) System.out.print(it.next() + " "); System.out.println(); } }
131
Ajout/suppression en dbut de liste en temps constant (O(1)). Insertion/suppression dun lt. juste aprs un lt. donn (par ex. par un itrateur) en temps constant. Accs llt. i en O(i).
But insre llt. spci au dbut de la liste. ajoute llt. spci la n de la liste. renvoie le 1er lt. de la liste. renvoie le dernier lt. de la liste. enlve et renvoie le 1er lt. de la liste. enlve et renvoie le dernier lt. de la liste.
de Vector, et en dnit cetraines qui lui sont propres. Stack nest pas une pile au sens puriste du terme . . . Il est toutefois utile davoir accs aux mthodes de Vector. Un seul constructeur, sans arguments, qui cr une pile vide.
But Renvoie true si la pile est vide et false sinon. Renvoie llment du dessus de la pile, mais ne lenlve pas. Renvoie llment du dessus de la pile, en lenlvant. Pousse element sur la pile. element est galement renvoy.
132
int search(Object element)
Une EmptyStackException est jete si lon appelle pop() lorsque la pile est
vide.
lments dun Vector ou dune Hashtable. Lutilisation de cette interface est dprcie. Il est recommand dutiliser Iterator la place. Elle spcie 2 mthodes : boolean hasMoreElements() Object nextElement() la 1ire doit renvoyer true tant quil y a encore des lments dans la collection, et la 2ime renvoie une rfrence sur linstance suivante de la collection.
ArrayList la place.
La classe ArrayList nest pas synchronise par dfaut. Si lon dsire avoir
un tableau longueur variable synchronis, utiliser la mthode static Collection synchronizedCollection(Collection c) de la classe Collections.
cl/valeur.
Lutilisation de cette classe est dprcie. Il est recommand dutiliser
133
HashMap la place.
liste de proprits par dfaut. Constructeurs : Properties(), cr un objet sans liste par dfaut. Properties(Properties defaultProp), cr un objet avec defaultProp comme liste par dfaut. Dans les 2 cas, la liste des proprits est vide. Liste des mthodes propres de Properties
methode() String getProperty(String key)
But Renvoie la valeur associe la cl key ; la recherche seectue dabord dans la liste, puis, si rien nest trouv, dans la liste par dfaut. Une rfrence null est renvoye si key ne se trouve ni dans la liste, ni dans la liste par dfaut. Renvoie la valeur associe la cl key si elle est trouve et renvoie defaultVal sinon. Cette dernire peut tre une valeur par dfaut ou un message derreur. Envoie la liste des proprits au ux de sortie associ streamOut. Utilis pour lachage. la liste des paires cl, valeur est lue partir du ux streamIn et est ajoute la table. Renvoie une numration des cls. Ceci inclut les cls trouves dans la liste des proprits par dfaut. Sil y a des cls en double, une seule est retenue. crit la chane description, puis la liste dans le ux associ streamOut.
134
Les lignes commenant par un # ou un ! sont traites comme des commentaires (elles ne sont pas lues). Les sparateurs cl-valeur sont : =, : ou un espace. Chaque paire cl-valeur doit tenir sur une ligne, sauf si lon place un \ en n de ligne, auquel cas lentre peut se poursuivre la ligne suivante. Tous les caractres blancs en dbut de ligne sont limins. Dans lcriture par save() : Aucun lment de la table par dfaut nest crit. Si largulent description nest pas nul, il est crit, prcd en dbut de ligne par un #. Il sert donc de commentaire identicateur. Ensuite, un commentaire est toujours crit, constitu dun #, suivi de la date et de lheure et dun passage la ligne. Puis, chaque paire de la table est crite, une par ligne. La cl est dabord crite, suivi dun =, suivi de la valeur. Exemple dutilisation de la liste par dfaut :
import import import import java.util.Dictionary; java.util.Hashtable; java.util.Properties; java.util.Enumeration;
class PropDemoDef { public static void main(String args[]) { Properties defList = new Properties(); defList.put("Florida", "Tallahassee"); defList.put("Wisconsin", "Madison"); Properties capitals = new Properties(defList); Enumeration states; String str; capitals.put("Illinois", "Springfield"); capitals.put("Missouri", "Jefferson City"); capitals.put("Washington", "Olympia"); capitals.put("California", "Sacramento"); capitals.put("Indiana", "Indianapolis"); // Montrer tous les etats et capitales de la table. states = capitals.keys(); while(states.hasMoreElements()) { str = (String) states.nextElement();
135
136
} catch(FileNotFoundException e) { // ignore missing file }
// Si le fichier des nos de telephone existe, // charger les nos. existants. try { if(fin != null) { ht.load(fin); fin.close(); } } catch(IOException e) { System.out.println("Erreur de lecture de " + finName); } // Lutilisateur entre les nouveaux noms et numeros. do { System.out.println("Entrez un nouveau nom " + "(quit pour sortir) : "); name = br.readLine(); if(name.equals("quit")) continue; System.out.println("Entrez le numero : "); number = br.readLine(); ht.put(name, number); changed = true; } while(!name.equals("quit")); // Si lagenda telephoneique a change, le sauvegarder. if(changed) { FileOutputStream fout = new FileOutputStream(finName); ht.save(fout, "Agenda telephonique"); fout.close(); } // Charger des numeros en donnant un nom. do { System.out.println("Entrez le nom a trouver " + "(quit pour sortir) : "); name = br.readLine(); if(name.equals("quit")) continue;
137
138
// Get number of entries in map int size = map.size(); // 2 // Adding an entry whose key exists in the map causes // the new value to replace the old value Object oldValue = map.put("a", new Integer(9)); // 1 // Remove an entry from the map and // return the value of the removed entry oldValue = map.remove("c"); // 3
Bibliographie
[Boo94] G. Booch. Object-Oriented Analysis and Design with Applications. Benjamin/Cummings, Redwood City, CA, 1994. d. franaise : Analyse & conception orientes objets, AddisonWesley France, Paris, 1994. Un classique de lingnirie du logiciel. T. Budd. Understanding Object-Oriented Programming with JAVA. Addison-Wesley, Reading, MA, 1998. http ://www.awl.com/cseng. Excellent livre. Explique le pourquoi (vue comprhensive du langage) de la programmation java et pas seulement le comment (simple vue descriptive). E. Dijkstra. Programming Considered as a Human Activity. Classics in Software Engineering. Yourdon Press, New York, 1979. Un classique. D. Flanagan. Java Examples in a Nutshell. A Tutorial Companion to Java in a Nutshell. OReilly, Cambridge. Trs bon livre dexemples. Complte parfaitement le prcdent. D. Flanagan. Java in a Nutshell. A Desktop Quick Reference. OReilly, Cambridge. Excellent livre. Notamment une description synthtique des classes et paquetages trs bien faite.
[Bud98]
[Dij79] [Flaa]
[Flab]
[GHJV95] E. Gamma, R. Helm, R. Johnson, et J. Vlissides. Design Patterns. Elements of Reusable Object-Oriented Software. Addison-Wesley, Reading, MA, 1995. Livre fondateur dune technique maintenant classique en gnie logiciel. [GJS96] J. Gosling, B. Joy, et G. Steele. The Java Language Specication. Addison-Wesley, Reading, MA, 1996. Description trs dtaille du langage par leurs fondateurs ; assez aride. N. Koblitz. A course in Number Theory and Cryptography, volume 114 de GTM. Springer, New York, 1987. Deuxime dition. Un livre abordable sur un sujet dicile traiter rigoureusement et simplement. 139
[Kob87]
140
[RDBF02] G. Roussel, E. Duris, N. Bedon, et R. Forax. Java et Internet Concepts et programmation. Vuibert, Paris, 2002. Tome 1 Ct client. Un excellent livre de programmation rseau. Trs bonne introduction diverse aspects du langage hors rseau. [RGI80] D.T. Ross, J.B. Goodenough, et C.A. Irvine. Software engineering : Process, principles and goals. Dans P. Freeman et A. Wasserman, diteurs, Tutorial on Software Design Techniques. Computer Society Press of the IEEE, New York, 3e d., 1980. Un article classique en gnie logiciel. R. Segdewick. Algorithmes en langage C. InterEditions, Paris, 1991. Un classique en algorithmique applique. Excellent compromis entre thorie et pratique. Data Stuctures & Problem Solving Addison-Wesley, Reading, MA, 1998. http ://www.awl.com/cseng/titles/0-201-54991-3. Bon livre sur un sujet ultra-classique. M. A. Weiss. Using Java.
[Seg91]
[Wei98]
Index
abstract, 77 break, 34 java.util.TreeSet, 126 java.util.WeakHashMap, 123
Constructeur, 66 Conteneurs Conteneurs abstraits, 115 Conteneurs immuables, 113 Conteneurs synchroniss, 114 Itration de conteneur, 114 continue, 37 Conventions de style, 25
do-while, 37
Exception, 83 catch, 85 Classe Exception, 88 Classe Error, 84 Classe Throwable, 84 finally, 88 throw, 86 throws, 86 try, 85
final, 75 finalize(), 75 for, 37
141
Support de cours Java Squences dchappement, 26 static, 75 super, 69 switch, 35 Tableaux, 29 this, 66 Types primitifs, 28
Mthode Mthode abstraite, 77 Mthode java, 62 main, 63 Rednition de mthode, 72 Rpartition de mthode dynamique, 74 Surcharge de mthode, 71 Modicateurs modicateurs de visibilit, 79 Mots cls, 27
new, 64
Objet Instance dobjet Java, 65 Rfrence un objet, 64 Variable dinstance dobjet Java, 65 Oprateurs Oprateurs arithmtiques, 30 Oprateurs boolens logiques, 32 Oprateurs entiers sur les bits, 31 Oprateurs relationnels, 32 Priorit des oprateurs, 33 Paquetage, 77
return, 37