You are on page 1of 38

POLYCOPIE DE JAVA 1.

Introduction Ce document doit, terme, tre un polycopi Java pour les tudiants de MIAIF2, DESS, MASS, MST2. Plan du cours 2. Prsentation gnrale 3. Le minimum sur les entres sorties en Java 4. Spcificits de Java par rapport C++ 5. Classes et objets 6. Construction destruction initialisation dobjets 7. Gnralisation et hritage 8. Deux classes usuelles : la classe Object et la classe Vector. 9. Interfaces et paquetages 10. Exceptions 11. Multi-tches 12. Fichiers 13. Les classes et les types prdfinis 14. Lenvironnement de dveloppement Rfrences Gosling & Arnold : le langage Java, traduction Miniussi & Chaumette, International Thomson Publishing.
Livre clair et trs adapt pour les dbutants, crit par le crateur du langage.

Niemeyer & Peck : JAVA par la pratique , Editions OReilly.


Livre qui couvre lensemble des aspects de Java par des exemples.

Irne Charon : le langage Java, concepts et pratique , Herms. (http://www.infres.enst.fr/~charon/coursJava/)


Cours en ligne avec exercices corrigs. Trs bien.

Jrme Bourgeault : Java : la matrise , Les Guides de formation Tsoft, Eyrolles.


Livre exhaustif avec AWT, JDBC, JavaBeans, JFC, Swing, etc.

Java Corner : Un service d'information sur le langage JAVA ralis par des membres du Centre Universitaire d'Informatique (CUI) de l'Universit de Genve. (http://cuiwww.unige.ch/java/) enfin, quelques liens vers des pages java : (http://www.math-info.univ-paris5.fr/~bouzy/java.html)

Notes de cours Java

2. Prsentation gnrale Java a t conu par James Gosling en 1994 chez Sun. Lide tait davoir un langage de dveloppement simple, portable, orient objet, interprt. Java reprend la syntaxe de C++ en le simplifiant. Java offre aussi un ensemble de classes pour dvelopper des applications de types trs varis (rseau, interface graphique, multi-tches, etc.) Le but de ces notes de cours est de donner un premier aperu sur Java en ne prsentant que ce quil est ncessaire de connatre pour bien programmer objet avec Java. Java comprend bien dautres aspects (programmation graphique, applets, programmation rseau, multi-tches) que ce document ne prend pas en compte. Ce document suppose connu le langage C, mais pas C++. Enfin, mieux vaut avoir des rudiments sur lorient objet sans que cela soit vraiment bloquant pour le lire.

Bruno Bouzy

09/10/03

Notes de cours Java

3. Le minimum vital sur les entres sorties Il nest pas trivial dcrire le programme BONJOUR LE MONDE en Java. Le but de ce paragraphe est de montrer comment crire ce programme et de prsenter une classe Entree qui encapsule les fonctions dentre en Java. Ceci afin dtre capable damorcer lapprentissage de la programmation en Java. Ecrire sur la sortie standard Le premier programme Java crire est le suivant :
class Machin { public static void main(String argv[]) { System.out.println ( Bonjour le monde ! ) ; } }

Ainsi, la sortie de ce premier programme Java est :


Bonjour le monde !

Pour les personnes patientes et pas curieuse, passez au paragraphe suivant, vous navez pas besoin den savoir plus et le reste sera expliqu plus tard. Pour les curieux impatients : class Machin est la dclaration dune classe (obligatoire en Java). public signifie que main est visible de lextrieure de la classe machin. static signifie que main nest pas associe a une instance mais une classe main est le nom de la mthode argv est le tableau de chanes de caractres habituels du C. String est le nom de la classe chane de caractres System est le nom de la classe systme out est le nom de linstance pour effectuer des sorties println est le nom de la mthode qui imprime une ligne avec un retour chariot.

Bruno Bouzy

09/10/03

Notes de cours Java

Lire sur lentre standard On peut galement lire des informations sur lentre standard du programme. Pour cela, les primitives Java sont dans la classe System.in. Mais elles sont dun niveau trop bas et un peu compliqu. Nous prsentons donc la classe Keyboard (ne faisant donc pas partie de Java) qui permettra de faire des entres avec des fonctions plus simples.
La classe Keyboard. // keyboard.java import java.io.*; public class Keyboard { public static char getChar() ; public static String getString() ; public static int getInt() ; public static void pause() ; }

La mthode getString() retourne la chane de caractres lue sur lentre standard. Elle retourne tous les caractres taps jusquau retour chariot. La mthode getInt() est analogue getString, mais convertit la chane lue sur lentre standard en un entier quelle retourne. La mthode pause() attend un retour chariot sur lentre standard. Elle est utile pour mettre un point darrt dans le programme. On peut ainsi viter que la fentre dexcution du programme sen aille trop vite en plaant un pause() la fin du programme. NB : ces mthodes sont minimales et ne sont rutilisables que pour dbuter la programmation des entres-sorties en Java. Elles devront tre amliores ensuite selon les besoins du programmeur.

Bruno Bouzy

09/10/03

Notes de cours Java

4. Spcificits de Java par rapport C++ Ce paragraphe rassemble les spcificits de Java par rapport C++. Il est donc sauter si vous ne connaissez pas C++. Pas de pointeurs, que des rfrences Interprt et dynamique Portable Multi-tache Pas de pointeurs Java fait une partie de sa publicit auprs des programmeurs (dbutants) en clamant quen Java il ny a pas de pointeurs mais que des rfrences et en sous-entendant donc que Java simplifie la programmation. Nous pensons quil est ncessaire de faire un paragraphe expliquant que ce nest pas vrai. Pour cela, ce paragraphe rappelle dabord ce que sont des pointeurs et des rfrences en C++, puis il explique pourquoi programmer avec des rfrences Java est aussi difficile que de programmer avec des pointeurs en C++.
Rappel sur les pointeurs et rfrences

Ce paragraphe rappelle le strict minimum sur ce que sont un pointeur ou une rfrence. En C, lorsque lon dclare une variable avec un nom et un type, un emplacement mmoire du type de la variable est cr une certaine adresse avec son nom pour y accder. Lemplacement mmoire recevra la valeur de la variable lors dune affectation.
int x ; x = 3 ; // une dclaration en C // une affectation en C

Le C permet de manipuler dans le programme, les adresses des emplacements mmoire des variables. &x dsigne ladresse de la variable x. On peut dclarer des pointeurs dun type qui sont des variables contenant des adresses de variables de ce type avec le symbole *.
int * p ; p = &x ; // un pointeur sur un entier // p vaut ladresse de x

Loprateur * sappelle loprateur de drfrencement et *p dsigne la valeur contenue dans lemplacement mmoire dont ladresse et p.
int y = *p ; // y vaut 3

On peut aussi dclarer une rfrence une variable existante. Une rfrence se dclare avec loprateur &. Une rfrence est un synonyme - un alias - pour dsigner lemplacement mmoire dune variable.
int & z = x ; // z est une rfrence a x, z vaut 3

Si on change la valeur de x, la valeur de z est aussi change et inversement. Idem avec *p.
x = 4; z = 5; *p = 6; // x et z valent 4, *p aussi // x et z valent 5, *p aussi // *p, x et z valent 6

Noter que les oprateurs & et * sont inverses lun de lautre. On a toujours :
*(&x) = x et &(*p) = p

Bruno Bouzy

09/10/03

Notes de cours Java

Attention, on ne peut pas drfrencer un pointeur qui ne contient pas une adresse valide.
int * q ; *q = 7 ; // plantage

Il faut initialiser le pointeur avant :


int * q = &x; *q = 7 ; // ok

La manipulation des pointeurs en C ou en C++ est rpute difficile et source derreurs fatales pour lexcution du programme.
Rfrences Java ou pointeurs C++, relier des objets restera toujours une tche dlicate !

Un pointeur C++ est une sorte de rfrence au sens large. La manipulation des rfrences Java est analogue celle des pointeurs C++ et elle est tout aussi difficile. Dans les deux cas, on a un synonyme dune variable et on cherche la variable ; dans les deux cas, pointeur C++ ou rfrence Java, le problme du programmeur est davoir un synonyme valide pour chercher la variable ; si le synonyme est invalide (un pointeur C++ qui contient une adresse dun emplacement mmoire ne correspondant pas la variable recherche ou une rfrence Java ne correspondant pas la variable recherche) lexcution du programme sera incorrecte, que lon soit en C++ ou en Java. Donc, attention ! Le fait quen Java, les pointeurs aient disparu, ne simplifie en rien la tche du programmeur souhaitant manipuler des liens inter-objet. Il faudra toujours mettre jour ces liens et cela sera dune difficult gale de le faire en Java avec des rfrences ou avec des pointeurs en C++ ! Interprt et dynamique
Exemple:

Alice crit un programme qui ajoute 4 une donne. Alice crit dans le langage L. Programme crit en langage L : A=B+4 Elle sait que lentre sera reprsente par B et que le rsultat sera reprsent par A.
Compilation et excution

Une compilation consiste transformer un programme crit dans un langage L en un programme crit dans un langage M, excutable aprs coup par une machine qui sait interprter ou excuter le langage M. Langage M registre R = (B) registre S = 4 registre R = registre R + registre S (A) = registre R

La compilation consiste transformer le premier programme en le second. Pour chaque instruction crite en langage L, le compilateur engendre une ou plusieurs instructions crites en langage M. Le compilateur prpare le travail. L'excution consiste faire lire les instructions du second programme crit en langage M.
Bruno Bouzy 6 09/10/03

Notes de cours Java

Interprtation

Une interprtation consiste excuter directement un code crit dans un langage L sans le transformer avant de l'excuter. Sur la machine, il existe un programme nomm interprteur I de programmes crits en langage L. A l'excution, l'interprteur lit le programme de Alice, par exemple de gauche droite. Il lit A, il associe A au registre R. Il lit =, il sait qu'il va affecter un valeur R. Il lit B, il associe B au registre S. Il lit +, il sait qu'il va additionner quelquechose B. Il lit 4, il ajoute 4 au registre S. Il affecte la valeur de S R. Il crit le rsultat de A qui est contenu dans R. L'interprteur fait donc 2 choses en mme temps : il transforme les instructions crites en langage L en instruction crites en langage M et il les excute.
Compilation versus interprtation

Si on dispose un programme crit en langage L et d'une machine qui excute du langage M, il faut soit : avoir un compilateur qui transforme le programme du langage L vers le langage M. Par exemple, si on a un programme C++, et 3 machines : un PC, un Mac et une Sun il faudra 3 compilateurs. avoir un interprteur qui comprend le programme en langage L. Par exemple, si on a un programme C++, et 3 machines : un PC, un Mac et une Sun il faudra 3 interprteurs diffrents. L'interprtation est une opration longue car elle fait les 2 choses simultanment : transformer les instructions et les excuter.
Un programme compil tourne plus vite quun programme interprt

La compilation est une opration longue car elle transforme les instructions. Mais un programme, une fois compil, tourne plus vite que le mme programme interprt car la transformation est dj faite par la compilation. Seule lexcution des instructions intervient lorsque le programme compil tourne.
Un programme compil est plus long mettre au point quun programme interprt

Par contre, il est plus rapide de programmer avec un langage interprt quavec un langage compil. En effet, tant donn un programme mettre au point, le cycle (diter, engendrer lapplication, se mettre dans les conditions de test, excuter) est plus rapide si lapplication est interprte. En effet, avec un interprteur, votre application donnant un erreur dans une certaine condition, vous voulez faire disparatre lerreur : vous devez modifier votre programme, recharger la modification, remonter en arrire dans votre excution pour vous mettre dans les conditions du test et excuter. Avec un langage

Bruno Bouzy

09/10/03

Notes de cours Java

interprt, vous navez pas besoin de relancer votre programme depuis le dbut. Par contre, avec un compilateur, si vous voulez faire disparatre une erreur : vous devez modifier votre programme, recompiler votre application, redmarrer votre programme au dbut, excuter pour vous mettre dans les conditions du test et excuter.
Java est un langage semi-interprt et semi-compil

Lors de sa mise au point, un programme crit en langage java est dabord compil en un bytecode java. Lors de son excution sur une machine, un programme bytecode java est interprt par linterprteur java de la machine. Dans ce sens, on dit que java est semi-interprt (linterprteur java ninterprte pas du langage java mais du bytecode). On peut dire aussi quil est semi-compil au sens o le compilateur java transforme le source java en un programme crit en bytecode et non pas en code machine. Java, langage interprt, offre lavantage dtre plus facile programmer que sil tait totalement compil. Par contre, Java est lent compar C++ (~30 fois plus lent) car il est interprt. Pour rsoudre ce problme, on peut utiliser un compilateur natif , cest dire un compilateur qui transforme un source java en un excutable machine. Mais l, on perd les avantages qui font la publicit de Java. Portable On dit que Java est portable . Ce paragraphe explique dans quelle mesure cela est vrai. Quand on crit un programme on peut dfinir sa portabilit de deux manire : portabilit de langage ou portabilit de code compil .
Portabilit de source

Alice crit un programme en langage L. Les fichiers contenant le programme en langage L sappelle le source du programme. Alice peut par exemple compiler le source pour avoir un excutable. Puis elle excute le programme sur sa machine. Ensuite imaginons quelle donne le source Bob qui dispose dune machine de type diffrent. Si Bob possde un compilateur de programmes crits en langage L, il peut compiler le source et produire un excutable pour sa machine. Si Bob n' a pas besoin de modifier le source du programme, on dit que le source du programme est portable. Il sagit de la portabilit du source.
Portabilit dexcutable.

Alice crit un programme en langage L, compil en langage M sur une machine. Elle donne lexcutable Bob. Si Bob possde une machine sachant interprter le langage M, lexcutable est portable. Il sagit de la portabilit dexcutable. Cette technique est intressante si Alice ne veut pas donner les sources de son programmes Bob et seulement un excutable. Lorsque Alice commercialise son logiciel, la portabilit dexcutable nest bien sr pas obligatoire mais intressante. Si Alice veut commercialiser un logiciel crit dans un langage sans portabilit dexcutable, elle doit engendrer autant dexcutables diffrents quil y a de types de machine diffrents avec des compilateurs diffrents. Cest le cas actuel de lindustrie informatique avec des langages comme C ou C++.
Bruno Bouzy 8 09/10/03

Notes de cours Java

Lorsque Alice se lance dans la programmation distribue sur plusieurs machines de types diffrents sur un rseau, un programme P qui sexcute sur une machine X peut avoir besoin run-time de rcuprer un programme Q situ sur une autre machine Y et de le lancer sur X. Si il fallait rcuprer le source de Q et recompiler le programme Q avant de le lancer, le programme P serait trop lent. Il devient alors ncessaire de rcuprer Q sous forme excutable. Dans le cadre de la programmation distribue, la portabilit dexcutable devient donc trs utile, voire obligatoire. Dans ce cadre, Java permet priori la portabilit de langage et de code compil. Multi-tches Avec la classe Thread, Java offre au programmeur la possibilit de programmer en multi-taches. Ce qui est un gros avantage, surtout pour dvelopper des applications relles avec de multiples interfaces (homme-machine, rseau, base de donnes, etc.) avec le monde extrieur. (Cf paragraphe plus loin dans ce document.)

Bruno Bouzy

09/10/03

Notes de cours Java

5. Classes et objets Ce paragraphe aborde les caractristiques de Java vis--vis de la programmation oriente objet. Il rappelle dabord le vocabulaire objet, notamment ce que signifie encapsulation, puis il montre comment dclarer une classe Java, comment dfinir le corps des mthodes, la distinction entre priv et publique, les constructeurs et enfin les attributs statiques dune classe. Vocabulaire objet Ce paragraphe rappelle le vocabulaire employ en orient objet. Et il donne la correspondance entre le vocabulaire objet et le vocabulaire spcifique de Java.
Objet

Un objet est une entit, qui possde un tat et un comportement. Pour dfinir ce quest un objet, les livres donnent souvent une quation du style de : objet = tat + comportement
Classe

Vue de la programmation objet, une classe est un type structur de donnes. Nous verrons quune classe Java est le prolongement des structures C (mot-cl struct).Vue de la modlisation objet, une classe correspond un concept du domaine modlis. Une classe regroupe des objets qui ont des proprits et des comportements communs. Une classe est donc un ensemble dobjets. En Java, pour une classe, on dit aussi une classe.
Instance

Pour dsigner un objet de la classe, on dit aussi une instance . instance est un anglicisme qui possde une signification proche de celle de exemple en franais. On dit souvent quune instance instancie une classe. Cela signifie que linstance est un exemple de la classe. En Java, pour dsigner une instance on dit indiffremment un objet ou une instance.
Attribut

Ltat dun objet est lensemble des valeurs de ses attributs. Un attribut est une proprit de lobjet. En Java, on dit aussi attribut.
Mthode

Vue de la modlisation objet, une mthode est une opration que lon peut effectuer sur un objet. Vue de la programmation objet, une mthode est une fonction qui sapplique sur une instance de la classe. En Java on dit aussi mthode.
Message

A lorigine de la programmation oriente objet, lobjectif tait que les objets dun programme aient des comportements concurrents (comme des tches dans une environnement multi-tche ou des process en Unix). On voulait quils communiquent

Bruno Bouzy

10

09/10/03

Notes de cours Java

en envoyant et recevant des messages . Lobjectif fix tait louable mais malheureusement trop ambitieux pour lpoque. Actuellement, tous les langages objet implmentent les objets de manire fonctionnelle (ou procdurale). Cest--dire quau lieu denvoyer un message un objet considr comme une tche ou un processus, on appelle une mthode, cest--dire une fonction tout simplement... Donc, il faut tre bien conscient de la correspondance suivante : envoyer un message un objet recevoir un message
Encapsulation des donnes

= =

appeler une mthode associe lobjet entrer dans le corps de la mthode appele

La POO pure suit le principe d encapsulation au sens strict : tout attribut dune classe est cach dans la classe ; il est invisible de lextrieur de la classe, il nest accd depuis lextrieur de la classe que par une mthode de lecture et une mthode dcriture situes dans linterface de la classe, cest--dire visibles de lextrieur. Le gros avantage de cette approche est dassurer quun attribut nest modifi que par la mthode dcriture. Si par exemple, un attribut est une anne qui doit tre compris entre 0 et 99, la mthode dcriture contient le test de vrification avant la modification de lanne. Le test est fait un seul endroit du programme. De plus, avec cette technique, si un jour les spcifications de laccs lattribut changent (imaginons par exemple que le nombre doit tre suprieur 0), le programmeur naura modifier que la mthode daccs lattribut (en y enlevant le test dinfriorit 99). Sans cela, il aurait t oblig de changer le programme tous les endroits o celui-ci modifie cet attribut. Dun point de vue de gnie logiciel, cette technique est donc intelligente. Un autre avantage de cette approche existe dans le contexte de la programmation concurrente : afin dassurer quun attribut ne soit pas modifi par deux processus concurrents en mme temps ou bien afin dassurer quun processus ne lise pas un attribut alors que celui-ci est en cours de modification par un autre processus, on protge laccs aux attributs par ces mthodes daccs. Pour rpondre au principe dencapsulation, Java, comme C++, prvoit les mot-cls private et public pour dire si un attribut est visible ou non dun programme utilisateur de la classe. En ce sens, il permet soit de suivre le principe au sens strict, soit de nencapsuler que certains attributs ou mthodes dune classe ; il permet de ne pas suivre le principe dencapsulation au sens strict. Cest une bonne chose car de nombreuses applications ne ncessitent pas dencapsuler toutes les donnes. Dautres langages objet, au contraire de Java, obligent le programmeur suivre ce principe (Smalltalk par exemple). En ce qui concerne la pdagogie de la POO, il existe deux attitudes : obliger les dbutants suivre ce principe la lettre, (nimporte quel livre de POO commence par a malheureusement) ou bien ne pas le faire. Si on oblige le suivi de ce principe, ds quun dbutant dclare un attribut x de type T dans une classe X, il le met en priv et il crit obligatoirement deux mthodes daccs publiques : la mthode de lecture T getX(){ return x ;} et la mthode dcriture setX(T x0) { x = x0 ; }. Cest dramatique dun point de vue pdagogique. Primo, il faut bien tre daccord avec les dbutants qui constatent immdiatement que ces mthodes ne font rien . Secondo, alors que le but de la programmation oriente objet est dcrire des programmes structurs et concis, le dbutant se trouve entrav par lcriture de 2 mthodes chaque fois quil veut dclarer

Bruno Bouzy

11

09/10/03

Notes de cours Java

1 attribut. Sa tche de programmation est multiplie par 3 et encombre de mthodes inutiles. Pdagogiquement, dautres concepts de la conception OO sont fondamentaux et plus importants que lencapsulation des donnes : par exemple, le placement adquat des attributs et mthodes, un, dans les bonnes classes (1er obstacle important, pourtant aucun livre de POO nen parle) et, deux, dans le bon type de classe ou dinstance , statique ou non statique (cf. plus loin) (2me obstacle important). Bref, si vous tes dbutants, si vous ne faites pas de programmation concurrente, si vous ne dveloppez pas de gros programmes qui volueront, ne suivez pas forcment le principe d'encapsulation.

Bruno Bouzy

12

09/10/03

Notes de cours Java

Dclaration et dfinition de classe En Java, la dclaration et la dfinition de la classe sont faites en une seule fois (contrairement C++ o lon dclare la classe dans un .h et o lon dfinit la classe dans un .cpp). Pour dclarer une classe Bidule en Java, on utilise le mot-cl class :
class Bidule { ...}

Le mot-cl class de Java est identique a celui de C++ et la syntaxe est quasi-identique : la seule diffrence est quil ny a pas de ; aprs }. Exemple :
class Point { private int x ; // private int y ; // public Point(int a, int b) // { x = a; y = b; } public void deplace(int dx, int dy) { x += dx; y += dy; } public void affiche() // System.out.println ( x = + x System.out.println ( y = + y } } un attribut un autre attribut constructeur

// une mthode

encore une mthode ); );

x et y sont des attributs de la classe Point. Point est le constructeur . deplace() et affiche() sont des mthodes de la classe Point. Noter que le corps de la mthode est plac juste aprs la dclaration de la mthode. Voici un exemple dutilisation de la classe Point par un programme :
public static void main(String argv[]) { Point a = new Point(5,2) ; a.affiche() ; a.deplace(8, 4) ; a.affiche() ; Point b = new Point(-1, 1) ; b.affiche() ; }

Pour appeler la mthode dplace sur lobjet rfrenc par a, noter quil faut crire le nom de lobjet (a), un point (.) et le nom de la mthode (deplace).

Bruno Bouzy

13

09/10/03

Notes de cours Java

Attributs privs ou publiques Pour lexemple prcdent, une instruction du style de a.x = 3 ; dans le main() serait rejete la compilation car x est un attribut priv de la classe Point. NB : Si x tait un attribut publique de la classe Point on pourrait le faire. Il faut noter que la syntaxe est la mme que pour les mthodes : on crit le nom de lobjet (a), un point (.) et le nom de lattribut (x). La dclaration dune classe est toujours du type :
class Toto { private ... public ... ... } // des attributs ou mthodes prives // des attributs ou mthodes publiques // etc.

On doit mettre un mot-cl public ou private pour chaque attribut ou mthode. Le principe dencapsulation met les attributs en privs avec, pour chaque attribut, une mthode de lecture et une mthode dcriture.

Construction et destruction d' objets Une caractristique de la POO est de matriser la cration dobjet, leur initialisation et leur destruction. Java rpond en partie ce besoin avec la notion de constructeur dobjet pour la cration et linitialisation. Mais, il ny a pas destructeur en Java. Ce paragraphe traite donc les constructeurs et les destructeurs en gnral en POO. Enfin une discussion suit sur labsence de destructeur obligatoire en Java.
Constructeur

Un constructeur dobjet est une mthode particulire dune classe qui est appele lors de la cration dun objet, quel quil soit. Son but est : (a) dallouer un emplacement mmoire pour lobjet, (b) dinitialiser les attributs de lobjet avec de bonnes valeurs de dpart et (c) de retourner ladresse de lemplacement mmoire choisi. A partir du moment o un constructeur existe, il nest pas possible de crer un objet sans passer par lui et donc on doit fournir les arguments requis. On est certain que lobjet est cr avec les bons attributs de dpart.
Destructeur

Il ny a pas de destructeur en Java. Cependant, un destructeur dobjet est une mthode trs commune en POO qui : (d) remet lobjet dans un tat terminal et (e) libre lemplacement mmoire associ lobjet. Lopration (d) est fondamentale selon nous pour une raison de justesse et de correction du programme. Lorsque lutilisateur dun programme dtruit une instance du programme, il ne doit pas voir cette instance ensuite. Normal !

Bruno Bouzy

14

09/10/03

Notes de cours Java

Prenons lexemple du responsable du garage qui veut dtruire un mcanicien qui vient de dmissionner du garage. Il effectue lopration mcanicien dtruire au travers de linterface homme-machine puis il affiche la liste des mcaniciens pour vrifier que celui-ci a effectivement disparu de son logiciel. Pour que le programme soit juste et correct, lopration mcanicien dtruire doit se traduire par la suppression de la rfrence de linstance correspondant au mcanicien de la liste des mcaniciens du garage. Si le mcanicien tait en relation avec dautres objets, le programme doit supprimer les rfrences vers le mcanicien avant de le dtruire. Toutes les lignes de codes correspondantes la mise jour de rfrences se trouvent ncessairement un endroit dans le programme. Nous conseillons de les mettre dans une mthode de la classe Mcanicien (que nous pouvons appeler d(), demission(), depart() ou pourquoi pas dtruire() ?) . Lorsquun langage prvoit un destructeur dobjet, on a coutume de mettre la mthode d() dans le destructeur. Dans ce cas, le langage libre lemplacement mmoire de lobjet (e) juste aprs la remise de lobjet et de son voisinage dans ltat initial.
Ramasse-miettes ou garbage collector

Java na pas de destructeur dobjet. Java possde un rammasse-miettes qui libre les emplacements mmoire occups par les objets non rfrencs. Le rammasse-miettes fait donc lopration (e). Le programmeur doit faire (d) afin que lobjet soit non rfrenc. Nous prfrons programmer avec (d) explicitement dans une mthode que nous appelons destructeur et nous faisons (e) juste aprs. Nous mettons (d) et (e) dans un destructeur et dans ce cas, il ny a pas besoin de rammasse-miettes. Java fournit tout de mme la mthode finalize() pour faire (e) de manire contrle. Si le programme na pas de problme dutilisation de la mmoire, il est vrai (e) na pas besoin dtre effectue par le programme et lutilisation du rammasse-miettes est pleinement justifie. Les fichiers .java En Java, on ne spare pas obligatoirement la dclaration et la dfinition des classes comme en C++ (*.h et *.cpp). On met le tout dans un fichier *.java. Pour sparer dclarations et dfinitions, on peut utiliser les interfaces. Un fichier *.java contenant des classes X, Y et Z compil produit les fichiers X.class, Y.class et Z.class qui sont les bytecodes des classes X, Y et Z. Attributs ou mthodes statiques Lorient objet dfinit deux types de proprits dans une classe : les proprits associes une instance de la classe (les proprits dites dinstance ) et les proprits associes une classe (les mthodes dites de classe ). Avec le qualificatif static avant un attribut ou mthode dune classe le programmeur peut spcifier que celui-ci est de classe . On dit aussi statique. Une proprit sans le mot-cl static est une proprit dinstance .
class Exemple { private static int a = 3;

Bruno Bouzy

15

09/10/03

Notes de cours Java private float b ; public void affiche() { ... } public static void affiche_tout() { ... } public Exemple(float x) { b = x ; } ... public static void main (String argv[]) { Exemple e = new Exemple(1) ; Exemple f = new Exemple(2) ; } }

Dans la classe Exemple, a est un attribut statique, b un attribut non statique. e et f sont des objets avec e.b = 1 et f.b = 2 e et f ont lattribut a en commun e.a = f.a = 3. La mthode affiche_tout de la classe Exemple est de classe ou statique et la mthode affiche est dinstance . Bien quil soit possible de le faire au dbut du programme principal, il est possible et plus cohrent dinitialiser les attributs statiques dune classes avec un bloc statique dans la dclaration de la classe. Cela peut tre pratique pour initialiser un tableau statique.
class ExempleT { public static int a[2]; static { for (int i=0 ; i<2 ; i++) a[i]=3 ; } }

Autorfrence: le mot-cl this Quand le programme est dans une mthode dinstance, le programmeur peut manipuler La rfrence de linstance courante avec le mot-clef this.
class Point { public void affiche() { System.out.println( adresse = + this); } }

Dans un constructeur, this est utile pour mettre la rfrence de lobjet construit dans un tableau ou dans une liste dinstances ou dans un attribut dun autre objet.
class MaClasse { public static Vector mesInstances = new Vector(); ... public MaClasse(. . .) { . . . MesInstances.addElement(this) ; } . . . }

Pour tenir jour une rfrence inter-objet, this est utile. Par exemple :
class Dessous { public Dessus monDessus; ... } class Dessus { public Dessous monDessous; ... public void poserInstanceSurDessous(Dessous d) { monDessous = d ; d.monDessus = this ;

Bruno Bouzy

16

09/10/03

Notes de cours Java } } this this

est un paramtre implicite des mthodes d'instance. n'a videmment pas de sens dans une mthode de classe.

Appel des mthodes Lappel dune mthode peut se faire de plusieurs manires selon que la mthode est une mthode dinstance ou bien de classe. Les rgles sont les suivantes. Pour une mthode de classe, le critre important est le lieu de lappel: Appel dans la classe ou dans une classe descendante : une mthode statique sappelle avec son nom seul (cas A). sinon, une mthode statique sappelle avec son nom prfix du nom de la classe. (cas B). Pour une mthode dinstance, le critre important est linstance sur laquelle on appelle la mthode: Avec linstance courante, une mthode dinstance sur linstance courante sappelle avec son nom seul (cas C) [ ou bien, mais cest redondant, prfix de this. (cas D) ]. Avec une autre instance que linstance courante une mthode dinstance sappelle avec son nom au sens strict prfix du nom de linstance et dun point (.) (cas E).
class Truc { public void a() { d() ; b() ; this.b() ; Truc t ; t.b() ; } public void b() { ... } public static void c() { d() ; Truc t ; t.b() ; } public static void d() { ...

// // // //

cas A cas C cas D cas E

// cas A // cas E

} } class Test { public static void main(String argv[]) { Truc.d() ; // cas B Truc t ; t.b() ; // cas E } }

Bien sur, on peut tre redondant :


void a() { Truc.d() ; Truc.b() ; Truc t ; t.Truc.b() ; } // // // cas A cas C cas E

Bruno Bouzy

17

09/10/03

Notes de cours Java

6. Construction, destruction et initialisation dobjets Ce paragraphe montre les diffrents comportements des objets Java lors de leur dure de vie. Il prcise les qualificatifs des objets suivant leur type de dclaration, comment ils sont initialiss et surtout le cas du constructeur par recopie. Les diffrents qualificatifs des objets suivant leur type de dclaration
Les rfrences

Les rfrences sont des variables contenant un nom dobjet.


void f() { Truc t ; { Bidule b ; } } // t est une rfrence sur un Truc, // t nest pas un objet // b est une rfrence sur un Bidule, pas un objet // b nest plus visible aprs cette ligne // t nest plus visible aprs cette ligne

t est visible dans la fonction f et b est dans le bloc. null est la rfrence nulle ou 0.
les objets statiques

Un objet statique est un objet dclar avec le mot-cl static dans une dclaration de classe ou dans une fonction ou bien lextrieur de toute fonction. Exemple :
static Point a = new Point(1, 7);

les objets dynamiques

Ce sont eux qui font tout lintrt de la programmation orient objet. Un objet dynamique est un objet cr avec new dans le corps dune mthode.
class Test { public static void main (String args []) { System.out.println("&& debut main"); Point adr = new Point(3, 7); fct(adr); System.out.println("&& fin main"); } public static void fct (Point adp) { System.out.println("&& debut fct"); adp.detruire(); System.out.println("&& fin fct"); } } class Point { public Point (int x, int y) { System.out.println("++ appel constructeur"); } public detruire() { System.out.println("-- appel destructeur"); } }

Bruno Bouzy

18

09/10/03

Notes de cours Java

Initialisation d'un objet lors de sa dclaration Avec lutilisation systmatique des constructeurs Java ne permet pas de crer un objet sans linitialiser en mme temps. Pour crer un objet on doit appeler un constructeur dclar. Une classe peut contenir plusieurs constructeurs, cest mme conseill. Avec :
class Point { public int x ; public int y ; public Point(int abs) { x = abs ; y = 0 ; } public Point(Point p) { x = p.x ; y = p.y ; } ... }

le programmeur peut crire :


Point a = new Point(3); Point b = new Point(a) ;

mais pas :
Point c = new Point(3, b) ; Point d = new Point(3, 4) ;

Constructeur par recopie, rfrence vers un objet, valeur dun objet Ce paragraphe traite du cas o le constructeur dune classe possde un unique paramtre qui est une rfrence un objet de la classe. On appelle alors ce constructeur, le constructeur par recopie. Ce cas est trs utilis car bien souvent, dans un programme, on veut dupliquer un objet (afin, par exemple, de travailler sur sa copie et de garder une sauvegarde). Le constructeur par recopie peut tre dclar de la manire suivante :
public Point (Point);

Pour dupliquer lobjet a dans un objet b, le programmeur crira simplement :


Point b = new Point(a);

Le programme suivant montre la diffrence qui existe entre une rfrence et une valeur dobjet :
Point x; Point y = new Point(1, 2); Point z = y; // x est une rfrence non initialise // y est une rfrence vers un objet // z est une rfrence // vers lobjet rfrenc par y Point w = new Point(y); // w rfrence un objet dont les // valeurs sont identiques aux // valeurs de lobjet rfrenc par y if (z==y) // true car z et y rfrencent le mme objet if (w==y) // false car w et y rfrencent des objets diffrents if (z.equals(y)) // true car les valeurs de lobjet // rfrenc par z galent les valeurs de lobjet // rfrenc par y (cest le mme objet) if (w.equals(y)) // true car les valeurs de lobjet rfrenc // par w galent les valeurs de lobjet // rfrenc par y.

Plutot que dutiliser le constructeur par recopie, on peut prfrer utiliser et redfinir (cf sur lhritage) la mthode clone de la class Object :
Point b = a.clone();

Bruno Bouzy

19

09/10/03

Notes de cours Java

7. Gnralisation et hritage Les concepts de gnralisation et d'hritage sont fondamentaux en Java (et en POO en gnral). Ils permettent dcrire des programmes simplement et ils permettent la rutilisation de programmes. 1. 1er aperu de la gnralisation et de lhritage en Java Si on la classe Point dfinie par :
class Point { public int x; public int y; public Point(int a, int b) { x = a; y = b; } public void deplace(int dx, int dy) { x += dx; y += dy; } public void affiche() { System.out.println( "x = " + x + "y = " + y) ; } }

Il est possible dfinir une sous-classe PointCol de la classe Point grce au mot-cl extends :
class PointCol extends Point { public int couleur; public PointCol(int a, int b, int c) { super(a, b) ; colore(c); } public void colore(int c) { couleur = c } }

Dans cet exemple, on a dfini une sous-classe (PointCol) partir d'une super-classe (Point). Cela signifie que la classe PointCol est une extension de la classe Point. La terminologie des super-classes et sous-classes est identique celle de UML. On dit que la classe PointCol hrite de la classe Point. Cela signifie que les attributs et mthodes de la classe Point sont implicitement des attributs ou mthodes de la classe PointCol.
PointCol pc = new PointCol(1, 2, 3) ; pc.deplace(4, 5) ; // correct car deplace est hrite pc.colore(6) ; // correct comme dhab Point p = new PointCol(7, 8) ; p.colore(9) ; // ERREUR ! lhritage ne marche pas dans ce sens !

2. Redfinition de mthodes et de attributs Une mthode de la sous-classe peut avoir la mme signature qu'une fonction de la super-classe. On dit alors que la mthode de la super-classe est REdfinie dans la sousclasse. Quand on est dans la sous-classe, on appelle la mthode de la sous-classe de faon habituelle. Si on veut appeler la mthode de la super-classe, il faut prciser le nom de la super-classe avec le mot-cl super en prfixe. Exemple:
class PointCol extends Point { ... public void affiche() { super.affiche(); System.out.println("couleur " + couleur); } }

Bruno Bouzy

20

09/10/03

Notes de cours Java ... public static void main(String argv[]) { PointCol p = new PointCol(10, 20, 5); p.affiche(); p.super.affiche(); p.deplace(2,4); p.affiche(); p.colore(2); p.affiche(); }

Pour les attributs, cest analogue.


class A { ... int a; char b; ... }; class B extends A {float a; ... };

Si b est de type B, b.a fait rfrence lattribut a de type float de la classe B. On accde lattribut a de type int par b.super.a. Lattribut a de la classe B s' ajoute celui de la classe A. Il ne le remplace pas. 3. Appel des constructeurs Les constructeurs nobissent pas des rgles prcises comme en C++. Cependant, il est dusage en POO que le constructeur de la sous-classe appelle le constructeur de la superclasse au dbut de son corps. Ainsi, on transmet les paramtres du constructeur de la sous-classe au constructeur de la super-classe:
class PointCol extends Point { public int couleur; public PointCol(int x, int y, int c) { super (x, y) ; // appel du constructeur de la super-classe couleur = c ; } ... }

Si lon utilise un destructeur, lors de l' appel du destructeur de la sous-classe on pourra suivre le mme esprit que pour le constructeur:
class Point { ... public void detruire () { System.out.println( "-- destruc Point " + x + " " + y); } ... } class PointCol extends Point { ... public void detruire () { System.out.println( "-destruc PointCol " + couleur) super.detruire() ; } ... }

Bruno Bouzy

21

09/10/03

Notes de cours Java

4. Contrle des accs


private et public

Une sous-classe peut accder aux attributs publiques de la super-classe et appeler les mthodes publiques de la super-classe. Une sous-classe n'a pas accs aux attributs privs de la super-classe. Exemple :
class Point { public int x; private int y; public Point(int a, int b) { x = a; y = b; } public void deplace(int dx, int dy) { x += dx; y += dy; } public void affiche() { System.out.println("x = " + x + "y = " + y) ; } } class PointCol extends Point { public int couleur; public PointCol(int, int, int) {} public void colore(int c) { couleur = c ; } }

La classe PointCol peut accder x et ne peut pas accder y. Les classes utilisatrices U de la sous-classe suivent les mmes rgles daccs la super-classe que la sous-classe.
protected

Avec le mot-cl protected on faire en sorte que: La sous-classe a accs aux attributs protgs de la super-classe. Les classes utilisatrices de la super-classe (ou des sous-classes) ny ont pas accs. Exemple :
class Point { public int x; public int y; public Point(int a, int b) { x = a; y = b; } protected void deplace(int dx, int dy) { x += dx; y += dy; } protected void affiche() { System.out.println("x = " + x + "y = " + y);} }

Bruno Bouzy

22

09/10/03

Notes de cours Java

5. L'hritage en gnral Ce paragraphe relie le vocabulaire employ en Java avec celui de lorient objet en gnral. Si B hrite de A on dit aussi : B est drive de A B est un A B spcialise A B est une classe fille de A B est une sous-classe de A B is a A C++ objet A est la classe de base de B A gnralise B A est la classe mre de B A est une super-classe de B

UML, java (anglais J)

On parle de la relation est-une-sorte-de ou de la relation is-a. Dans le cas ou plusieurs classes hrite les unes des autres, on parle de taxonomie de classes ou darbre d'hritage. C est un B D est un B E est un B G est un F B est un A F est un A

On dit que C est une descendante de A. A est une ascendante de C Lhritage multiple nexiste pas en Java. 6. Compatibilit entre objets d'une super-classe et objets d'une sous-classe Puisque la relation dhritage est une relation forte on peut se demander si lon peut affecter un objet de la super-classe dans un objet de la sous-classe ou pas et inversement. Tout objet de la classe drive est un objet de la classe de base et que Java fait des conversions implicites de type. On peut mettre un objet de type driv vers un type de base mais pas linverse. Si A est la super-classe et B la sous-classe, on a :
A a; B b;

alors a = b est lgal alors que b = a est illgal. Par contre, trs souvent, dans une sous-classe, une mthode de la super-classe retourne (une rfrence sur) un objet de la classe de base, mais puisque lappel a t fait dans la sous-classe le programmeur sait que lobjet retourn est du type de la sous-classe donc il peut violer la rgle avec loprateur de cast en crivant :
b = (B) a ;

Evidemment, cette opration peut amener des catastrophes si lobjet nest pas de la classe drive B mais dune autre classe drive C, compltement diffrente de la classe B.

Bruno Bouzy

23

09/10/03

Notes de cours Java

7. Mthodes et classes abstraites Java propose un mcanisme pour traiter des classes ou mthodes abstraites.
classes abstraites

Une classe est abstraite si elle nest pas instanciable, cest--dire si elle ne possde pas de constructeur.
mthodes abstraites

Une mthode est abstraite si elle nest pas dfinie.


notation

Pour spcifier quune classe ou une mthode est abstraite on utilise le mot-cl abstract.

Bruno Bouzy

24

09/10/03

Notes de cours Java

8. Deux classes de base: la classe Object et la classe Vector


Object

Deux classes servent beaucoup et sont indispensables connatre en Java : la classe et la classe Vector. La classe Object

Cest la super-classe de toutes les classes java. Les signatures de ses principales mthodes sont :
protected Object clone() ; public String toString() ; public boolean equals(Object) ;

La mthode clone est lquivalent du constructeur par recopie de C++. La mthode toString renvoie une chaine de caractres. La mthode equals renvoie true si les deux objets sont gaux . Le principe de ces mthodes est la redfinition des mthodes dans les sous-classes de la classe Object. Ces mthodes sont donc des mthodes par dfaut. Toute la littrature propos des constructeurs par recopie en C++ sapplique donc tout fait la mthode clone de Java. Par dfaut, la mthode clone recopie un un les attributs des lobjet instance dans les attributs de lobjet cr. Il est aussi agrable de redfinir une mthode toString dans chaque classe car elle sera implicitement appele par un System.out.print(this) ; Par dfaut, la mthode toString renvoie une String du style NomDeLaClasse@adresseMemoire. Il est enfin agrable davoir une redfinition de la mthode equals de faon distinguer lgalit de deux rfrences dobjet et lgalit des contenus des objets rfrs par deux rfrences. Par dfaut, la mthode equals teste lgalit des rfrences.

Bruno Bouzy

25

09/10/03

Notes de cours Java

La classe Vector Cest une classe du package java.util permettant de grer des listes dobjets, donc trs pratique. (Elle est analogue la classe Liste dcrite plus loin dans ce document. La classe Liste ne fait pas partie du langage Java ; La prsence de la classe Liste dans ce document est justifie par un souci dhomognit avec C++). Les principales mthodes de la classe Vector sont :
public public public public public public Object firstElement(); void addElement(Object); removeElement(Object); Object elementAt(int); boolean contains(Object); int size();

Un exemple simple dutilisation :


public class Bibli{ public Vector mesLivres; public Bibli(){ Vector mesLivres = new Vector(); } { Livre L = new Livre() ; mesLivres.addElement(L); // ajouter le livre dans mesLivres // traitement sur tous les elements du vecteur liste for(int i=0;i<mesLivres.size();i++) { Livre liv=(Livre)mesLivres.elementAt(i); // traitement sur le livre liv } } }

Bruno Bouzy

26

09/10/03

Notes de cours Java

9. Interfaces et paquetages Ce paragraphe est un lien entre dune part la notion classique de module en Gnie Logiciel et, dautre part, les interfaces et paquetages Java. Un module de GL est constitu dune interface , visible des utilisateurs du module, et dun corps , visible du seul programmeur responsable de limplmentation du module. En Java, les notions dinterface et de paquetage ressemble cette notion. Interfaces La structure syntaxique des classes Java ne permet pas une coupure naturelle entre les informations publiques et prives dune classe : la dfinition des mthodes est accole leur dclaration (contrairement C++ qui oblige le programmeur placer la dclaration dans les *.h et les dfinitions dans les *.cpp). Cependant, Java prvoit des interfaces qui ne disposent que de mthodes abstraites (des dclarations de mthodes en fait) et de donnes. On utilise le mot-cl interface. Une interface Java correspond la notion classique dinterface en gnie logiciel. Une classe pourra alors implmenter une interface. On utilisera pour cela le mot-cl implements. Exemple :
interface I { int a = 0 ; void tourner(int) ; } class C implements I { void tourner(int x) { } }

Sous cet angle, une classe est donc vue comme un morceau du corps dun module de gnie logiciel. Une classe peut implmenter plusieurs interfaces ; une interface peut tendre (mot-cl extends) plusieurs interfaces. Paquetages La notion de paquetage existe en Java, elle correspond plus ou moins la notion de module au sens du Gnie Logiciel. Un paquetage Java est surtout un ensemble de classes et dinterfaces que lon peut regrouper dans un fichier que lon place ensuite dans une arborescence de rpertoires. Un paquetage Java permet donc de structurer lensemble des fichiers *.java et *.class dune application dans des rpertoires, afin de les retrouver facilement lutilisation. Pour dfinir un paquetage, on utilise le mot-cl package la premire ligne dun fichier *.java. Chaque lment du paquetage peut tre priv (mot-cl private) ou public (mot-cl public). Exemple : imaginons que le fichier contenant le paquetage monPaquetage sappelle truc.java et que ce fichier contient les informations suivantes :
package monPaquetage ; // dfinition du package public class maClasse { ... void tourner(int x) { } } public class monAutreClasse { ... void virer(int x) { }

Bruno Bouzy

27

09/10/03

Notes de cours Java }

Pour utiliser une classe ou une interface dans un paquetage, on utilise le mot-cl import suivi du chemin indiquant comment retouver la classe ou linterface.
// toto.java import monPaquetage.maClasse ; ... maClasse c; // correct ... c.tourner(4) ; //utilis. maClasse de monPaquetage

Ici, on suppose que toto.java est plac dans un rpertoire qui contient le sousrpertoire monPaquetage qui contient le fichier truc.class. Ainsi import monPaquetage.maClasse ; permet de voir la classe maClasse situe dans le paquetage monPaquetage depuis le fichier toto.java. Si toto.java veut utiliser toutes les classes du paquetage monPaquetage, on peut crire :
import monPaquetage.* ; //utilis. des classes de monPaquetage

La structuration des paquetages dans les rpertoires peut tre faite plusieurs niveaux. Par exemple, si le rpertoire monPaquetage contient un sous-rpertoire sonPaquet contenant un fichier bidule.class correspondant au source suivant :
package sonPaquet ; public class saClasse { ... void allerToutDroit() { } }

Alors, depuis le fichier toto.java, on pourra utiliser la classe saClasse en crivant par exemple :
// toto.java ... import monPaquetage.sonPaquet.saClasse ; ... saClasse s; ... s.allerToutDroit() ;

Bruno Bouzy

28

09/10/03

Notes de cours Java

10. Exceptions La gestion derreurs faites avec des paramtres de retour dans des fonctions est une technique relativement lourde grer pour le programmeur. La gestion dexceptions est un mcanisme qui est plus lger car indpendant des paramtres de retour dune fonction. Java permet de grer des exceptions. Crer une exception Une traitement devenant incorrect, compar son objectif, peut lancer une exception avec le mot-cl throw :
{ // ici un traitement est incorrect throw monException; }

Evidemment monException doit tre un type connu. Pour cela, on doit indiquer au minimum que monException est une extension de la classe pr-dfinie Exception :
class monException extends Exception {}

Spcifier une exception ventuelle au niveau suprieur La mthode contenant un lancement dexception potentiel doit spcifier cette exception ventuelle son appelant, en utilisant le mot-cl throws dans sa signature. Ci-dessous, la signature de la mthode maMethodeAvecExceptionPossible prcise son appelant quelle peut signaler lexception monException.
void maMethodeAvecExceptionPossible() throws monException { }

Rcuprer ou ignorer une exception ? Lappelant dune mthode lanant des exceptions a le choix entre : ignorer lexception et la transmettre au niveau appelant suprieur en utilisant nouveau le mot-cl throws, rcuprer lexception avec des blocs de code qui utilisent les mot-cls try et catch. Ignorer une exception Dans le premier cas, lexemple donne :
void maMethodeAppelanteSansRecupration() throws MonException { maMethodeAvecExceptionPossible() ; } // transmet au niveau suprieur

Bruno Bouzy

29

09/10/03

Notes de cours Java

Rcuprer une exception Dans le second cas, il donne :


void maMethodeAppelanteAvecRecupration() { try { // essai dappeler la mthode maMethodeAvecExceptionPossible() ; } catch (MonException) { // rcupre lexception System.out.println( Exception levee ) ; exit(0) ; } }

Dans cet exemple, maMethodeAppelanteAvecRecupration choisit de ne pas transmettre lexception au niveau suprieur, elle rcupre lexception en affichant le message Exception levee et en arrtant le programme. Dautres rcuprations moins brutales sont videmment possibles. Noter que la signature de maMethodeAppelanteAvecRecupration ne contient plus le throws. Mcanisme transitif Dans cet exemple, nous avons vu comment sont gres les exceptions entre un niveau appelant et un niveau appel. Ce mcanisme est gnral tous les niveaux dappel. Les exceptions peuvent se transmettre de mthode en mthode au travers de larbre des appels jusqu trouver une mthode contenant un gestionnaire de cette exception (bloc try-catch). Si aucun gestionnaire dexceptions nest trouv, le programme main se termine en gnrant lexception. Attribut, instance dexception Dans lexemple prcdent nous avons utilis une classe exception, mais on peut aussi utiliser une instance dune classe exception, dfinir des attributs, et mme des mthodes dans la classe exception tendue :
class monException extends Exception { public int monAttribut ; }

Ainsi on peut lancer une instance dexception :


{ monException except = new monException() ; except.monAttribut = -1 ; throw except; }

On peut alors traiter lexception en utilisant la valeur de monAttribut de lexception :


void maMethodeAppelanteAvecRecupration() { try { // essai dappeler la mthode maMethodeAvecExceptionPossible() ; } catch (MonException e) { // rcupre lexception System.out.println( Exception levee ) ; if (e.monAttribut==-1) exit(0) ; } }

Bruno Bouzy

30

09/10/03

Notes de cours Java

11. Multi-tches Java permet de dfinir des processus lgers ou thread au sein dun programme. Cette technique est trs utile ds quun programme doit grer de faon asynchrone plusieurs sources dinformations (sur le rseau, sur le clavier, sur un cran graphique, etc.). Tche, processus, thread et processus lger Rappels : une tche ou processus est une excution dun programme de manire asynchrone au sein dun systme dexploitation. Exemple : un processus Unix. Un processus lger est une tche lintrieur dun langage gre le multi-tches. Un processus lger nest pas vu du systme dexploitation mais seulement du langage multitches. Un thread est un processus lger gr par Java. Si un programme Java A lance 3 threads et que un programme Java B lance 4 threads et que lon lance un processus Unix sur A et un processus Unix sur B, on aura 2 processus Unix avec en tout 7 threads. Etat dun processus (lger ou pas) Un processus peut tre : ? inactif (il nest pas lanc) ? actif (il est lanc) ? en attente (il est lanc mais na pas toutes ses ressources, il les attend) ? prt (il est lanc, il a toutes ses ressources sauf le processeur) ? en cours (il est lanc, il a toutes ses ressources mme le processeur) Dfinir et lancer un thread On peut dfinir un thread de deux manires : avec la classe Thread ou bien avec linterface Runnable de java. Dans les deux cas, on doit avoir une mthode run() contenant le corps de lexcution du thread. Le thread est lanc avec lappel de la mthode start().
Avec la classe Thread : // definition par extension de la classe Thread class Process extends Thread { public void run() { } } // utilisation Process p = new Process() ; p.start() ;

Cette premire technique est adapte si on veut quun objet de la classe Process utilise les mthodes de la classe Thread. Par contre, elle est inutilisable si la classe Process est par ailleurs une sous-classe dune autre classe car il ny a pas dhritage multiple en Java.

Bruno Bouzy

31

09/10/03

Notes de cours Java

Avec linterface Runnable : // definition par implementation de linterface Runnable class Proc implements Runnable { public void run() { } } // utilisation Proc p = new Proc() ; Thread t = new Thread(p, mon thread ) t.run() ;

Cette dernire technique est adapte en Java si on veut que Proc soit par ailleurs une sous-classe dune autre. Linconvnient de cette technique est limpossibilit dappeler les mthodes de la classe Thread. Synchronisation et vnements
wait(),

Le mot-cl synchronized permet de modliser les section critiques et les mthodes notify() et notifyAll() permettent de modliser la transmission dvnements ou signaux entre threads.
Section critique avec synchronized

Un seul processus la fois excute le code contenu dans une section critique associe un objet. Pour spcifier quune section de code est critique associe un objet, on utilise le mot-cl synchronized et, la cration du thread, on lui passe cet objet en paramtre dans le constructeur. On peut explicitement spcifier la section critique sur lobjet :
synchronized (objet) { // section critique }

ou implicitement en mettant le mot-cl synchronized devant une mthode dinstance :


synchronized void maMethodeSynchronisee() { // section critique }

Exemple concret :
class Ballon extends Object { public String nom; public Ballon(String n) { nom = n; } public synchronized void prendre_donner(Joueur j) { j.sleep(1000); System.out.println(j + " LACHE le ballon "); } public static void main(String args[]) { Ballon a = new Ballon("adidas", 0); Joueur gauche = new Joueur(a, "zidane"); Joueur droite = new Joueur(a, "ronaldo"); gauche.start(); droite.start(); } }

Bruno Bouzy

32

09/10/03

Notes de cours Java

class Joueur extends Thread { public Ballon monBallon; public String nom; public Joueur(Ballon b, String n) { monBallon = b; nom = n; } public void run() { for(;;) monBallon.prendre_donner(this); } }

Ici on a dfini la classe Joueur comme extension de la classe Thread. On a pass le ballon adidas au constructeur des deux threads. Il sert donc pour synchroniser les deux threads. La mthode prendre_donner applique au ballon adidas ne peut tre excute que par un seul Thread la fois car elle est dclare avec le mot-cl synchronized. Lexcution sera donc une alternance dexcutions du thread ronaldo et du thread zidane . Il faut retenir quen cours dexcution, un thread rentrant dans une section critique demande laccs lobjet associ. Si la section critique est libre, le thread rentre effectivement dans la section critique et loccupe. Sinon, le thread attend et ds que la section critique est libre, il y rentre effectivement. Avec le mot-cl synchronized, on a donc la notion de smaphore une place.
Les mthodes denvoi et rception de signaux wait(), notify() et notifyAll()

On peut amliorer le mcanisme prcdent avec les mthodes wait(), notify() et notifyAll(). Un thread qui occupe une section critique associe un objet peut la librer en appelant la mthode wait() sur lobjet. En faisant cela, le thread se bloque et attend quun autre thread fasse un notify() sur le mme objet. Pour chaque objet, Java gre une file dattente des threads en attente dun notify() sur cet objet. Ds quun thread utilisant cet objet fait un notify(), Java met le premier thread de la file dattente dans ltat prt. Ainsi ce thread pourra nouveau avoir la main lorsque la section critique sera libre. Si un thread fait un notifyAll() sur un objet associ une section critique, tous les threads qui avaient effectu un wait() sur cet objet sont mis dans ltat prt. Bien noter quun thread qui fait un wait() dans une section critique nest plus occupant de la section critique. Ce qui permet un autre thread de rentrer dans la section critique (et donc de faire un notify() ou un notifyAll() qui dbloquera les threads qui attendent). Bien noter aussi quune section critique associe un objet peut tre fragmente et non connexe. Avec ce mcanisme, on peut alors implmenter une classe Semaphore au sens habituel. Un smaphore possde des places qui peuvent tre rserves et libres par des Processus, extensions des threads.

Bruno Bouzy

33

09/10/03

Notes de cours Java class Semaphore { public int places; // nombre de places max public int libres; // nombre de places libres public Semaphore(int p) { places = p; libres = p; } public synchronized void reserver(Processus p) { if (libres>0) { p.etat = 2; libres--; } else { p.etat = 1; wait(); p.etat = 2; libres--;} } public synchronized void liberer(Processus p) { if (libres < places) { libres++; notify(); p.etat = 0;} } public static void main(String args[]) { // programme de test Semaphore s = new Semaphore(2); Processus p1 = new Processus(s, "a", 10); Processus p2 = new Processus(s, "b", 15); Processus p3 = new Processus(s, "c", 25); p1.start(); Thread.sleep(1000); p2.start(); Thread.sleep(1000); p3.start(); } } class Processus extends Thread { public static Vector mesProcessus = new Vector(); public Semaphore monSemaphore; public String nom; public int periode; public int etat; // 0 = libre, 1 = attente , 2 = propri public Processus(Semaphore s, String n, int p) { monSemaphore = s; nom = n; periode = p; etat = 0; nombre = 0; mesProcessus.addElement(this); } public void run() { System.out.println(mesProcessus); for(;;) { monSemaphore.reserver(this); System.out.println(mesProcessus); sleep(periode*1000); monSemaphore.liberer(this); System.out.println(mesProcessus); sleep(periode*1000); } } }

(les blocs try catch autour des sleep et wait ont t enlevs pour la lisibilit du programme). Grer explicitement lactivit des threads avec des mthodes Mme si il nest pas trs propre, de grer lactivit des threads en suspendant, arrtant, redmarrant, endormant un thread explicitement plutt quen utilisant des smaphores, Java permet de le faire avec les primitives :
sleep(int) suspend() stop() yield() join() resume() // // // // // // endormir pour un temps donn suspendre arrter dfinitivement rendre le processeur, passer de prt en attente attendre la fin dun processus redmarrer aprs suspension

setPriority(int)

On peut donner des priorits aux threads avec les mthodes getPriority() et allant de 1 10, 5 tant la priorit normale. Un processus de priorit forte sera excut en premier.

Bruno Bouzy

34

09/10/03

Notes de cours Java

12. Traitement des fichiers A partir dun exemple simple, ce paragraphe explique comment il est possible de sauvegarder et charger des donnes dans un fichier. Ce genre de manipulation est trs utile pour stocker les informations engendres par une excution du logiciel avec un utilisateur. Dans lexemple, une bibliothque (classe Bibli) contient des livres (class Livre). La bibliothque contient une liste des livres de type Vector.
public class Livre{ public int _noReference; public String _titre; public String _auteur; public int _nbExemplaires; } public class Bibli{ public Vector _listeLivres ; public Bibli(){ Vector _listeLivres = new Vector(); } }

Pour ouvrir un fichier (et pouvoir y crire des informations de manire souple ensuite), on appelle successivement des constructeurs des classe File, FileOutputStream et DataOutputStream.
try{ File livres = new File("livres"); FileOutputStream fosLivres = new FileOutputStream(livres); DataOutputStream dosLivres = new DataOutputStream(fosLivres); _BMuni.sauverLivres(dosLivres); } catch(IOException e) { System.out.println("Problemes de Fichiers!"); }

writeUTF()

Pour crire effectivement dans le fichier, on utilise les mthodes writeInt(), de la classe DataOutputStream.
public void sauverLivres(DataOutputStream dos) throws IOException{ dos.writeInt(this._listeLivres.size()); for(int i=0;i<this._listeLivres.size();i++){ Livre liv =(Livre)_listeLivres.elementAt(i); dos.writeInt(liv._noReference); dos.writeUTF(liv._titre); dos.writeUTF(liv._auteur); dos.writeInt(liv._nbExemplaires); } }

Pour ouvrir un fichier (et pouvoir y lire des informations de manire souple ensuite), on appelle successivement des constructeurs des classe File, FileInputStream et DataInputStream..
Bibli _BMuni = new Bibli(); File sauvegardeLivres = new File("livres"); FileInputStream fisLiv = new FileInputStream(sauvegardeLivres); DataInputStream disLiv = new DataInputStream(fisLiv);

Bruno Bouzy

35

09/10/03

Notes de cours Java _BMuni.recupLivres(disLiv);

Pour lire des informations sauvegardes de la manire dcrite ci-dessus dans un fichier, on utilise les mthodes readInt(), readUTF() de la classe DataInputStream..
public void recupLivres(DataInputStream dis) throws IOException{ int tailleFichier=dis.readInt(); for(int i=0;i<tailleFichier;i++){ int noRef=dis.readInt(); String titre=dis.readUTF(); String auteur=dis.readUTF(); int nbExemp=dis.readInt(); Livre l = new Livre(noRef,titre, auteur, nbExemp); } }

Bruno Bouzy

36

09/10/03

Notes de cours Java

13. Lenvironnement de dveloppement En gnral, on fait du java avec un environnement de dveloppement, soit en tant que tel (visual J++, visual Age, visual Caf etc.), soit avec lenvironnement de dveloppement minimal que lon peut rcuprer gratuitement sur le web (Java Developer Kit : JDK), soit avec un browser (navigateur) web. Lutilisation de tels environnements, si elle facilite la tche des programmeurs avancs, est souvent le premier obstacle qui arrte net llan du programmeur dbutant. Ce paragraphe rassemble quelques informations indispensables pour dmarrer en utilisant lun ou lautre des environnements. Visual xxx Avant de commencer quoi que ce soit en visual XXX (Caf, Age, J++, etc), il est essentiel crer un nouveau projet et/ou un workspace puis de savoir les r-ouvrir lors de sessions ultrieures.
crer un projet ou un workspace

Un projet (ou un workspace ) est une enveloppe autour de votre logiciel quil est ncessaire de crer. Pour crer un projet, cliquer sur le bouton file de la barre du haut, puis sur new . Une fentre apparat. Dans la case location crire le nom du rpertoire o vous voulez placer le rpertoire de votre projet. Attention, ce rpertoire va contenir vos sources. Il est important de ne pas oublier dcrire son nom sinon votre projet va tre mis dans un rpertoire qui visual XXX choisit votre place et que vous ne saurez pas ncessairement retrouver. Dans la case project name crire le nom du projet cr (par exemple garage ). Slectionner Java Project puis cliquer sur OK . Revenir dans windows. Un rpertoire a t cr et il porte le nom du projet. Le rpertoire garage ne contient que quelques fichiers pour la gestion du projet (.dsp, .dsw, etc...). Si vous voulez utiliser des sources java, que vous possdez par ailleurs, faire 2 choses : en windows, ramener ces fichiers dans le rpertoire du projet et, en visual XXX, les ajouter au projet. Si vous navez pas de fichiers java utiliser (cest le cas lorsque vous dbutez), vous pouvez sauter la lecture de ce paragraphe. Pour les placer dans le rpertoire du projet, faire un copier-coller depuis le rpertoire o se trouvent vos fichiers .java vers le rpertoire de votre projet. On voit alors que le rpertoire du projet contient les fichiers . java et les fichiers de gestion du projet (.dsp, .dsw, etc.). Rien de difficile. Pour les ajouter au projet, revenir dans visual XXX. Faire Project add to project files . Slectionner les fichiers qui vous intresse. Cliquer sur OK . Maintenant, en cliquant sur le + de garage files , vous devez voir vos fihciers dans le projet et en cliquant sur le + de garage classes , vous devez voir les classes java dcrites par vos fichiers .java. Il faut savoir que visual XXX cre toujours un workspace en plus du projet. Un workspace est une enveloppe autour de plusieurs projets. Cette notion est inutile pour linstant car vous navez besoin que dun seul projet.

Bruno Bouzy

37

09/10/03

Notes de cours Java rouvrir un projet ou un workspace existant

Pour ouvrir un projet ou workspace dj cr la dernire fois, faire file open wokspace ou bien file open et slectionner le fichier garage.dsp ou garage.dsw selon que vous voulez ouvrir le projet ou le workspace. Votre projet est charg. Ces oprations de cration et de rouverture ne sont pas videntes au dbut mais elles doivent absolument devenir des automatismes car elles sont effectues souvent.
Construire et dmarrer lapplication

Faire build pour construire lapplication. Dans la fentre en bas, si votre programme ne contient pas derreur, apparat le message : 0 error(s), 0 warning(s) . Sinon, corriger les erreurs et refaire build tant quil y a des erreurs. Faire execute pour lancer lapplication. La premire fois que lon effectue le dmarrage une fentre apparat avec deux possibilits : applet ou stand-alone . Cliquer sur stand-alone pour avoir une application console classique et sur applet pour avoir une applet (mini-application sinsrant dans une page web). A la question class file name , rpondre par le nom de la classe contenant le programme main de votre application. Attention aux majuscules-minuscules, sinon java ne trouvera pas le programme principal et votre application ne dmarrera pas. Java Developer Kit (JDK) Le Java Developer Kit (JDK) est un environnement de dveloppement gratuit rcuprable sur le site Web de Sun. Son utilisation est trs simple avec des commandes lignes. En Linux, on lutilise avec essentiellement deux commandes : javac (compilateur), java (interprteur). Sous Linux, pour compiler un fichier Ballon.java il suffit de faire :
javac Ballon.java

Et un fichier Ballon.class est engendr ; il sagit du bytecode java. Pour excuter (interprter) un fichier Ballon.class il suffit de faire :
java Ballon

Et le programme principal main() de la classe Ballon est excut. Attention, pour installer le JDK, des variables denvironnement peuvent tre positionner correctement : JDK_PATH : le rpertoire o est install le JDK PATH : le rpertoire ou se trouve les binaires java et javac ; On peut avoir en gnral PATH = JDK_PATH /bin CLASSPATH : le rpertoire o javac met les classes compiles. JAVA_HOME/bin : le rpertoire contenant les commandes java et javac En bash, faire ventuellement un export CLASSPATH=. pour que les fichiers .class soient placs et recherchs dans le rpertoire courant.

Bruno Bouzy

38

09/10/03

You might also like