Sie sind auf Seite 1von 82

Error: Reference source not found Error: Reference source not found Error: Reference source not found

Error: Reference source not found Error: Reference source not found Error: Reference source not found Error: Reference source not found Error: Reference source not found Error: Reference source not found Error: Reference source not found

CHAPITRE 1 - L'Orient Objet


Ce chapitre ne concerne pas seulement Java mais tout langage orient objet. Il donnera les notions et le vocabulaire fondamentaux de l'OO.

1.1- La programmation oriente objet


Les deux grands mondes de la programmation
Il existe deux grands types de programmation :

Le Procdural ou structur comme le C o on dfinit des fonctions s'appelant mutuellement. Chaque fonction ou procdure est associe un traitement particulier qui peut tre dcompos en sous traitements jusqu' obtenir des fonctions basiques. Globalement, le procdural travaille sur l'action ou le verbe. Par exemple, pour calculer la vitesse d'une voiture, la philosophie du procdural conduira faire : calculVitesse(voiture) partout o cela est ncessaire. Le code faisant rfrence une voiture est donc "fondu" et dispers dans l'ensemble des programmes. L'Orient Objet ( ou OO ) o on manipule uniquement des objets c'est--dire des ensembles groups de variables et de mthodes associes des entits intgrant naturellement ces variables et ces mthodes. Dans cette configuration, le sujet est prpondrant: disposant d'un objet Voiture, on effectuera spontanment : Voiture.calculVitesse() . Tout le code touchant l'objet Voiture se trouve ainsi regroup.

Avantages de l'Orient Objet

L'OO supplante peu peu le procdural dans les grands programmes car il prsente d'normes avantages: facilit d'organisation, rutilisation, mthode plus intuitive, possibilit d'hritage, facilit de correction, projets plus faciles grer. L'intrt principal de l'OO rside dans le fait que l'on ne dcrit plus par le code des actions raliser de faon linaire mais par des ensembles cohrents appels objets. L'OO est facilement concevable car il dcrit des entits comme il en existe dans le monde rel. Ainsi, l'objet Voiture qui implmente la mthode Voiture.rouler et possde la proprit Voiture.Cylindre est facilement concevable et peut tre utilise -par exemple- dans une simulation de course automobile o on fera interagir plusieurs objets Voiture. Les modles objets ont t crs pour modliser le monde rel. "Dans un modle objets, toute entit du monde rel est un objet, et rciproquement, tout objet reprsente une entit du monde rel".

L'OO permet en quelque sorte de factoriser le code en ensembles logiques. Du point de vue de la programmation, L'OO permet d'crire des programmes facilement lisibles avec un minimum d'exprience, de taille minimale et la correction aise. Ces programmes sont, de plus, souvent trs stables. Les informations concernant un domaine tant centralises en objets, il est facile de scuriser le programme en interdisant ou autorisant l'accs ces objets aux autres parties du programme. En gnral, en OO, cohabitent deux types de dveloppeurs: ceux qui conoivent les objets et ceux qui utilisent ces objets dans leurs programmes. De cette faon, la programmation objet permet de diviser la complexit. La programmation objet permet d'obtenir des projets stratifis. Chaque protagoniste ne travaille que sur des implmentations le concernant.

1.2- Concepts gnraux de l'OO


1.2.1- Notion de classe
Une classe encapsule, c'est--dire regroupe des proprits et des comportements. Par exemple, la classe Humain dfinit des proprits ( deux bras, deux jambes...) et des comportements ( marcher, parler, voir...).

classe Humain En OO, les comportements sont appels mthodes et les proprits variables d'instance. Notons que les proprits des classes peuvent elles-mme tre des objets. Par exemple, la proprit bras de notre exemple peut tre un objet de type 'Bras'. Si nous prenons l'exemple d'une voiture, la classe 'Voiture' sera l'ensemble des plans de la voiture.

1.2.2- Notion d'objet


Un objet est une instance de classe, c'est--dire un exemplaire utilisable cre partir de cette classe et en valorisant certaines proprits. Par exemple, bob ou bill sont des instances de la classe Humain, c'est--dire des humains ayant des proprits spcifiques ( bob est un humain

aux yeux noirs et bill un humain aux yeux marrons ). Notons que le concept de classe est abstrait : personne n'a jamais vu d'Humain dans la nature alors que le concept d'objet est fondamentalement concret : il est concevable de croiser des personnes physiques, c'est--dire des instances d'Humain.

Tout objet possde un type: bob est de type Humain. L'instance d'une classe est du type de sa classe. C'est le type initial de l'objet. La classe est le moule, le plan, la recette de tout objet. La plupart du temps, les objets sont initialiss lors de leur instanciation. Le systme excute alors automatiquement le constructeur de la classe. Le constructeur est excute l'instanciation de l'objet. Il prend en argument des proprits du nouvel objet. L'instanciation d'une voiture rouge se fait par Voiture(rouge). Une classe peut avoir plusieurs constructeurs. Dans notre exemple, on peut instancier une Voiture en ne lui prcisant que sa couleur ( exemple prcdant ) ou en lui prcisant en plus sa marque de fabrique : Voiture(rouge,Renault) Toujours dans notre exemple de voiture, une instance de Voiture sera physiquement une voiture - unique - qui a t construite partir du plan 'Voiture'.

1.2.3- Notion de rfrence sur un objet


Dans les programmes, un objet est une zone mmoire qui est pointe par une ou plusieurs rfrences. Une fois l'objet instanci, il correspond en ralit une zone mmoire donne. Cette zone mmoire, pour tre utilise doit tre rfrence. Par exemple, bob est une rfrence sur l'objet de type Humain correspondant et vaut l'adresse mmoire E515:FB80 . Instancions l'objet bill : il y a rservation d'une seconde place mmoire rfrence ( pointe) par la rfrence bill valant E515:FF90. Un objet peut possder plusieurs rfrences: par exemple, si on fait bill = bob, cela signifie qu'ils rfrencent tous les deux le mme objet, la mme zone mmoire. Dans ce cas, l'objet bill est donc perdu car il n'est plus rfrenc. Les rfrences bill et bob dsignent maintenant le mme objet. Dans la suite de ce document et pour amliorer la comprhension, nous dsignerons par abus de langage une rfrence sur un objet par le terme 'objet'. Par exemple: "l'objet Bill de type Humain" au lieu de "la rfrence Bill sur l'objet correspondant de type Humain". Dans l'exemple de la voiture, une rfrence sur un voiture pourrait tre sa plaque d'immatriculation.

1.3- Proprits de base de l'OO


1.3.2- L'hritage
L'hritage permet de spcialiser une classe qui possdera non seulement les proprits et mthodes de sa mre mais galement d'autres mthodes spcifiques ou redfinies. Le terme est faire driver la classe en une classe fille. Dans l'objet fille, on trouve:

De nouvelles mthodes ou proprits Des mthodes ou proprits qui surchargent, c'est- -dire redfinissent celles de la classe mre. Les proprits et mthodes de la classe mre qui n'ont pas t surcharges

Remarque: Les mthodes et proprits peuvent tre hrites un niveau n, c'est--dire qu'un objet peut utiliser une mthode de la mre de sa mre et ainsi de suite. Exemple d'hritage : Les classes Voiture et Moto drivent de la classe Vhicule.

Voiture : Conserve la mthode rouler() de Vhicule Conserve la proprit Couleur de Vhicule Surcharge la mthode seGarer de Vhicule Implmente la mthode reculer() Possde la nouvelle proprit Volant Moto: Conserve la mthode seGarer() de Vhicule Conserve la mthode rouler() de Vhicule Conserve la proprit Couleur de Vhicule Implmente la mthode passerEntreLesVoitures() Possde la nouvelle proprit Guidon

1.3.2- Le polymorphisme et le transtypage


Les objets sont dits polymorphes car ils possdent plusieurs types: le type de leurs classes et les types des classes ascendantes. Par exemple, uneHonda, instance de Moto aura comme type initial Moto mais une Moto possde par hritage le type Vhicule. L'objet uneHonda est bien un Vhicule. Dans certains cas, il est possible de forcer le programme 'voir' un objet comme un type diffrent de son type initial, c'est le transtypage ou cast. Ce transtypage ne modifie par l'objet mais indique seulement la faon de le voir. Il y a transtypage implicite de la fille vers la mre: une Voiture est implicitement de type Vhicule. Attention! Une erreur courante est de penser qu'il y a cast de la mre vers la fille: Une classe mre n'est pas du type de sa fille! Un Vhicule n'est pas forcement une Voiture. Dans certains cas, nous avons besoin d'affecter une variable d'un type une autre d'un autre type. De nombreux problmes mtaphysiques s'en suivent gnralement. La bonne faon de raisonner lorsque l'on veut affecter un type un autre est de procder comme suit: On fait A <- B ; A possde un type initial, le type que l'on a donn l'instanciation. Cette affectation est valide si et seulement si B est du type initial de A. Autrement dit, il faut que B soit de mme type initial que A ou d'un type driv de celui de A. Exemple: monVehicule est une instance de type Vhicule; maVoiture est une instance de type Voiture; maVoiture <- monVehicule : est-ce une affectation valide? maVoiture est de type initial Voiture ; monVehicule est de type initial Vhicule et un Vhicule n'est pas forcement une Voiture donc cette affectation n'est pas valide. En revanche tudions l'affectation : monVehicule <- maVoiture : maVehicule est de type initial Vhicule et maVoiture est galement de type Vhicule car Voiture drive de Vhicule; donc cette affectation est valide !

Polymorphisme paramtrique
Le terme polymorphisme est galement souvent associ par abus de langage au concept de polymorphisme paramtrique: un objet peut comporter plusieurs mthodes de mme nom et possdant des arguments diffrents. Ce sont des mthodes polymorphiques. Nous en avons vu un exemple avec les constructeurs. Voiture.rouler(chemin) la faon dont la voiture roule ne dpend que du chemin. Voiture.rouler( chemin,meteo) la faon dont la voiture roule dpend du chemin et de la mto. Voiture.rouler(chemin,meteo,circulation) la faon dont la voiture roule dpend du chemin, de la mto et de la circulation.

1.3.3- Les deux types de transtypages

Il existe deux types de transtypage:

Le transtypage ascendant qui sert un objet tre vu comme du type de sa mre. Ce transtypage est fait de faon implicite et n'est ncessaire que dans le cas o la classe courante possde une proprit ayant le mme nom que sa classe mre et que l'on cherche accder la proprit mre. ( ce transtypage rarement utilis est illustr au chapitre 06 ). Le transtypage descendant - le plus courant - qui sert forcer une classe de type mre tre vue comme un type fille. Ce transtypage n'est valide que si l'objet de type mre tait de type fille son instanciation.

TD 1 - L'Orient Objet
Exercice 1 - Exercice de vocabulaire
Donnez la signification des termes suivants ( donner des exemples ): Instance - objet - classe - mthode - comportement - proprit - surcharge - transtypage hritage - classe fille - classe mre - type - rfrence - polymorphisme - constructeur.

Exercice 2 - Questions

Quels sont les principales diffrences entre la programmation objet (comme le Java) et procdural (comme le C) ? Quels sont les avantages de la programmation OO ? Quels sont les deux types de services que on rencontrer dans une structure dveloppant OO en entreprise ? Quelles sont les diffrences entre une classe et un objet ? Comment obtenir un objet en vue de l'utiliser ? Qu'est ce que le polymorphisme ? le polymorphisme paramtrique ? A quoi sert l'hritage? Qu'est ce que le transtypage? Le transtypage modifie-t-il l'objet ? Quelle est la diffrence entre type l'instanciation et type acquis par cast (inn et acquis en quelque sorte ) ? A quelle condition peut-on transtyper coup sr un objet d'un type vers un autre type?

Exercice 3- Exercice sur l'hritage et les mthodes


Dans cet exercice, nous noterons (Toto)Titi comme le transtypage de Titi en type Toto. La classe Voiture drive de la classe Vhicule.

Soit le programme suivant se trouvant dans une classe quelconque: ( les notations ne correspondent pas celles d'un vritable langage de programmation).

classe Vhicule mthode rouler(){ ... } mthode seGarer(){ ... }

classe Voiture drive de Vhicule{ mthode seGarer(){ ... } mthode klaxonner(){ ... } mthode rouler(){ ... } }

Soit une106, une instance de Voiture et monVehicule, une instance de Vhicule. 1- Peux-t-on faire une106.rouler() ? Pourquoi ? 2- Si l'on fait une106.seGarer(), est-ce la mthode de la classe Vhicule ou de la classe Voiture qui est appele ? 3- Peux-t-on faire monVehicule.klaxonner() ? Pourquoi ?

CHAPITRE 2 - Introduction au langage Java


Il sera ici question de placer Java dans le cadre des langages objets, de rappeler succinctement son historique et de donner ses spcificits. Dans un second temps, nous tudierons les rgles et la syntaxe du langage. Les specifications exhaustives du langage Java sont regroupes dans le document The Java language specification que vous trouverez sur le site de Sun Microsystems.

2.1- Historique du langage et environnement industriel


Java est n dans les laboratoires de Sun Microsystems en 1990 avec le JDK 1.0 (Java Development Toolkit ). C'est donc un langage propritaire mais trs ouvert car les sources du langage sont fournies par SUN et ont permis d'autres socits comme IBM de fournir leurs propres kits de dveloppement. Sun fourni depuis dbut 2000 le JDK 1.3 appele galement Java2 depuis la version 1.2 en 1998.

Cependant si ces kits de dveloppement contiennent principalement un compilateur : javac , un interprteur : java et un visualiseur d'applet: l'AppletViewer, ils ne comprennent pas d'interface de programmation et il faut dvelopper avec un simple diteur de texte. C'est pourquoi des diteurs de logiciels ont produit des diteurs performants: Borland avec JBuilder, Sun Microsystems avec Fort... De leur cot, les applets sont des programmes fonctionnant avec un navigateur Internet. Chaque navigateur possde une JVM ( Java Virtual Machine, voir plus loin) qui fait partie du JRE ( Java Runtime Environment ). C'est cette JVM incluse dans le navigateur qui interprte et excute l'applet.

2.2- Portabilit du langage / JVM


La source d'un programme C est de type .c et aprs compilation, nous obtenons un fichier excutable. Ce runtime est directement excutable par le processeur pour lequel il a t compil. La source d'un programme Java est un fichier de type .java et aprs compilation nous obtenons une classe ( .class ). Comme en C, il existe des compilateurs pour quasiment tous les types de machines ( PC Intel, PPC, Sparc...) et d'OS ( AIX, Linux, HP-UX, Solaris, MacOS, Microsoft Windows...) mais le fichier .class n'est pas directement excutable par le processeur. En ralit, cette classe est identique sur toutes les machines et contient du byte code c'est dire du code excutable par un processeur Java. Le processeur virtuel ( ou JVM: Java Virtual Machine ) est le programme 'java' qui excute le byte code la vole. Cela permet Java d'obtenir une portabilit de la source ( comme en C ) mais surtout du code binaire. Il est ainsi possible d'excuter indiffremment une applet sur Internet selon que l'on navigue avec un Mac ou un PC.

Remarque: Il existe galement des processeurs physiques spcialiss dans l'excution du byte code. Dans ce cas, la majorit des instructions Java sont cbles en dur. Il existe plusieurs constructeurs fabriquant ce type de processeurs qui permettent alors d'excuter le code java jusqu' vingt fois plus vite qu'avec une machine virtuelle logicielle.

2.3- Domaines classiques d'utilisation de Java


Aujourd'hui, on trouve principalement le langage Java dans les domaines suivants :

Les applications classiques ( server only ) s'excutant sur un machine comme tout programme. Borland JBuilder en est un exemple. De nombreuses grosses applications sont dveloppes en Java pour bnficier de la portabilit: les diteurs n'ont qu'une version maintenir pour tous les processeurs et systmes d'exploitation. Les applets qui sont des programmes Java particuliers s'excutant dans un navigateur web. Une applet est un programme Java insr dans une page HTML tlcharge d'un serveur web et s'excutant sur le poste client. Le domaine du multimdia ( son, traitement de l'image ) qui tire avantage des API Java spcialises. Le domaine du rseau pour raliser des programmes client-serveur de faon trs simple ( ftp, http, pages HTML dynamiques via JSP... ) De gros progiciels possdent un installeur unique crit en Java pour ne maintenir qu'une version et qu'une documentation utilisateur. Par exemple, Oracle 8i est fourni avec l'Oracle Universal Installer en Java. Programmes embarqus ( aronautique, applications industrielles... )

2.4- Applications et applets


On trouve en java deux types de programmes:

Les applications autonomes ( ou stand-alone ) excutables partir du systme d'exploitation comme tout programme. Ces applications sont souvent graphiques et ne ncessitent pour fonctionner qu'une JVM. Les applets, programmes Java spcialiss qui ne sont excutables qu'au sein d'un navigateur( ou browser ) Internet tel Netscape ou Internet Explorer. Les applets permettent de "donner vie" l'Internet en permettant d'insrer des programmes dans les pages Web alors que le langage HTML est statique.

2.5- Un langage sr et stable

Le code java tant interprt, les exceptions 'hard' de type division par zro ne peuvent se produire car la JVM contrle le code binaire gnr. Il n'y a pas de plantage mais uniquement propagation d'exceptions de faon totalement contrlable. De la mme faon, la JVM contrle les actions du code pour interdire certaines actions comme une utilisation illgale de ressource. Il n'y a pas de pointeurs en Java ni de gestion de la mmoire, ce qui limine selon SUN de 50 70% des bugs potentiels. Les objets peuvent tre dclars privs ou accs restreint, ce qui limite l'utilisation de ces objets aux classes autorises.

Dans les paragraphes suivants, nous nous attacherons dcrire les rgles et syntaxes du langage.

2.6- Notion de variable primitive


Contrairement certains langages 100% objet dans lesquels tout est objet, Java offre la possibilit d'utiliser des types primitifs. Il est possible de manipuler des objets mais dans de nombreux cas, il est prfrable d'utiliser des variables "classiques" comme en C. Ce sont les types primitifs dont les principaux sont int, float, boolean, char. Ce ne sont pas des objets. Ils ne sont pas instancis mais simplement dclars. La transmission de ces variables se fait par valeur: int a=3; methodeQuelconque(a); La mthode "methodeQuelconque" reoit la valeur "3" et non l'adresse mmoire de la variable a. Principaux primitifs:

Les entiers: Le format par dfaut d'un entier est l'int qui en Java est toujours cod sur 32bits ( de -231 231-1soit de-2147483648 2147483647).

Les flottants: float ou double. Attention! le format d'un flottant est par dfaut le double et non le float comme en C, ce qui conduit de nombreuses erreurs de compilation; il faut crire:

double d = 1.25; et float f = 1.25f;


Les boolens: boolean Les caractres: char

Taille des primitifs en Java: Type long int boolean byte float double Taille ( bits ) 64bits 32bits 8bits (faux 1 bit) 8 bits 32 bits 64 bits

2.7- Syntaxe du langage Les dclarations de variables


Les variables peuvent tre dclares n'importe o dans le code MAIS restent locales aux accolades courantes. Exemple: if (i == 1){ int j=2; System.out.println(j); //affiche '2' } System.out.println(j);//Erreur, j est inconnu Les principaux oprateurs arithmtiques et logiques

Oprateur + * / % && || = == < <= > >= != ! ~ & | ^ << >> >>>

Description Addition Soustraction Produit Quotient de division euclidienne Reste de division euclidienne "et" conditionnel "ou" conditionnel Affectation Comparaison de valeurs Infrieur - infrieur ou gal Suprieur - suprieur ou gal Diffrent de "non" logique Complment deux ( inverse le signe ) "et" arithmetique "ou" arithmetique "ou" exclusif (xor) arithmetique Dcalage gauche Dcalage droite sign Dcalage droite non sign

Les boucles et conditions


Ces traitements sont similaires au langage C. Succinctement:

L'instruction if

if ( i ==0 ){ i++; }

L'instruction while et do while

while (i<5){ i++ ; }

do{ i++; }while (i <5); L'instruction continue; permet de stopper l'itration en cours et d'en commencer une nouvelle: int i=0; while (true){ if (i ==4 ) { continue; } i++ ; //si i vaut 4, cette ligne n'est pas excute } L'instruction break; permet de stopper l'itration et de sortir de la boucle while (i<5){ if (i==4) { break; } i++; // si i vaut 4, cette instruction n'est pas excute } i=5; // aprs l'instruction break, nous passons directement cette ligne

L'instruction for

for (int i=0;i<5;i++){ }

L'instruction switch (manipule uniquement les entiers int et les caractres char )

switch(i){ case 1: j=1; break; case 2: j=2; default: j=0; }

// case '1': pour un char

Comme pour les while ou autres instructions conditionelles, l'instruction break permet de forcer la sortie du switch.

Variables et proprits
Il est existe en java deux types de variables:

Les variables d'instance ou de classe qui sont dclares hors mthodes et sont alors des proprits de l'objet ou de la classe. Les proprits peuvent tre des primitifs ou des objets. Les proprits primitives sont automatiquement initialises ( exemple : 0 pour les int ). Les variables locales qui sont dclares l'intrieur de mthodes. Elles ne sont visibles que dans la mthode et peuvent tre des primitifs ou des objets. Les variables locales primitives ne sont pas initialises automatiquement et doivent l'tre avant utilisation.

Dfinition d'une classe


La dclaration d'une classe doit respecter la syntaxe suivante: class MaClasse{ }

Constructeurs
Un constructeur est une partie de code appele lors de l'instanciation de la classe ( new ) et permettant d'initialiser l'objet. Une mme classe peut possder plusieurs constructeurs possdant des arguments diffrents. Un constructeur ne renvoie pas de valeur et possde le nom de sa classe. Typiquement, le constructeur peut initialiser ses variables d'instances. Exemple: class Voiture{ int iAge; Voiture(int iAge){ this.iAge=iAge; } Voiture(int iAge,int iKilometrage){ ... } }

Oprateurs this et super


L'oprateur this dsigne l'objet courant. this( [arguments] ) est un appel d'un constructeur ( appel valide uniquement dans un autre constructeur de la classe ). L'oprateur super dsigne la mre de l'objet. super( [arguments]) est un appel du constructeur de la classe mre. Un appel d'un constructeur de la classe mre ne peut se faire qu'en premire ligne d'un constructeur de la classe. Si rien n'est prcis, l'appel au constructeur vide super() de la classe mre est automatiquement ajout la compilation. Lorsqu'on instancie une classe drivant d'une classe mre, le constructeur appelle toujours celui de la classe mre. Par dfaut,

il cherche excuter super(); et si ce constructeur particulier n'existe pas, il y a erreur la compilation. Un constructeur peut appeler un autre constructeur ( this() ou super() ) mais il faut que cet appel soit la premire ligne du constructeur. Notons que l'appel un constructeur ne se fait que par les mots this() et super() et non par le nom du constructeur. Enfin, il n'est pas possible d'appeler un constructeur ailleurs que dans un autre constructeur.

Exemple: class Voiture extends Vehicule{ int iAge; // variable d'instance int iKilometrage; Voiture(int iAge){ this(iAge,10000); } Voiture (int iAge,int iKilometrage){ super(); //appel du constructeur vide de la classe mre, on pourrait appeler un autre constructeur s'il existe. this.iAge=iAge; //this.iAge dsigne la proprit iAge de la classe. Si on ne prcise pas 'this', iAge dsigne la variable locale iAge de cette mthode qui masque la proprit. this.iKilometrage=iKilometrage; } }

null
Une rfrence ne pointant sur aucun objet instanci vaut une valeur particulire: null. Toute tentative de manipulation sur cette rfrence provoquera une erreur de type NullPointerException.

Instancier un objet
Le mot-cl new est utilis pour instancier un objet. Par exemple: Voiture une106; une106=new Voiture();

La premire ligne ne fait que prciser que une106 est une rfrence sur un objet de type Voiture. Pour le moment, cette rfrence pointe sur null. Le new cre l'objet en mmoire et excute son constructeur. A la fin de la construction, new renvoie la rfrence du nouvel objet. La rfrence une106 est affecte la valeur renvoye par le new; elle pointe bien maintenant sur la zone mmoire occupe par la nouvelle Voiture.

Obtenir le type d'un objet


Le mot-cl instanceof permet de vrifier qu'un objet est bien d'un type donn. Par exemple,

Voiture une106=new Voiture(); une106 instanceof Voiture renverra true Attention, instanceof n'est pas une mthode mais un mot-cl du langage. La classe d'instanciation d'objet est donn par la mthode getClass() de la classe Object: une106.getClass(); renvoie Voiture.

Comparaison d'objets
Il ne faut pas confondre rfrence sur objet et contenu de l'objet. Par exemple: Integer i1=new Integer(1); Integer i2=new Integer(1); i1 == i2 renverra false car l'oprateur ' == ' compare les rfrences Mais i1.equals(i2); renverra true car la mthode equals() compare le contenu des objets et non les objets eux-mmes.

Hritage
Pour spcifier qu'une classe drive d'une autre classe, il faut utiliser l'oprateur extends lors de la dclaration de la classe: class Voiture extends Vehicule{ } La classe mre commune toutes les autres classes est la classe Object. Tous les objets drivent d'Object et les dclarations suivantes sont identiques: class Voiture{ } class Voiture extends Object{ } Consulter le chapitre sur l'hritage pour davantage d'informations.

Transtypage / cast
Pour transtyper un objet d'un type vers un autre type, la notation est la suivante: Integer i=(Integer)j; Nous dtaillerons le mcanisme de transtypage objet au chapitre sur l'hritage.

En ce qui concerne les types primitifs, la plupart des transtypages sont accepts si on transtype un primitif d'un type donn vers un type de taille suprieure ou gale. Notons que la syntaxe est identique celle du cast objet mme si la signification est totalement diffrente. Exemple: int i=10; long l=(long)i; // ok Mais pas : double d=10.0; float f=(float)d; //erreur de compilation

2.8- Notion de proprit ou mthodes statiques


Lorsqu'une variable ou une mthode est statique, elle ne dpend pas de l'instance particulire auquel elle appartient mais elle possde la mme valeur ou le mme comportement quelque soit l'instance concerne.

Proprits statiques
Les objets possdent proprits et mthodes. Cependant, certaines proprits ou attributs sont dfinies statiques. Par exemple, si iNbRoues est une proprit de la classe Voiture, et que l'on dsire s'assurer que toutes les instances de Voiture possdent le mme nombre de roues, on note: class Voiture{ static int iNbRoues=4; } Ds lors, une modification de cette valeur sur une instance de Voiture est rpercute automatiquement sur toutes les autres instances de cette classe. Si on instancie une Voiture nomm v1: Voiture v1=new Voiture(); Puis une autre Voiture nomm v2: Voiture v2=new Voiture(); Si l'on modifie iNbRoues de v1 alors la proprit iNbRoues de v2 prendra cette mme valeur. En cela, nous voyons que iNbRoues ne dpend pas de l'instance de Voiture auquel elle est rattache mais de faon gnrale la classe Voiture : c'est une variable de classe. Il est possible d'accder une variable de classe par la syntaxe <Nom de la classe>.<Nom de la variable de classe>. Ainsi, il est prfrable d'appeler cette proprit par Voiture.iNbRoues plutt que par v1.iNbRoues car nous rappelons ainsi que cette proprit est statique.

Mthodes statiques
Les mthodes peuvent galement tre statiques. On note: static void maMethode(){ .... } Par exemple, dans la classe Voiture , nous pouvons dfinir la mthode getNbRoues() comme tant statique. Cela signifie que la mthode n'utilise que des variables statiques de la classe et donc qu'elle ne dpend pas non plus de l'instance dans laquelle on se trouve mais uniquement de la classe. Il est alors prfrable d'appeler cette mthode par Voiture.getNbRoues() que par v1.getNbRoues() car nous rappelons ainsi que cette mthode est statique. Une mthode statique ne peut en aucun cas appeler de mthodes non statiques et ne peut manipuler de variables d'instance. En revanche une mthode non statique peut utiliser les proprits et mthodes statiques. Constantes Une constante de classe est une variable de classe ( donc une variable statique ) qui de plus est dclare final c'est dire non modifiable ni surchargeable par des classes filles. Exemple: class Voiture{ static final int iNbRoues=4; }

2.9- Notion de polymorphisme paramtrique


Un objet peut comporter plusieurs mthodes de mme nom mais possdant des arguments diffrents. Ce sont des mthodes polymorphiques. Nous en avons vu un exemple avec les constructeurs . void rouler(Chemin monChemin){ } //la faon dont nous roulons ne dpend que du chemin void rouler(Chemin monChemin ,Meteo mMaMeteo){ } //la faon dont nous roulons dpend du chemin et de la mto void rouler(Chemin monChemin,Meteo mMaMeteo,Circulation cMaCirculation){ } //la faon dont nous roulons dpend du chemin, de la mto et de la circulation A l'excution, en fonction du nombre et/ou des types transmis, la JVM sait quelle mthode est concerne par cet appel.

2.10- Cration d'une application autonome ou "stand-alone"


Une application autonome est une classe qui peut s'excuter travers la JVM. C'est une classe qui possde la mthode particulire main(). La mthode main doit tre de la forme: static void main(String[] sArgs){ .... } La mthode doit absolument tre statique et accepter en argument un tableau de chane de caractres qui sont les arguments du programme en ligne de commande. Une telle classe peut tre lance par la JVM, c'est dire le programme 'java' .

2.11- le JDK ou comment excuter ou compiler du code Java


Le JDK est le Java Development Kit. Il en existe plusieurs versions crites par plusieurs socits dont principalement Sun Microsystems et IBM. Un JDK est compos de binaires permettant principalement d'excuter un programme Java ou de le compiler. Il existe des JDK pour la plupart des processeurs et des OS.

Programme javac

'javac' est le compilateur java. Il compile un fichier .java en classe .class. Par exemple, javac HelloWorld.java Construira le fichier HelloWorld.class

Programme java

Permet d'excuter une classe possdant un main: java HelloWorld Attention aux confusions! le programme java lui-mme est un binaire compil pour un processeur et un systme d'exploitation donn mais la classe HelloWorld quant elle est interprte et ne dpend donc pas de la plate-forme d'excution. Il existe de nombreux autres outils dans le JDK dont : jar (outil de compression et d'archivage) , appletviewer (permet d'excuter une applet sans navigateur), keytool ( gestion de signature des classes ), javadoc (gestion automatique de la documentation)...

2.12- Normes SUN d'criture Java


La syntaxe des programmes Java est normalise par Sun Microsystems et permet une standardisation absolument indispensable pour un langage orient-objet. Une source ne respectant pas ces normes ( noter une classe en minuscule par exemple) devient rapidement trs difficile lire.

Indentation
L'indentation se fait ainsi:

L'accolade de dbut se met la fin de l'instruction prcdente. L'accolade de fin s'aligne au premier caractre de la ligne de dbut. Les blancs sont des tabulations.

Nous obtenons ainsi l'indentation suivante: if (i == 0){ i++; }

Les noms de classes


[premire lettre type en majuscule]+suite de mots dont chaque premire lettre est en majuscule: Integer, Objet, MaClasse, CeciEstUnNomDeClasseUnPeuLong...

Noms d'objets ou de variables primitives


[premire lettre type en minuscule] + suite de mots dont chaque premire lettre est en majuscule: La premire lettre ( en minuscule) sera de prfrence la premire lettre de sa classe pour connatre le type d'un objet sans chercher sa dclaration. Ceci est facultatif mais fort utile. Integer iNbRoues; int iComp;

Noms de mthodes
[premire lettre type en minuscule]+suite de mots dont chaque premire lettre est en majuscule: maMethode(int iComp); Les accesseurs ( mthodes renvoyant d'accder une variable d'instance de la classe ) seront nots :

get+[nom] pour accder une variable d'instance. Exemple: int getNbRoues() set+[nom] pour modifier une variable d'instance. Exemple : setNbRoues(int i) is+[nom] pour accder une variable de type boolean. Exemple : boolean isVoiture()

Noms de package
Les packages sont des regroupements de classes. (cf. chapitre "Modificateurs d'accs et packages" ). Ils sont toujours tout en minuscule: java.lang, javax.swing ...

Mots-cls Java
Les mots-cls comme return, instanceof, if, while, static, private, public, package, class... sont toujours en minuscule.

Constantes
Les constantes ( variables static final ) sont tout en majuscule et spars d'underscore si elles sont constitues de plusieurs mots ( HTTP_ROOT...)

Underscore ( _ )
Les noms de mthodes, classes, objets, primitifs... constitus de plusieurs mots ne doivent pas contenir d'underscore ( sauf pour les constantes ) mais la sparation est faites par la majuscule de la premire lettre du mot suivant.

Les commentaires
Comme en C, " // " pour la ligne en cours et " /* */ " pour un ensemble de lignes. Le code courant sera comment avec " // " et " /* */ " mais le code normalis javadoc devra suivre la syntaxe javadoc comme " /** " et " **/ ". Ce code normalis se trouvera en dbut des mthodes documenter (cf. doc de Sun sur javadoc )

Accolades
De prfrence, il faut poser des accolades mme lorsque ce n'est pas ncessaire: if (iComp==0){ iComp=1; } au lieu de : if (iComp= =0) iComp=1; Cela permet d'viter beaucoup d'erreurs.

return
return est un mot cl et non une mthode. Il vaut donc mieux crire : return i; ou return 2; ... que return(i) ou return(2); mme si cette syntaxe est autorise par le compilateur.

2.13 - Gestion de la mmoire


En Java, nul besoin de grer la mmoire comme en C: la JVM gre elle-mme les ressources de faon (presque) optimale. Un objet occupe une zone mmoire. Lorsque l'objet n'a plus aucune rfrence, il est supprim de la mmoire par le Garbage Collector (GC). Voyons les diffrents tats que peut prendre un objet: 1- Integer i; //on cre une rfrence sur un objet de type Integer, l'objet n'existe pas encore. 2- i=new Integer(); //l'objet est cr en mmoire. 3- Si au cours de l'excution, l'objet n'est plus rfrenc ( par exemple, la rfrence i pointe vers un autre objet ), l'objet passe en attente de destruction. 4- L'objet est dtruit par le garbage collector lorsqu'il dispose d'une plage de temps CPU, la mmoire est alors libre.

TD 2 - Introduction pratique au langage Java


Exercice 1 - Premiers programmes en Java

crire un programme affichant "Hello World" sachant que l'instruction permettant d'afficher un chane l'cran est: System.out.println("[chane]"); crire un programme affichant 10 fois "Hello World" crire un programme affichant le premier argument donn en lanant la classe ( par exemple java Test A ou java Test B ). crire un programme qui affiche tous les nombres premiers infrieurs 100000 .

Exercice 2 - Main utilisant d'autres classes

crire une classe Voiture possdant les proprits iAge et iKilometrage ainsi que la mthode getKilometrage() qui renvoie le kilomtrage courant du vhicule. La classe Voiture aura deux constructeurs: le premier prenant uniquement l'ge et l'autre l'ge et le kilomtrage. Ces deux constructeurs n'auront pas de code redondant. Par dfaut, le kilomtrage sera de zro km. crire une classe Test ayant une mthode main et instanciant deux voitures. Affichez l'ge et le kilomtrage de ces voitures. Dfinir dans la classe Voiture un attribut primitif iNbRoues statique qui donne le nombre de roues. Dans Test, fixer la valeur de iNbRoues d'une voiture 4 et afficher la valeur iNbRoues des autres instances de Voiture. Conclusion?

CHAPITRE 3- Les tableaux, vecteurs et dictionnaires


Les listes comme les tableaux, vecteurs ou autres objets plus sophistiqus sont trs couramment utilises et doivent tre parfaitement matrises pour tirer partie du langage.

3.1- Les Tableaux


Un tableau est un objet ayant un nombre d'lments fixe et pouvant contenir des objets ou des types primitifs. A la diffrence de certains langages, un tableau est lui-mme un objet. Un tableau peut contenir des primitifs tous du mme type : {1,2,3} ou {'a','b','c'}. Un tableau peut galement contenir des objets de mmes types : {new Integer(1),new Vehicule(),new Voiture()} est un tableau d'Object et { new Integer(1),new Integer(2),new Integer(3)} est un tableau d'Integer.

Syntaxe de dclaration
Tableau de 5 entiers primitifs : int[] monTableau=new int[5]; ou int monTableau[]=new int[5]; La premire notation est de loin la meilleure car de cette faon, nous visualisons bien que monTableau est de type tableau d'entiers primitifs. Dans la seconde notation, les crochets sont mis la fin de la rfrence pour assurer une continuit avec les normes du C mais il faut absolument viter de l'utiliser.

Un tableau est un objet


Un tableau Java peut contenir des primitifs ( tel un int ) ou des objets ( tel l'objet Voiture ). Attention! Il faut bien comprendre qu'un tableau en Java est un objet part entire. Ainsi, un tableau possde la proprit length: monTableau.length vaut 5. Autre consquence: Object[] monTableau; ne rserve pas d'espace mmoire mais spcifie simplement que la variable monTableau est un tableau. Faire monTableau[0]=1; lvera une exception.

Dimensions d'un tableau


La notation d'accs au contenu d'un tableau est celle du C: monTableau[2]=3; Les tableaux peuvent tre de n'importe quelle dimension, par exemple, il est possible de crer le tableau suivant: int[][][] monTableau=new int[3][4][5]; Il est possible d'initialiser un tableau dj rempli par la syntaxe: int[] iMonTableau={1,2,3}; int[][] iMonTableau2={{1,2},{2,3},{4,5}}; Object[] oMonTableau={new Object(),new Object()};

Dans cette syntaxe, nous ne prcisons pas le nombre d'lments et nous n'instancions pas le tableau car le compilateur va le faire notre place. C'est simplement un confort du langage qui vite d'avoir faire: int iMonTableau[]=new int[5]; iMonTableau[0]=1; iMonTableau[1]=2; iMonTableau[2]=3; ... Mais il y a bien instanciation du tableau: un tableau est un objet.

Copie d'un tableau un autre


Une faon rapide de copier le contenu d'un tableau un autre est d'utiliser la mthode statique arraycopy de la classe System: System.arraycopy(Object,int,Object,int,int) System.arraycopy([Tableau d'origine],[index de la premire donne copier],[tableau de destination],[index de la premire donne copie],[nombre d'lments copier]);

3.2- Les vecteurs


Lorsque l'on cre un tableau, il faut spcifier sa taille qui est fixe. Java fourni un objet trs utilis: le vecteur ( classe java.util.Vector ). L'utilisation d'un vecteur plutt qu'un tableau est souvent avantageux lorsque la taille finale du tableau n'est pas connue l'avance. Un vecteur est un tableau dynamique. La premire cellule d'un vecteur est l'index zro.

Principales mthodes de la classe Vector


Action Syntaxe

Cration d'un vecteur vMonVecteur Vector vMonVecteur = new Vector();

Insertion d'un objet o

addElement(Object o);

Suppression d'un lment la position i Obtention du i me lment

removeElementAt(int i); Object elementAt(int i);

Obtention du no de la ligne contenant l'objet o

int indexOf(Object o);

Nombre d'lments dans le vecteur int size();

Parcours d'un vecteur: Nous utilisons un objet Enumeration. Cf. 3.4- Les Enumrations

Enumeration eEnum=vMonVecteur.elements(); while(eEnum.hasMoreElements(){ System.out.println(eEnum.nextElement()); }

Remplacement de l'objet l'index i setElementAt(Object o, int i) par l'objet o Remarque importante: La mthode getElementAt(int) renvoie un objet qu'il faut caster. Exemple: Integer i1=(Integer)vMonVecteur.elementAt(0);

3.3- Les dictionnaires ( Hashtable )


Une autre proprit intressante des listes est la possibilit d'accder aux informations par cl comme dans les dictionnaires. Ce type de liste est une sorte de tableau deux colonnes et n lignes dont la premire colonne est la cl de recherche la seconde l'information associe. Remarquons que les dictionnaires - tout comme les vecteurs - sont de taille dynamique. Un dictionnaire est une collection qui associe un objet une cl.

Principales mthodes de la classe Hashtable


Action Cration du dictionnaire hMonDico Insertion d'une entre avec o1 comme cl et o2 comme valeur Syntaxe Hashtable hMonDico=new Hashtable();

put(Object o1,Object o2) h.put("Objet","Un objet est une instance de classe"); Un dictionnaire peut associer tout type d'objet tout autre type d'objet

Obtention de la valeur associe Object get(Object o) la cl o System.out.println(hMonDico.get("Objet"));

affichera "Un objet est une instance de classe" Taille du dictionnaire int size() hMonDico.size(); Effacement de l'entre correspondant la cl o remove(Object o) hMonDico.remove("Objet");

Remarque: S'il on insre deux lments dans la hashtable avec la mme cl, le second lment crase simplement le premier.

3.4- Les numrations


Les numrations sont des interfaces du package java.util qui permettent de parcourir rapidement les listes comme les vecteurs ou les dictionnaires. Elles sont plus rapides l'excution et plus pratique que les mthodes elementAt(int) de Vector par exemple. Pour obtenir l'numration sur un vecteur ou un dictionnaire ( entre autres ), il suffit d'appeler la mthode elements() de cette liste. La classe Enumeration ne possde que deux mthodes:

Object nextElement() qui renvoie l'objet suivant dans l'numration. ( Attention aux problmes de cast ! ). boolean hasMoreElements() qui renvoie true si la fin de l'numration est atteinte.

Aprs le premier appel la mthode nextElement, l'numration pointe sur le premier lment de la liste. Pour repositionner l'numration au premier lment, il faut refaire un appel la mthode elements() de la liste qui renvoie une nouvelle numration initialise. Attention aux cas imprvus ou indtermins: si vous ajoutez ou effacez des lments dans les listes, il faut rcuprer une nouvelle numration de la liste mise jour.

TD3 - Les listes et tableaux


Exercice 1 - Utilisation des tableaux
1- Dans un programme de test, faire : int[] iMonTableau; iMonTableau[0]=0; Que se passe-t-il? Pourquoi? 2- Dclarer et instancier un tableau d'entier primitifs 3 dimensions de 2, 3 et 4 lments suivant chaque dimension. Combien ce tableau contient d'lments ? Ce tableau est-t-il un objet? contient-t-il des objets ? 3- Dclarer un tableau d'objets Integer deux dimensions et l'initialiser par la "syntaxe par accolades". Pourquoi n'a-t-on pas instanci le tableau ? 4- Dclarer et instancier un tableau de deux objets Integer. Instancier le premier objet Integer puis l'afficher. Afficher le second entier. Que se passe-t-il ? pourquoi ? 5- Crer un tableau de flottants primitifs deux dimensions avec pour la premire ligne 3 lments, la seconde 4 lments et la troisime 5 lments. 6- Instancier un tableau quelconque et l'afficher ( la tableau lui-mme, et non ses lments ). Que voyez vous ? Que cela signifie-t-il ?

Exercice 2 - Utilisation des vecteurs


1- Crer un vecteur contenant des objets de types Object,Integer,Float puis affichez sa taille. 2- Ajoutez un objet de votre choix en plus de ceux dj existants. 3- Supprimez l'lment l'index 3 dans ce vecteur ( le 4me lment ). 4- Affichez le type de tous les objets de ce vecteur en utilisant les numrations. 5- Modifiez le programme pour que lorsqu'il trouve un objet de type Integer, il le supprime et qu'il ajoute un objet de type Float. 6- Vrification finale : Affichez de nouveau les types des lments du vecteur pour vrifier le travail de la question 5.

Exercice 3 - Utilisation des dictionnaires


1- Crer une liste tlphonique en utilisant un dictionnaire contenant quelques lignes puis afficher sa taille.

2- Donnez le no de tlphone d'une des personnes stockes dans le dictionnaire 3- Supprimez l'entre concernant une personne donne.

CHAPITRE 4- Les chanes de caractres


Nous aborderons dans ce chapitre les objets String, StringBuffer et StringTokenizer.

4.1- Les objets String


Instanciation d'un objet String
Les chanes de caractres sont des instances de la classe java.lang.String. Elles peuvent tre construites : 1- A partir d'un tableau de caractres: char[] cListeDeChar={'t','o','t','o'}; String sMaChaine=new String(cListeDeChar); 2- Directement Par une chane: String sMaChaine="toto"; La ligne de la mthode 2 est quivalente aux deux lignes de la mthode 1. Il faut saisir correctement la signification de la ligne String sMaChaine="toto";. Le compilateur cre lui-mme un objet String valant "toto" et en renvoie une rfrence. C'est la raison pour laquelle nous n'avons pas eu instancier explicitement sMaChaine. Ce mode d'instanciation est particulier aux chanes de caractres et a t mis en place pour d'videntes raisons de simplicit.

Les String sont constants


Il n'existe pas de mthode permettant de modifier directement un String. Par exemple, un hypothtique "sMaChaine[3]='o' " n'existe pas. En revanche, il est possible de stocker le rsultat d'une modification dans un autre String puis de positionner la rfrence du premier String sur le nouvel objet : sMaChaine=sMaChaine.trim(); //supprime les blancs en dbut et fin de String sMaChaine.trim() renvoie un objet de type String et nous dplaons la rfrence sur ce nouvel objet.

Longueur d'une chane

Pour obtenir la longueur d'une chane de caractre, il est possible d'utiliser la mthode length() qui renvoie un entier reprsentant le nombre de caractres de la chane. Attention! ne pas confondre la mthode String.length() avec la proprit length d'un tableau.

Principales mthodes de la classe String


Mthode char charAt(int index) boolean equals(String sOtherString) int indexOf(String sMaChaine) String substring(int iDepart,int iFin) Description Renvoie le caractre la position index Renvoie vrai si le String sur lequel est appliqu la mthode equals est gal sOtherString Renvoie l'index de la premire occurrence de la chane sMaChaine. Renvoie un String contenant la chane de dpart de l'index iDebut l'index iFin-1. Plus simplement, iFin-iDebut vaut la longueur de la souschaine. Renvoie un tableau de caractres Renvoie la version tout en majuscules de cette chane Renvoie la version tout en minuscules de cette chane Renvoie un String valant le String de dpart sans les blancs et caractres spciaux en dbut et fin de chane. Renvoie un String correspondant la valeur du primitif donn en argument. Par exemple, String.valueOf(2) renverra "2" Remarque: l'opration inverse peut tre ralise par: int i=Integer.parseInt("2");

char[] toCharArray() String toUpperCase() String toLowerCase() String trim() static String valueOf( int / boolean / double / float / long )

galit de deux chanes


ATTENTION! pour comparer deux chanes, ne pas faire: String sMaChaine1="toto"; String sMaChaine2="toto"; if (sMaChaine1 == sMaChaine2){ Car ce test renverra toujours false. En effet, dans ce cas, ce sont les deux rfrences qui sont compares, c'est--dire les valeurs des zones mmoire de ces deux objets. Plutt faire: String sMaChaine1="toto"; String sMaChaine2="toto"; if (sMaChaine1.equals(sMaChaine2)){

car nous utilisons la mthode equals de String qui va faire une comparaison caractres par caractres des deux chanes.

Concatnation
L'oprateur '+' permet de concatner deux chanes ou une chane et un primitif: String s1="Hello"; String s2="World"; String s=s1+" "+s2; s vaut "Hello World" String s1="x="; int i=2; String s=s1+i; s vaut "x=2" Ainsi, l'oprateur '+' connat un polymorphisme paramtrique et ne se comporte pas de la mme faon en fonction du type de ses deux arguments. Ainsi, Le '+' des exemples prcdents est le '+' de la concatnation alors que le '+' prenant en argument deux primitifs ( dans 1+2 par exemple ) est le '+' arithmtique.

Mthode toString()
Toutes les classes depuis Object possdent une mthode toString() qui renvoie un String. String toString() Cette mthode sert renvoyer une chane de caractre donnant des informations sur l'objet courant sous la forme d'une chane de caractres. Par exemple, la mthode toString() de la classe Object renvoie simplement le hashcode de l'objet. Il est ensuite possible de surcharger cette mthode pour donner davantage d'informations. La mthode println() de OutputStream qui est trs utilise excute toujours la mthode toString() et affiche la chane renvoye. donc faire: Integer i=new Integer(2); System.out.println(i); est quivalent : System.out.println(i.toString());

4.2- Les objets StringBuffer


Le StringBuffer est une chane de caractre prsentant certains avantages de manipulations et de performances. Un StringBuffer est une chane de caractre modifiable. La classe StringBuffer possde en effet des mthodes permettant d'effectuer des modifications sur l'objet lui-mme. Par exemple, ce qui tait impossible pour le String ( modifier un caractre de la chane ) est possible pour le StringBuffer grce sa mthode setCharAt.

Principales mthodes de la classe StringBuffer


Mthode char charAt(int index) Description Renvoie le caractre cette position

void delete(int iDebut,int iFin) Supprime les caractres de la chane de iDebut iFin-1 StringBuffer deleteCharAt(int iIndex) Supprime le caractre cette position

void setCharAt(int iIndex,char Fixe le caractre de la chaine l'index iIndex au cChar) char donn en argument. boolean equals(String sOtherString) StringBuffer insert(int iIndex, String str) Renvoie vrai si le String sur lequel est appliqu la mthode equals est gal sOtherString Insre la chane str l'index iIndex.

StringBuffer replace(int iDebut, int iFin, String str)

Remplace la chane par la chaine str de l'index iDebut l'index iFin-1.

String substring(int iDepart,int Ne conserve de la chane que les caractres de iFin) l'index iDebut l'index iFin-1. Plus simplement, iFin-iDebut vaut la longueur de la sous-chaine. String toString() Renvoie le String correspondant cette chane.

4.3- La classe StringTokenizer


Cette classe du package java.util sert couper une chane en sous-chanes de faon rapide. Le constructeur le plus courant est: StringTokenizer(String sInput,String sSeparator){} N'importe quelle chane peut servir de sparateur ( un ou des espaces, des slashs, tirets...). La mthode nextToken() renvoie un String contenant la sous-chane suivante. La mthode hasMoreTokens() renvoie true s'il reste des chanes. Exemple:

String sMonText="toto titi tata"; StringTokenizer st1=new StringTokenizer(sMonText," "); String s1=st1.nextToken(); //s1 vaut "toto" String s2=st1.nextToken(); //s2 vaut "titi" String s3=st1.nextToken(); //s3 vaut "tata"

TD 4 - Les chanes de caractres


Exercice 1: Saisie d'une chane
Programmer une application Java qui demande l'utilisateur de saisir son nom. Lors de la validation, afficher "Bonjour <nom de l'utilisateur>". Une mthode spcifique de lecture de caractres devra tre implment en utilisant la fonction System.in.read(); Exemple : Entrez votre Nom : Toto Bonjour Toto

Exercice 2: Affichage d'une chane


Demandez la saisie d'un message puis afficher ce dernier de faon indente. Exemple: Chane : toto t to tot toto

Exercice 3 : Les StringBuffer


1- Instanciez un StringBuffer partir d'une chane valant "toto" 2- Modifiez cette chane en remplaant les 'o' par des 'i'. 3- Affichez la nouvelle chane sous la forme : "Nouvelle chane =" et la nouvelle chane.

Exercice 4 : Les StringTokenizer


1- Utilisez la classe StringTokenizer partir d'une chane valant "#1=toto#2=titi#3=tata" avec les sparateurs appropris pour reconstituer et afficher les valeur de toto, titi et tata sous la forme: 1:toto 2:titi 3:tata en utilisant les mthodes de la classe StringTokenizer.

CHAPITRE 5- Les exceptions


L'un des lments donnant sa puissance et sa robustesse au langage Java est sa gestion avance des exceptions. Une application grant correctement ses exceptions doit alors pouvoir ragir toutes les situations y compris les cas imprvus par le dveloppeur. Dans ce sens, une erreur d'excution peut toujours tre rattrape et le programme pourra continuer sans sortie brusque ou 'core dump'. Dans la pratique, on utilise la gestion des exceptions dans deux cas :

lorsque l'on s'attend une erreur prcise ( par exemple, l'absence de fichier lors d'une lecture d'un disque ) Pour protger l'intgrit du programme: une erreur imprvue peut se produire et une partie du programme peut chouer. Dans ce cas, on peut dcider de l'action effectuer pour la suite du programme : sortie ou nouvel essai...

5.1- Lever une exception


Dfinitions

Une exception est un vnement particulier apparaissant au cours de l'excution ( la plupart du temps une erreur ) . Une exception est un objet drivant de la classe java.lang.Exception.

Il existe toutes sortes d'exceptions dont certaines font partie de l'API Java standard comme les ArithmeticException . D'autres comme une hypothtique 'VoitureSansPlaqueException' sont dveloppes spcifiquement pour une application donne. Exemple d'exception: class VoitureSansPlaqueException extends Exception{ public String toString(){

return "Cette voiture ne possde pas de plaque d'immatriculation"; } } Nous verrons plus loin quoi sert la mthode toString(). Il est important de noter que dans la majorit des cas, vous n'aurez pas implmenter de nouvelles exceptions mais simplement utiliser celles dj existantes. Les exceptions personnelles servent crer des types d'erreur spcifiques qui permettront une granulosit plus fine la gestion des vnements. Dans le cas ou on ne cherche pas dterminer la cause prcise de l'erreur mais simplement dtecter un problme quelconque pour afficher un message gnrique, nous pouvons directement utiliser les objets de type Exception . Les exceptions sont dites leves ou envoyes par le mot-cl throw. Le mot cl throw sert initier le trajet de l'exception. Au rugby, ce serait le premier lanc du ballon.

Exemple:
La mthode getPlaque prend en argument un objet Voiture et renvoie un objet PlaqueImmatriculation. Si la voiture ne possde pas de plaque, le programme considre qu'une erreur applicative est commise et lve alors une VoitureSansPlaqueException: public PlaqueImmatriculation getPlaque(Voiture v) throws VoitureSansPlaqueException { if (v.plaque==null){ throw new VoitureSansPlaqueException(); } else{ return v.plaque; } } Le mot-cl new instancie l'exception et le mot-cl throw lance l'exception qui va alors tre traite ou propage.

Remarque : Attention ne pas confondre le mot cl throw qui sert lever une exception avec le mot cl throws qui sert propager l'exception.

5.2- Capturer ou propager


Lorsqu'une exception est leve,il y a deux possibilits pour le programme:

Il propage l'exception (mot-cl throws ) ; au rugby, le joueur passe le ballon un quipier. Il capture l'exception et la traite (mot-cls try/catch ) ; au rugby, le joueur marque l'essai.

Dtaillons ces deux processus:

Propagation de l'exception
Considrons l'exemple de la mthode getPlaque : public PlaqueImmatriculation getPlaque(Voiture v) throws VoitureSansPlaqueException { if (v.plaque==null){ throw new VoitureSansPlaqueException(); } else{ return v.plaque; } } Nous voyons que dans certains cas, cette mthode peut lever une exception. Cependant, elle ne la traite pas. Elle n'affiche pas de message d'erreur et n'effectue aucun traitement particulier. Elle se contente de propager l'exception la mthode appelante par le mot-cl throws. Dans la dclaration de la mthode, " throws VoitureSansPlaqueException" signifie que la mthode est susceptible de propager l'exception VoitureSansPlaqueException. Dans ce cas, ce sera la mthode appelante de traiter l'exception ou alors de la propager son tour. La propagation d'une exception de mthodes en mthodes peut tre affiches par la mthode printStackTrace() de l'exception.

Traitement de l'exception
L'exception sera propage de mthodes en mthodes tant qu'elle ne sera pas traite. Pour traiter une exception, il suffit d'utiliser les mots-cls try et catch: try{ getPlaque(v1); afficherPlaque(); } catch(VoitureSansPlaqueException vspe){ vspe.printStackTrace(); afficherMessageErreur(); } Le mot-cl try prcise que les instructions contenues dans ces accolades peuvent lever des exceptions dont le type sera prcis en argument du catch associ. Si la voiture v1 ne possde pas de fournisseur, la mthode getPlaque() - comme nous l'avons vu- lvera une exception de type VoitureSansPlaqueException et la propagera. A la ligne getPlaque(v1), l'exception est alors capture. La ligne afficherPlaque() n'est pas excute et le programme passe alors aux instructions du catch correspondant.

Rsumons ce mcanisme
Lorsqu'une exception est leve, le programme arrte son excution et ne reprendra que dans un catch() adquat de l'exception. La mthode qui a lev l'exception va alors la traiter immdiatement ou va la propager la mthode appelante qui son tour va traiter l'exception ou la propager. La seule faon de stopper ce parcours sera de traiter l'exception ( catch ). Il faut voir ce phnomne comme des passes au rugby: l'exception est le ballon et il est transmis de joueurs en joueurs jusqu' celui qui va 'traiter l'exception' et marquer l'essai.

5.3- Complments sur les exceptions


Maintenant que nous matrisons les mcanismes fondamentaux des exceptions, nous allons dtailler certaines mthodes de programmation.

Les mthode toString() et printStackTrace() de la classe Exception


Cette mthode renvoie la chane de caractre dcrivant l'erreur. Il est souvent judicieux de surcharger cette mthode l'implmentation d'une classe fille de Exception. La classe Exception quant elle ne contient pas de message par dfaut, il peut tre utile de construire un objet Exception avec un String dcrivant le problme. Exemple: public void test() throws Exception{ if ( - pbm de division par zro -){ throw new Exception("Division par Zro"); } if (- pbm de nombre trop petit -){ throw new Exception("Nombre trop petit"); } } L'instruction try{ test(); } catch(Exception e){ System.out.println(e); } Affichera "Division par zro" ou "Nombre trop petit" selon le cas. Mieux encore: L'instruction e.printStackTrace() ou 'e' est l'exception affichera toujours les messages d'erreurs mais donnera le parcours complet de l'exception du moment o elle a t leve jusqu' celui o elle a t capture. Cette mthode de la classe Exception est trs utile au debugage.

Capture slective

Il est possible de raliser des filtres d'exceptions dans des cas complexes. Par exemple, admettons que la mthode getPlaque vue prcdemment puisse lever une VoitureSansPlaqueException mais galement tout autre type d'exception. Dans ce cas, le code sera le suivant: try{ getPlaque(v1); } catch( VoitureSansPlaqueException vspe){ vspe.printStackTrace(); } catch( Exception e){ e.printStackTrace(); } Nous effectuons ainsi une capture slective avec granulosit dcroissante. Bien entendu, aucune exception ne pourra passer outre un catch(Exception) puisque toutes les exceptions drivent de la classe Exception. Si nous voulons raliser une action qu'il y ait une exception ou non, il faut utiliser le mot-cl finally try{ getPlaque(v1); } catch( VoitureSansPlaqueException vspe){ vspe.printStackTrace(); } catch( Exception e){ e.printStackTrace(); } finally{ System.out.println("Traitement termin"); //ce code est excut qu'il y ait exception ou non }

Remarque sur les dclarations de variables


Comme pour les boucles itratives, les variables locales dfinies dans un try ou un catch ne sont connues que dans ces zones.

TD5 - Les exceptions


Exercice 1- Division par zro

1- crire un programme qui effectue une division par zro et ne contient aucun traitement d'exception. Que se passe-t-il? Pourquoi? Quel est le type de l'exception gnre. 2- Cette fois, r-crire le programme pour capturer l'exception. 3- Le modifier pour afficher un message d'erreur explicite. 4- Cette fois, le programme corrige lui mme et remplace la division par zro par une division par 1. Remarquons ainsi que lever une exception ne signifie forcement l'affichage d'un message d'erreur suivi de l'arrt du programme mais qu'il peut y avoir poursuite normale de l'excution.

Exercice 2- L'ge du capitaine


1- crire une mthode getAgeCap() qui demande l'ge du capitaine. Cet ge doit tre compris entre 18 et 65 ans et doit tre un entier sous peine de lever une AgeCapException. Vous implementerez cette exception pour qu'elle renvoie une description explicite du type "[proposition] ans n'est pas un ge valide". Le programme devra galement tre en mesure de capturer tout type d'exception autre que AgeCapException. 2- Dans un premier temps, la mthode getAgeCap() propagera l'exception la mthode appelante qui la traitera. 3- Modifier le programme pour que ce soit la mthode getAgeCap() qui traite l'exception. 4- Modifier encore le programme pour que getAgeCap() traite l'exception mais lve une seconde exception de type Exception pour signaler la mthode appelante qu'une erreur s'est produite et que cette dernire comptabilise le nombre d'essais infructueux et l'affiche. Le programme demandera l'ge du capitaine en boucle infinie.

Exercice 3- Saisie d'un mot de passe


Dans les failles de scurit rseau, on trouve trs souvent les problmes de dpassement. Par exemple, sur certaines anciennes versions de telnet, un login ou un mot de passe de plus d'un mega-octet faisait "planter" le programme et on obtenait alors un accs root au systme. Ce programme va grer ce type de problme en sparant les exceptions pour une meilleure gestion. 1- crire un programme stand-alone qui demande en boucle un nom d'utilisateur (login) et un mot de passe (pwd) jusqu' recevoir un login/pwd correct. Le seul utilisateur rfrenc sera scott / tiger ( mettre en constante dans la classe principale ). 2- Implmenter les exceptions suivantes: * WrongLoginException qui se produit lorsque l'utilisateur saisit un login inexistant * WrongPwdException lorsque le mot de passe est erron

* WrongInputLength lorsque le login o le pwd saisi dpasse 10 caractres. 3- Implmenter de faon utiliser ces exceptions de faon judicieuse et avec la granulosit la plus fine. Remarque: La lecture de l'entre standard peut lever une java.io.IOException...

CHAPITRE 6 - L'hritage
Ici seront prsents les notions d'hritage, de classe abstraite, d'interface et l'ensemble des phnomnes touchant l'hritage qu'il est ncessaire de matriser. A ce point, il est vivement conseill de se rafrachir la mmoire sur les concepts d'hritage du cours 1. Nous supposerons ces notions acquises.

6.1- L'hritage simple


Dfinition
L'hritage permet de spcialiser une classe qui possdera non seulement les proprits et mthodes de son unique mre mais d'autres mthodes spcifiques ou redfinies. Dans l'objet fille, on trouve:

Des mthodes ou proprits qui surchargent, c'est--dire redfinissent celles de la classe mre. Les proprits et mthodes de la classe mre qui n'ont pas t surcharges. De nouvelles mthodes ou proprits.

Pour spcifier qu'une classe drive d'une autre classe, on utilise l'oprateur extends lors de la dclaration de la classe: class Voiture extends Vehicule{ } La classe mre commune toutes les autres classes est la classe Object. Tous les objets drivent implicitement d'Object et les dclarations suivantes sont identiques: class Voiture{ }

class Voiture extends Object{ }

Types et affectation
Si mere est de type 'Mere' et fille de type 'Fille ' et que la classe Fille drive de la classe Mere, Fille fille=new Fille(); Mere mere=new Mere(); faire mere=fille; signifie que la rfrence mere est maintenant une rfrence sur objet de type Fille et plus sur Mere. Cette opration est accepte car l'objet fille tait de type Mere par hritage. mere instanceof Fille; renverra vrai. En consquence, mere peut maintenant appeler des mthodes de la classe Fille. A contrario, il est impossible de faire : fille=mere; Ceci renverra une erreur de compilation car un type Mere n'est pas un type Fille : un objet de type Fille contient des mthodes et des attributs qu'il n'y a pas dans la classe Mere.

Classes anonymes
Depuis le JDK 1.1, il est possible d'instancier un objet en effectuant une surcharge des mthode de sa classe. Cette modification n'est valable que pour l'instance surcharge. Exemple: String s=new String(){ public String toString(){ return "TEST"; } }; Cela signifie que la mthode toString() de cette chane de caractres renverra toujours"TEST". La surcharge d'instance peut tre utile pour viter de crer une nouvelle classe drivant de l'objet surcharger. Le compilateur gnrera alors une classe de nom <nom de la classe courante >~<no de surcharge>.class comme "Test~1.class". L'objet s de notre exemple est alors de type Test~1.

Transtypage implicite

Si une classe Fille drive d'une classe Mere, une instance de la classe Fille sera de type Fille bien entendu mais sera galement de type Mere par hritage.

Complments sur le transtypage


Le transtypage d'un objet d'un type vers un autre type permet de modifier la faon dont on "voit" l'objet mais ne le modifie pas. Pour transtyper un objet vers un autre type, la notation est la mme que pour le cast primitif: (MaClasseDestination)monObjet Il est possible de transtyper un objet vers un type ascendant ( le type de sa classe mre ou la mre de sa mre etc...) mme si ce transtypage est fait de faon implicite. En effet, un objet Voiture par exemple est implicitement un Vehicule - nul besoin de le transtyper en Vehicule pour accder ses proprits et mthodes. Dans certains cas cependant, il peut se trouver que les mthodes ou les proprits portent le mme nom dans la classe et dans ses classes ascendantes. Il existe alors des rgles prcises. Observons l'exemple suivant: class Vehicule{ int iAge=10; int getAge(){ return iAge; } } class Voiture extends Vehicule{ int iAge=20; int getAge(){ return iAge; } } Instancions un objet de type Voiture: Voiture v1=new Voiture();

Il est possible de transtyper v1 en Vehicule pour accder la proprit iAge de la classe Vehicule et non celle de Voiture: ((Vehicule)v1).iAge pointe vers le iAge de Voiture.

A contrario, il n'est pas possible d'accder la mthode getAge() de la classe Vehicule partir de v1: ((Vehicule)v1).getAge() pointe vers la mthode getAge() de la classe Voiture et non de la classe Vehicule malgr le cast. Ainsi, le transtypage permet d'accder aux proprits de la classe vers laquelle nous transtypons l'objet mais les mthodes utilises seront toujours les plus spcialises, quoiqu'il arrive.

Il est galement possible de transtyper un objet d'un type vers un type plus spcialis mais seulement dans certaines conditions: Vehicule monVehicule=new Vehicule(); Vehicule monVehicule2=(Voiture)monVehicule; renverra une exception mais il est possible de faire: Voiture v1=new Voiture(); Vehicule monVehicule=(Vehicule)v1; //v1 est vu comme un vhicule Voiture v2=(Voiture)monVehicule; //on cast vers un type plus spcialis mais cela fonctionne car monVehicule tait de type Voiture. v1 et v2 rfrenient le mme objet

6.2- Notion de classe abstraite


Dans certains cas, nous pouvons dsirer implmenter deux objets proches possdant une partie de mthodes et de proprits en commun comme Voiture et Moto. Certaines de ces mthodes comme rouler() sont totalement identiques d'un objet l'autre alors que certaines autres diffrent comme la mthode seGarer() qui est diffrente pour une Voiture et pour une Moto. Pour ce faire, l'OO introduit la notion de classe abstraite.

Dfinition
Une classe abstraite est une classe non-instanciable dont une partie des mthodes sont abstraites et restent implmenter. Remarques:

Une classe abstraite ne peut tre instancie car n'est pas "complte". Elle peut avoir de zro (comme une classe normale) jusqu' l'intgralit ( comme une interface) de mthodes abstraites.

Notation d'une classe abstraite


abstract class MaClasse{ } et pour une mthode abstract void maMethode(); // jamais d'implmentation Une mthode abstraite est une simple dclaration sans implmentation. Elle est simplement la marque que cette mthode devra tre implmente par la classe drive. Lorsqu'une classe drive d'une classe abstraite, elle doit alors implmenter toutes les mthodes abstraites de

celle-ci ou tre elle-mme abstraite. Cela permet lors d'un projet d'viter d'"oublier" d'implmenter des mthodes communes.

Exemple
Dans la classe Vhicule, nous dclarons la mthode seGarer() en mthode abstraite. Alors, si Voiture drive de Vhicule , la classe Voiture doit implmenter la mthode seGarer() pour dcrire sa faon de se garer. La classe Moto doit implmenter la mthode seGarer() pour dcrire la sienne.

6.3- Notion d'hritage multiple via interface


Dfinition Certains langages orients objet comme le C++ disposent de l'hritage multiple: une classe peut driver de plusieurs classes. Ce concept peut amener des incohrences dans certains cas. D'autres langages comme Java ou SmallTalk n'acceptent que l'hritage simple. Cependant, il peut tre intressant dans certains cas d'hriter de mthodes ou de proprits communes deux classes mres ou leur ascendance. Pour contourner ce problme, nous disposons des interfaces. Une interface est une sorte de classe de dclaration dans laquelle les mthodes sont seulement dclares et les constantes fixes. Cependant, dans une interface, il n'y a aucune implmentation. Toute classe ne peut driver que d'une classe mre mais implmenter une ou plusieurs interfaces. Si elle implmente une interface, elle doit implmenter toutes les mthodes de l'interface ou alors tre abstraite. Composition d'une interface Une interface peut contenir:

des dclarations de mthodes de la forme: void faire(int i); Ces mthodes sont implicitement abstraites et publiques. des constantes de la forme: static final int i=10;

Cration d'une interface interface PropritPrive{ boolean maMethode(int i); int autreMethode(float f); static final int i=10; }

Implmentation d'une interface

class Voiture implements PropritPrive{ boolean maMethode(int i){ ..... } int autreMethode(float f){ ... } } L'hritage chez les interfaces Une interface peut driver d'une autre interface et mme de plusieurs. Dans ce cas, la premire classe implmenter une interface devra galement implmenter les mthodes des mres de l'interface.

Consquences sur le type de l'objet Du point de vue du type, un objet est la fois un objet du type de sa mre mais galement des types de ses interfaces. Si l'interface et la classe mre possdent des mthodes ou proprits de mme nom, il faut transtyper l'objet pour prciser quel type nous allons utiliser; par exemple si on utilise une instance de Voiture en tant que Vehicule ou en tant que PropritPrive .

TD 6 - L'hritage Exercice 1 - Classes abtraites


La classe Vector ( package java.util ) est couramment utilise. Nous allons ici l'utiliser de deux faons pour crer une FIFO (First In / First Out) et une LIFO (Last In / First Out).

Crer la classe abstraite Stack qui contient les classes abstraites: Object get(); void put(Object);

Implmenter cette classe de deux faons: par une classe FIFOStack puis par une classe LIFOStack selon le comportement de pile dsir. ( Utiliser les mthodes addElement() et removeElement() de la classe Vector ).

Exercice 2 - Interfaces

Transformez la classe Stack pour qu'elle devienne une interface qui est implmente par les classes FIFOStack et LIFOStack. De quels type(s) sont les instances de FIFOStack et LIFOStack ?

CHAPITRE 7 - Les spcificateurs et les packages


Les spcificateurs sont les mots cls associs aux classes, variables et mthodes pour leur octroyer certaines proprits. Ils sont utiliss pour limiter les accs ou pour attribuer des possibilits ou restrictions spcifiques: statique, constant, non-modifiable, prive... pour une variable ou une mthode, non drivable, abstraite... pour une classe. Ce chapitre abordera ensuite les packages qui permettent de constituer les arborescences des applications.

7.1- Spcificateurs et gestion des classes Dfinition


Les spcificateurs sont des mots cls qui dfinissent tour tour les droits d'accs d'une variable, d'une mthode ou leur caractre statique. Ils se placent en tte de code. C'est donc le premier lment qui est crit lors des dfinitions des variables ou des mthodes: Spcificateur(s) Type variable; Spcificateur(s) Type_Renvoy mthode ( arguments ); Exemple : static final String sTest="toto"; private Integer;

Tableau rcapitulatif des spcificateurs de variable, de mthode, de classe:


Proprit public La variable est visible par n'importe quelle classe du package ou extrieure au package. Mthode La mthode est visible de n'importe quelle classe. Classe Peut tre drive par des classes de tout package

private

La variable n'est visible que La mthode n'est applicable que Pas de sens dans la classe courante. dans la classe courante. ( non visible mme des classes filles )

protected Le variable n'est visible que par la classe, ses filles et les autres classes du package ainsi que leurs filles static

La mthode n'est utilisable que Pas de sens par la classe, ses sous classes du mme package ou de packages diffrents et les autres classes du package ainsi que leurs filles

La variable est dite "variable La mthode est dite "mthode Pas de sens de classe". de classe" . Elle est dfinie une

Si la variable d'une instance de cette classe est modifie, toutes les instances de l'objet sont automatiquement modifies. Ainsi, la variable ne dpend pas de l'instance courante mais de la classe. Il est possible d'y accder directement par la classe: MaClasse mc=new MaClasse(); on peut accder par: MaClasse.maProprit (prfr) ou mc.maProprit final

seule fois pour toutes les instances. Il est possible de l'appeler directement par la classe: MaClasse mc=new MaClasse(); on peut appeler MaClasse.maMthode(); (prfr) ou mc.maMthode ();

La variable est non La mthode ne peut tre La classe ne peut pas modifiable dans l'instance surcharge dans une sous-classe avoir de classes filles. courante. Elle doit donc tre L'extends est interdit. initialise. Si on ajoute le mot cl "static", la variable est une constante de classe: static final int i=2;

abstract

Pas de sens Non applicable une variable, uniquement les mthodes.

La mthode est simplement La classe contient au dfinie dans une classe abstraite, moins une mthode doit tre implmente dans abstraite. toutes les classes filles: abstract public String maMthode();

Par dfaut
Lorsque l'on ne prcise rien:

Une variable est dite 'package' ou 'friendly' , accessible par toutes les classes du mme package ( classe courante, sous classes du mme packages, non sous classes du mme package ) mais par aucune classe d'un package diffrent mme par une classe fille. Une mthode est dite 'package' ou 'friendly', la mthode est accessible par toutes les classes du mme package ( classe courante, sous classes du mme packages, non sous classes du mme package ) mais par aucune classe d'un package diffrent mme par une classe fille. La classe est dite 'package' ou 'friendly', elle peut tre vue et drive par toute classe du mme package mais par aucune classe d'un package diffrente. En clair, une classe

fille doit se trouver dans le mme package que sa mre si celle-ci est dfinie 'package', c'est dire sans le mot cl 'public'. Remarques:

Les spcificateurs public , private et protected sont appels modificateurs d'accs. Les modificateurs de type protected et private doivent tre utilises ds que le besoin s'en fait ressentir car cela apporte une plus grande intgrit de la classe et diminue le risque de bug. En outre, cela amliore le niveau de scurit de l'application. Une mthode ne peut pas tre la fois statique et abstraite.

7.2- Les packages


Nous discuterons des arborescences logiques et physiques des classes Java.

Dfinition
Pour simplifier l'organisation des fichiers .class, il est possible de spcifier en dbut de source que les classes implmentes font partie d'un package, c'est--dire d'un ensemble de classes regroupes de faon fonctionnelle. Il suffit d'utiliser le mot cl package. Exemple dans un fichier .java: package vehicule; public class Voiture{ ... } class Moto{ ... } } Dans un autre fichier : package vehicule; public class Camion{ ... } } Il faut que les classes soient physiquement dans le mme rpertoire l'excution. De plus, les sous-packages sont possibles: package vehicule.voiture; public class VoitureEssence{ }

class VoitureDiesel{ } Physiquement les fichiers seront: <...>/vehicule/voiture/VoitureEssence.class <...>/vehicule/voiture/VoitureDiesel.class Le nom complet d'une classe est donn par les noms des packages et sous packages de la classe + le nom de la classe, par exemple java.lang.Object. Le package le plus utilis de Java est java.lang qui contient les classes de base ( dont la classe Object ) .

Norme SUN
Noms de package normaliss SUN :

Les noms de package ne prennent jamais de majuscule et tiennent dans un seul mot. Les chemins doivent respecter cette norme: <nom de la socit>.<nom du projet>.<sous-partie du projet (facultatif)>....

Par exemple le package mycompany.tutorial.exemples contiendra la classe mycompany.tutorial.exemples.Voiture.

7.3- Les classes importes


La plupart du temps, une classe utilise des objets d'une autre classe. Ds lors, il y a plusieurs cas:

Les classes utilises sont dans le mme package que la classe courante. Par exemple, une classe mycompany.tutorial.Classe1 peut utiliser la classe mycompany.tutorial.Classe2 mais pas la classe mycompany.tutorial.exemples.Classe3 qui se trouve un niveau de package plus bas. Les classes utilises sont dans le package de base du langage : java.lang qui contient par exemple les objets Object, Integer, String.... Ces objets peuvent tre utiliss immdiatement car le package est import implicitement. Les classes utilises se trouvent dans un package diffrent. Dans ce cas, il faut alors explicitement dclarer que l'on va utiliser une classe en l'important.

Le mot cl est import. En dbut de source, avant la dfinition de la classe et aprs la dclaration du package, il faut importer les classes que l'on va utiliser: package toto; import java.util.*; // importe toutes les classes du package java.util import vehicule.Moto; //importe la classe Moto seule

class titi{ ... } Ds lors, la classe accde aux mthodes et variables de ces classes importes. Remarques

Le package java.lang est toujours import implicitement. Il est donc inutile de faire un "import java.lang.*" Il n'est pas ncessaire d'importer les autres classes du package car elles le sont automatiquement. Nous pouvons utiliser le caractre joker ' * ' pour importer toutes les classes d'un package mais attention! les classes plus basses dans l'arborescence ne seront pas importes.

7.4- La gestion physique des sources et classes


Les sources
Le fait de programmer en langage Objet conduit la gestion de nombreux fichiers. En gnral, une source .java correspond une classe mais il est possible - bien que dangereux de dfinir plusieurs classes dans une mme source condition de n'en dclarer qu'une seule de type public ( les autres sont des classes dites outer ). En effet, si une classe est dclare publique, elle doit figurer dans un fichier portant son nom et un fichier ne peut avoir qu'un nom. Il est galement possible de dfinir une classe l'intrieur d'une autre classe ( inner class ). Dans ce cas,aprs compilation, nous obtiendrons plusieurs fichiers .class

Les fichiers jar


tant donn que les contraintes hardware actuelles se portent davantage sur la taille des paquets transmis via un rseau que sur la vitesse des processeurs, les packages sont souvent compresss ( la faon des .zip ) et forment des fichiers .jar qui sont dcompresss la vole l'utilisation des classes.

Utilisation des jars


Le package vehicule.* correspondant toutes les classes situes rcursivement dans ce rpertoire peut tre compress en un fichier vehicule.jar. Pour compresser un rpertoire dir recursivement en un fichier monjar.jar, lancez la commande : jar cvf monjar.jar dir Pour le dcompresser : jar xvf monjar.jar

La JVM Java "voit" un jar comme un rpertoire et non comme un fichier. Nous trouvant dans un rpertoire contenant un fichier tutorial.jar qui contient la classe mycompany.tutorial.Classe1.class , nous ferons : java mycompany.tutorial.Classe1

Le CLASSPATH
Nous avons vu que les classes Java de diffrents packages parvenaient se "connatre" entre elles grce la commande import. Cependant du point de vue de l'environnement systme, les classes et les jars se trouvent dans des emplacements physiques pouvant tre diffrents de l'emplacement courant. Dans les sources Java, les imports sont faits sur des classes se trouvant dans des emplacements "logiques"; il faut en plus indiquer au systme l'emplacement de ces classes. C'est pourquoi il faut que l'environnement au moment du lancement du programme ait la variable d'environnement CLASSPATH correctement dfinie. La variable CLASSPATH contiendra les chemins des classes importes dans les programmes. Sous UNIX, utiliser la commande : export CLASSPATH=[nom des rpertoires] : [nom des fichiers.jar] : $CLASSPATH Exemple: export CLASSPATH=.:/tmp/tutorial/exemples:/tmp/tutorial.jar:$CLASSPATH Attention, les sparateurs sont des ':' Sous Microsoft DOS, utiliser la commande set CLASSPATH=[nom des rpertoires] ; [nom des fichiers.jar] ; %CLASSPATH% Attention, les sparateurs sont des ';' Pour permettre l'import des classes d'un rpertoire, il faut donner le nom du rpertoire. Nous pourrons alors importer toutes les classes de ce rpertoire et de ses sous-rpertoires. Cependant, pour permettre l'import des classes d'un jar, il faut poser le chemin complet du jar et pas seulement le nom du rpertoire dans lequel il se trouve. Il faut veiller toujours avoir le rpertoire courant '.' dans son CLASSPATH. En lanant un programme, le CLASSPATH doit au moins contenir le jar contenant le systme Java de base ($JAVA_HOME/jre/lib/rt.jar en gnral). Il peut tre utile d'avoir galement $JAVA_HOME/jre/lib/tools.jar. Remarque: Sur la plupart des Unices ( Linux, AIX, Solaris...), le programme 'java' est un shell qui inclus lui-mme '.' et 'rt.jar' dans le CLASSPATH.

La documentation par javadoc


Lorsque le projet devient consquent, il faut recourir une documentation exhaustive et tenue jour des classes, ce qui pourrait sembler impossible sans l'outil du JDK javadoc. Cet outil

permet de gnrer une documentation complte et trs aboutie en HTML du projet complet en quelques secondes. Il sera ncessaire de normaliser certaines partie du code (commentaires) pour obtenir des commentaires additionnels dans la documentation automatique. Pour les commentaires de mthodes, il suffit de procder comme il suit: /** * Ligne 1 * Ligne 2 **/ Cf. la documentation SUN pour plus de dtails sur javadoc.

TD7 - Les spcificateurs et les packages


Exercice 1: Utilisation des spcificateurs
crire la classe mycompany.tutorial.TestSpecif possdant:

3 variables de type entier primitif :

- La variable i1 accessible par toutes les autres classes et valant 10. - La variable i2 accessible que par la classe TestSpecif elle-mme et valant 20 - La variable i3 ne pouvant tre accde que dans le package ou les classes filles et valant 30.

3 mthodes :

- La mthode m1() statique et qui ne peut tre surcharge mais qui est utilisable par toutes les classes. Cette mthode affiche i1 sur la sortie standard. - La mthode m2() qui n'est utilisable que dans TestSpecif et qui ajoute 10 i2 - La mthode m3() qui est abstraite et renvoie void. 1- Compilez puis corrigez le message que vous devez obtenir, l'expliquer. 2- crire une mthode getI2() qui renvoie la valeur de i2. Cette mthode sera publique. Comment appelle-t-on ce type de mthode? 3- crire une mthode setI2(int) qui fixe la valeur de i2. Cette mthode sera publique. Comment appelle-t-on ce type de mthode?

Exercice 2 : Bloquer l'hritage


crire la classe mycompany.tutorial.TestSpecifFille, drive de la classe TestSpecif. 1- Cette classe ne doit pas pouvoir tre drive. Comment procder? 2- Tenter de surcharger m1(). Que se passe-t-il? Pourquoi? 3- crire deux mthodes : - m4() qui ajoute 10 la variable i2 de TestSpcif. Pourquoi y a-t-il une erreur de compilation? Essayer avec i3. Est-ce mieux? pourquoi? - Implmenter m3() qui tait une mthode abstraite et qui doit afficher i3 sur la sortie standard.

Exercice 3 : Pour en finir avec les spcificateurs...


Ajouter une mthode main() dans la classe TestSpecifFille qui affiche l'cran les variables i1, i2 (avec getI2() ) et i3. Attention la mthode main() a quelques particularits. Bien rflchir aux impacts...

Exercice 4 : Utilisation des packages et des jar


Dans cet exemple, les classes seront vides et dfinies comme ci-aprs: class X{ } 1- Crer le package mycompany.tutorial.exemples1 qui contient les classes mycompany.tutorial.exemples1.Classe1 et mycompany.tutorial.exemples1.Classe2 2- Crer le package mycompany.tutorial.exemples2 qui contient la classe mycompany.tutorial.exemples2.Classe1 3- En admettant que les sources de ces classes se trouvent dans un rpertoire quelconque et que l'on lance javac *.java, o se trouvent les classes compiles? Lancer l'une de ces classes. Que se passe-t-il et pourquoi? Comment faut-il organiser les sources et les classes pour faciliter le dveloppement puis permettre l'application de fonctionner? 4- Dans la classe mycompany.tutorial.exemples1.Classe1 , implmenter une mthode main() qui affiche "Test". Comment lancez-vous cette classe?

5- Compresser l'arborescence mycompany en tutorial.jar par la commande jar. Puis consultez le contenu l'aide d'un utilitaire de compression comme gzip ou winzip, que constatez vous ? Quelle est l'avantage de cette mthode ?

CHAPITRE 8 - lments avancs du langage


Le monde Java englobe de nombreuses API dans les domaines de l'Intranet / Internet , des objets distribus, du multitche... Ce chapitre a la prtention de prsenter certaines des fonctionnalits qui donne la puissance au langage. Bien entendu, ceci n'est qu'une vue trs gnrale de ces API, chaque paragraphe de ce chapitre donnant lieu des ouvrages spcialiss. Le but est ici de donner un aperu pratique aux dbutants agrment d'exemples concrets.

8.1- Les Threads


Dfinition
Java permet de crer des applications multitches via les threads. Un thread est un sousprocessus pouvant s'excuter en parallle avec d'autres threads et pouvant utiliser des ressources communes. Nous utilisons intensivement les threads lors de l'excution d'une classe : le Garbage Collector qui vient nettoyer la mmoire s'excute par exemple au sein d'un thread spar. Bien entendu, les threads ne s'excutent pas rellement en parallle moins de disposer de plusieurs processeurs. L'illusion du paralllisme est donn par l'excution fragmente des programmes.

Crer un thread
Il y a deux faons de crer un thread:

Driver la classe de java.lang.Thread. Cette classe possdera une mthode run() qui contient le code principal du thread. Implmenter l'interface Runnable. En effet, si la classe doit driver d'une autre classe que Thread, elle peut contourner le problme via cet interface Runnable. Elle implementera l'unique mthode run().

Lancement des threads


Le thread sera lanc par la mthode start() applique l'instance de Thread concerne.

Sleep / wait / notify


Un thread se met en arrt temporaire via la mthode statique sleep() de Thread. Attention, cette mthode est statique et ne peut tre appele de l'extrieur du thread pour le forcer au sommeil: elle s'appelle dans le thread lui-mme. Le thread comportera alors un appel de type Thread.sleep([temps en ms]); De la mme faon, un thread peut se mettre en attente d'un vnement par la mthode wait() qui doit tre appele dans la classe mme. Dans ce cas, le thread attendra une notification de

reprise d'activit pour reprendre. Un appel de notify() ( classe Object ) sur une instance de Thread permet de notifier ce dernier de reprendre son excution bloque par un wait(). Un notifyAll() permet cette action sur tous les threads en attente. Attention: Les mthodes sleep() et wait() peuvent provoquer des InterruptedException.

Variables modifies en concurrence


Des"verrous" peuvent tre poss sur des blocs d'instruction ou des mthodes d'une classe afin d'viter les tats indtermins en cas d'accs concurrents. Il faut poser le mot-cl synchronized sur une mthode ou un bloc d'instructions qui accde aux donnes suceptibles d'tre modifies par plusieurs threads en mme temps. Un wait() ne peut par exemple se faire que dans un bloc synchronis.

Tableau rcapitulatif
mthode class Thread void Thread.start() mthode d'instance action Dmarre la mthode run() du thread concern. applique... De l'extrieur du Thread.

class Thread static void sleep(int) mthode de classe

Le thread passe en sommeil le Dans le thread. temps spcifi en ms

class Object void wait() mthode d'instance

Le thread courant passe en attente d'un notify

Dans le thread.

class Object void notifyAll() mthode d'instance class Object void notify() mthode d'instance

Notifie tous les threads en attente de reprendre leur excution

De l'extrieur du thread

Notifie au thread sur lequel De l'extrieur du thread cette mthode est applique de reprendre son excution.

class Thread static void yield() mthode de classe

Force le thread courant se Dans le thread met en pause et laisse la main au threads concurrents

class Thread void setPriority(int) mthode d'instance

Fixe la priorit du thread. Souvent les valeurs: Thread.MIN_PRIORITY, Thread.NORM_PRIORITY ou Thread.MAX_PRIORITY Teste si le thread est vivant

De l'extrieur

class Thread boolean isAlive() mthode d'instance

De l'extrieur

class Thread boolean isInterupted() mthode d'instance

Teste si le thread est dans un wait()

De l'extrieur

Auto-dmarrage d'un thread


Les actions extrieures au thread ne sont pas forcement gres par une classe spare. En effet, l'interface Runnable donne le moyen simple un thread de se lancer lui-mme. Pour cela, il suffit au thread d'implementer Runnable puis de dclarer une variable d'instance de type Thread instanci de cette faon: Thread tThread=new Thread(this); En donnant un argument de type Runnable au constructeur de Thread puis en lanant tThread.start(), la mthode run() de notre thread sera excute travers tThread. Ceci n'est vrai que si nous donnons un type Runnable au constructeur de tThread. Dans le cas contraire, ce sera la mthode run() de tThread qui sera excute lors d'un tThread.start() .

Exemple d'application multi-thread

Dans cet exemple trs simple, nous mettons en place une classe TestThread qui lance deux threads concurrents. Ces deux threads accdent en concurrence une ressource de la classe Ressource. L'un des threads incrmente la ressource et l'autre la dcremente. Chaque thread va ensuite s'endormir pour une dure alatoire. ClasseTestThread public class TestThread implements Runnable{ boolean bInc; / si vrai, le thread dcremente la ressource, sinon, il l'incrmente Thread tThread=new Thread(this); Ressource rRessource; TestThread(Ressource rRessource,boolean bInc){ /*le constructeur prend en argument la ressource partage*/ this.rRessource=rRessource; this.bInc=bInc; tThread.start();//dmarre le thread dans lequel nous sommes et non tThread } public void run(){ System.out.println("Thread "+this +" started"); //affiche le no du thread while(true){ try{ if (bInc){ rRessource.inc(); //incrmente la ressource Thread.sleep((int)(Math.random()*1000)); //dort jusqu' 1 sec } else{ rRessource.dec(); //dcremente la ressource Thread.sleep((int)(Math.random()*1000)); } } catch(InterruptedException ie){ ie.printStackTrace(); } } } public static void main(String[] sArgs){ Ressource rRessource=new Ressource(10); TestThread tt1=new TestThread(rRessource,true); TestThread tt2=new TestThread(rRessource,false); } } ClasseRessource class Ressource{ int iComp; //la ressource elle-mme : un compteur public Ressource(int iValue){ this.iComp=iValue;

} public synchronized void inc(){ //incremente la ressource de faon synchronise iComp++; System.out.println(iComp); } public synchronized void dec(){ //dcremente la ressource de faon synchronise iComp--; System.out.println(iComp); } }

8.2- Les Java Beans


Appeles gnralement 'beans', ces classes sont normalises pour tre rutilisables. En schmatisant, un dveloppement avec des beans permet de construire une application partir d'un RAD (Rapid Active Development ) type 'Bean Builder' comme JBuilder ou Sun BeanBox. Il suffit alors d'crire les beans et de construire l'application la souris par 'drag & drop' dans l'diteur Bean. Les paramtres des beans, les vnements, les interactions entre beans peuvent alors tre dfinies via l'diteur. Ce type de dveloppement se rapproche de certains langage tels Delphi, C LabWindow, Oracle Forms... Il permet en outre d'uniformiser les classes dveloppes et d'en amliorer l'inter-oprabilit. Ce sont des "composants logiciels".

Crer un bean
Un bean n'est rien d'autre qu'une classe "normalise bean". Un bean ne drive d'aucune classe spcifique, il possde simplement des mthodes spcifiques. En effet, pour que le bean soit paramtrable, il faut que la classe possde pour chaque variable d'instance une mthode d'accs get[nom de la variable] et une mthode de modification set[nom de la variable]. L'diteur permettra alors la manipulation de ces paramtres. Il existe galement des normes bean concernant les vnements. Une fois la classe crite, il faut la compiler (javac) puis crer un jar contenant la classe et le fichier manifeste d'organisation du package nomm [nom de la classe].mft: Name:[nom de la classe] Java-Bean:True Crer alors le jar par la commande: jar cvfm [nom de la classe.jar] [nom de la classe.mft] [nom de la classe.class]

8.3- Optimisation du code Java


Le code Java est excut via une JVM. De ce fait, il peut difficilement rivaliser en vitesse d'excution avec des langages compils comme le C ou le C++. cela est la plupart de temps non bloquant dans le sens o les temps de traitement sont ngligeables pour l'utilisateur. Nanmoins, il est ncessaire d'optimiser son code pour trois raisons principales:

Consommer moins de CPU pour obtenir des applications plus fluides. Consommer moins de mmoire pour de pas tomber dans la zone de pagination mmoire ou tre trop gourmand vis vis des autres applications tournant sur la machine. Obtenir des temps de rponse acceptables dans le cas de traitements importants ou critiques.

Les conseils suivants vous permettront de facilement augmenter la vitesse d'excution de votre application et de diviser d'autant la mmoire consomme.

Objets et primitifs
Il faut utiliser au maximum les variables primitives qui ne sont pas des objets et donc sont trs lgers en mmoire. Rappel de la taille des primitifs en Java: Type long int boolean byte float double

Taille ( bits ) 64bits 32bits 8bits (faux 1 bit) 8 bits 32 bits 64 bits Remarquons qu'il n'est pas plus avantageux de travailler avec un boolean qu'avec un byte. Les oprations sur les primitifs sont trs rapidement excutes car facilement traduisibles en code machine du processeur local. A l'oppos, les objets Java possdent une encapsulation (environ 50 octets pour un objet Integer par exemple ). Il sont donc gourmands en mmoire. L'instanciation d'un objet ( new ) tant une oprations trs coteuse en temps CPU, ne surtout pas re-instancier des objets mais modifier au maximum les objets existants ( valable pour les objets graphiques ).

Les oprations sur les tableaux


Toute copie d'un tableau vers un autre lorsque le nombre d'lments est important doit tre effectue via la mthode System.arraycopy() . Voir l'exemple explicite suivant. Le temps de copie est divis par 2.5. byte[]bTest=new byte[10000000]; byte[]bTest2=new byte[10000000]; for(i=0;i<10000000;i++){

bTest2[i]=bTest[i]; }
250ms

System.arraycopy(bTest,0,bTest2,0,10000000);
110ms

Nombre de dimensions d'un tableau:


Il faut crer des tableaux aux dimensions les plus petites possibles. En effet une affectation dans un tableau deux dimension: byte[][] bTest;
bTest[0][0]=10;

prend presque deux fois plus de temps que: byte[] bTest; bTest[0]=10; Et ainsi de suite en augmentant le nombre de dimensions du tableau.

Divers

Les try / catch sur les exceptions sont assez coteux, prfrer capturer des exceptions plus gnrales comme Exception et cela sur de larges zones de code.( Sauf s'il y a des raisons valables de capturer des exceptions plus fines ).

Par exemple, prfrer: try{ a(); b(); } catch(Exception e){ } try{ a(); } catch(Exception e){ } try{ b(); } catch(Exception e){ }

Les constantes ( static final ) sont plus rapides manipuler. De mme, utiliser les mthodes final acclre lgrement le chargement des classes. Les caractres ( primitifs char ou objets String ) sont toujours cods en mmoire en format Unicode, soit sur 2 octets au lieu d'un seul en ASCII. Par consquent, une chane peut prendre davantage de mmoire que prvu... En revanche, Java est alors compatible avec les caractres de la grande majorit des langages ( chinois, indien, japonais...).

8.4- Les accs aux SGDB ( JDBC )


Gnralits
Nous trouvons dans la plupart des architectures distribues un ou plusieurs SGBD ( Systme de Gestion de Base de Donnes ). Pour effectuer des requtes dans ces bases, nous disposons de deux technologies principales:

Les drivers JDBC qui sont des classes gnralement spcialises une SGBD voire une version de cet SGBD (comme Oracle 8i ). Ces drivers peuvent communiquer avec la base dans une communication client-serveur classique et spcifique au SGBD. Dans le cas d'Oracle, le JDBC est une sorte d'mulation du protocole Sqlnet. Les classes JDBC Oracle 8i sont fournies par Oracle. Les drivers ODBC/JDBC ou "pont ODBC/JDBC" . Une couche supplmentaire l'ODBC - est place entre le driver JDBC et la base . Le JDBC communique avec l'interface ODBC et non directement avec la base. L'intrt rside dans la caractre standard de l'ODBC qui est utilis dans les SGBD comme Microsoft SQLServer ou Microsoft Access.

Ces diffrents drivers permettent d'accder indiffremment la plupart des SGBD.

Effectuer une requte par l'exemple


Dans cet exemple comment, nous allons effectuer un requte simple : 'select sysdate from dual;' dans une instance Oracle en utilisant le driver fourni par oracle. Cet exemple est trs simple car la requte ne renvoie qu'une seule ligne et une seule colonne.

Le DriverManager.
Le package java.sql comprend la classe DriverManager qui gre les drivers. En standard, java.sql possde un driver fourni par Sun. Dans notre cas, nous allons charger le driver d'Oracle pour Oracle 8i. Pour utiliser un nouveau driver, il faut l'enregistre par la mthode statique DriverManager.registerDriver(Driver)

Charger le driver JDBC


Pour obtenir l'objet Driver en argument de registerDriver, nous allons charger le driver fourni par Oracle et s'appelant oracle.jdbc.OracleDriver.class puis nous allons en crer une instance.

Class cOracleDriver=Class.forName("oracle.jdbc.OracleDriver"); Remarque: La mthode forName() renvoie un objet Class et est utilise lorsque le nom de la classe utiliser n'est pas connu par avance. Puis nous instancions un objet Driver : Driver dOracleDriver=cOracleDriver.newInstance(); La mthode newInstance() renvoie une instance sur la classe. Remarque: Nous utilisons cette mthode d'obtention d'un objet pour trois raisons:

Le driver utiliser peut tre un paramtre de l'application et slectionn par l'utilisateur. Dans ce cas, nous savons qu'un type Driver doit tre instanci mais pas lequel. Le chargement d'une classe par un forName() est souvent plus rapide que dans un new(). Nous donnons ainsi un exemple dans ce tutorial d'une obtention d'objet via forName() et newInstance().

Cependant, si nous connaissons l'avance la base et le driver utiliser, il suffira de faire: Driver dOracleDriver=new OracleDriver(); condition d'avoir fait un import de oracle.jdbc.*;

Enregistrer le driver dans le 'set' du DriverManager.


DriverManager.registerDriver(dOracleDriver);

Crer une connexion au SGBD via un objet Connection


Connection cConnection=DriverManager.getConnection("url","user","pwd"); Les arguments sont tous des chanes de caractres. Le String 'url' est normalis. Pour une connexion JDBC Oracle via le thin driver c'est--dire le driver lger, le 'connection string' sera: "jdbc:oracle:thin:@[ip]:[port]:[nom de l'instance]" Pour une connexion via pont ODBC/JDBC: "jdbc:odbc:@[ip]:[port]:[nom de l'instance]"

Ouvrir un statement sur la connexion


L'objet Statement gre les requtes et les accs au SGBD. Statement sStat=cConnection.createStatement();

Effectuer une requte qui renvoie un objet ResultSet exploiter


ResultSet rsResult=sStat.executeQuery("requete"); La requte est contenue dans une chane de caractre sans ';'

Afficher le rsultat de la requete


Le ResultSet qui est une numration est positionn sa premire valeur puis son contenu est affich pour une colonne donne. Ainsi, par la mthode rsResult.next(), nous explorons les lignes et la mthode getObject(index) permet d'explorer les valeurs dans les colonnes pour une ligne donne. Dans notre exemple trs simple, nous n'aurons qu'une ligne et qu'une colonne. rsResult.next(); System.out.println(rsResult.getObject(1)); La premire colonne du ResultSet est l'index un et non zro.

Fermer le resultSet
C'est indispensable pour effectuer les requtes suivantes. rsResult.close();

Listing complet
import java.sql.*; import oracle.jdbc.driver.*; class TestJDBC{ String sQuery; TestJDBC(){ this.sQuery="select sysdate from dual"; Statement sStat=null; Connection cCon=null; try{ Class cDriverOracle=Class.forName("oracle.jdbc.driver.OracleDriver"); Driver dDriverOracle=(java.sql.Driver)cDriverOracle.newInstance(); DriverManager.registerDriver(dDriverOracle); cCon=DriverManager.getConnection("jdbc:oracle:thin:@10.31.12.14:1521:ORCL","scott", "tiger"); } catch(Exception e){ System.out.println("--Pbm en chargeant le driver JDBC oracle--"); e.printStackTrace(); } try{ sStat=cCon.createStatement();

ResultSet rs=sStat.executeQuery(sQuery); rs.next(); System.out.println("Resultat requete: "+rs.getObject(1)); sStat.close(); } catch(Exception sqlE){ System.out.println("La Requte n'a pas abouti"); sqlE.printStackTrace(); } } public static void main(String[] sArgs){ TestJDBC tj=new TestJDBC(); } }

8.5- Les flux et les sockets


Ces deux termes dsignent des notions trs distinctes mais elles sont ici rassembles car sont souvent indissociables dans les applications client-serveur Java. Un flux est un objet grant le transport d'un objet d'un "point" un autre. Il permet ainsi la lecture ou l'criture. Par exemple, un objet peut tre crit sous la forme d'un fichier sur un support de stockage. Dans le cadre de ce tutorial, nous ne prsenterons que les flux les plus courants. Les sockets quant elles sont des objets de connexion rseau.

8.5.1- Les flux


Types de flux
Il existe principalement deux types de flux:

Les flux traitant des caractres avec les Reader en entre et les Writer en sortie Les flux traitant des suites d'octets avec les InputStream en entre et les OutputStream en sortie.

La srialisation
Les objets java peuvent facilement tre stocks de faon persistante dans des fichiers. Pour cela, il faut que la classe de ces objets implmente l'interface Serializable ainsi que toutes ses variables d'instance. Les types primitifs sont tous srialisables. Ds lors, il suffit d'utiliser un ObjectOutputStream pour srialiser un objet ou un ObjectInputStream pour d-srialiser. Exemple: Nous voulons stocker de faons permanente une instance de ExempleSerialisable sous la forme d'un fichier '/tmp/toto' :

1- Instancier un flux de sortie sur fichier: FileOutputStream fos=new FileOutputStream("/tmp/toto"); 2- Instancier un ObjectOutputStream qui vient se "brancher" sur le flux de fichier prcdant: ObjectOutputStream oos=new ObjectOutputStream(fos); 3- crire dans le flux: ExempleSerialisable es=new ExempleSerialisable(); oos.writeObject(es); 4- Fermer le flux fos.close(); ( le flux oos sera lui aussi ferm ) Nous obtenons alors un fichier '/tmp/toto' contenant un instance persistante de notre objet 'es'. Pour le d-srialiser, c'est--dire obtenir un objet Java partir d'un tableau d'octets, il suffit de procder l'opration inverse: 1- Instancier un flux FileInputStream sur le fichier "/tmp/toto" FileInputStream fis=new FileInputStream("/tmp/toto"); 2- Instancier un flux lisant les objets java: un ObjectInputStream ObjectInputStream ois=new ObjectInputStream(fis); 3- Lire l'objet, le transtyper et le stocker dans une rfrence de type ExempleSerialisable: ExempleSerialisable es=(ExempleSerialisable)(ois.readObject()); 4- Fermer le flux fis.close(); ( le flux ois sera lui aussi ferm )

8.5.2- Les sockets


Dans toute communication entre deux machines, il y a un dialogue de type client-serveur. Le client est celui qui a initi le dialogue et le serveur celui qui tait en attente de requte. Cot serveur, un listener coute l'afft de toute demande. Il coute sur un port spcifique. En effet, mme si chaque machine possde une adresse IP unique, elle peut possder une multitude de services diffrents ( http, telnet, sqlnet, netbios, ftp ....).

Cot client, une connexion avec l'un de ces listeners est ralise via une socket qui pointe alors sur une socket serveur une IP et un port donns. Il est possible d'crire facilement une application client-serveur qui change des donnes. Pour cela, il faut:

Instancier un listener cot serveur. Instancier une socket cot client. Instancier les flux d'entre/sortie associs la communication.

Ensuite, il est possible d'envoyer des donnes entre les machines.

Un programme client-serveur par l'exemple


Exemple: le serveur envoie l'objet de type String "ok" au client lors d'une connexion russie. Cot serveur import java.net.*; import java.io.*; class TestServer{ TestServer() throws Exception{ ServerSocket ssServer=new ServerSocket(80); //port d'coute du listener Socket sSocket=null; while(sSocket==null){//on boucle en attendant une connexion cliente sSocket=ssServer.accept(); } OutputStream os=sSocket.getOutputStream(); ObjectOutputStream oos=new ObjectOutputStream(os); oos.writeObject(new String("ok")); } } Cot client import java.net.*; import java.io.*; class TestClient{ TestClient() throws Exception{ Socket sSocket=new Socket("213.84.64.18",80); InputStream is=sSocket.getInputStream(); ObjectInputStream ois=new ObjectInputStream(is); System.out.println((String)(ois.readObject())); } }

8.6- Les objets distribus ( RMI / CORBA )


8.6.1- Remote Method Invocation ( RMI )
Jusqu' prsent, toutes les classes taient excutes dans l'environnement clos d'une machine ( virtuelle ), la JVM. Nous allons maintenant voir que nous pouvons galement excuter des classes distantes. C'est la notion d'objets distribus.

L'objet distribu
Considrons un rseau de machines relies pouvant dialoguer via des couches de communications. Chacune d'elles possde des ressources :

Hardware ( CPU, mmoire ) Software ( accs des programmes dans un environnement donn ) A accs restreint ( machine ayant les accs privilgis sur le LAN...)

Communications inter-process
Dans un environnement classique, sur chaque machine, nous avons une JVM et des classes qui s'excutent en local. Malheureusement, il n'y a aucun dialogue entre ces environnements d'excution: une classe Ca s'excutant sur une machine A ne peut changer de rsultats avec une classe Cb s'excutant sur une autre machine ou mme sur la mme machine mais dans une autre JVM. Par exemple, Lancez java Ca puis java Cb sur la mme machine ou une machine distante. Il n'y a aucune communication possible entre les deux processus. Le concept d'objets distribus permet de rsoudre ce problme. Il permet de rendre disponible un objet toutes les machines autorises. L'objet est alors distribu car accessible de tout point du rseau.

Architecture distribue
Ce type d'architecture est profondment client/serveur. Nous trouvons pour chaque objet distribu:

La machine serveur qui possde l'objet Les machines clientes qui demandent l'excution de l'objet et rcuprent les rsultats de ses mthodes.

En excutant un objet distant, il devient alors possible de crer un dialogue entre les machines clientes et la machine serveur et d'utiliser des ressources distantes.

Exemples d'utilisation

Communication entre deux applications Java: un tableau provenant d'un tableur est incorpor via drag & drop dans le document en cours d'un traitement de texte. Calcul distribu: nous envoyons une machine puissante une quation rsoudre, le calcul se fait sur cette machine et le rsultat est rcupr sur notre PC.

Middleware: vous ne pouvez accder des ressources distantes mais vous demandez au middleware d'effectuer des requtes ou des lancements de programmes. Communication entre deux machines distantes: du bureau, vous demandez votre PC de fermer les fentres de chez vous en cas d'orage, de lancer une machine laver ou le chauffage.

Bref, le RMI permet deux machines de communiquer de faon transparente.

Mais entrons davantage dans le dtail du RMI en dtaillant son fonctionnement gnral.

Le RMI
Un objet distribu possde toujours deux parties:

La partie serveur implmentant l'objet et drivant toujours de java.rmi.server.UnicastRemoteObject La partie cliente est une simple interface drivant de java.rmi.Remote et dclare les mmes mthodes que la partie serveur.

La communication client-serveur se fait ainsi: Cot serveur, Un programme natif appel RMIRegistry tourne et fait office de listener aux demandes RMI qui se font par dfaut sur le port 1099. Une classe instancie l'objet distribu, donne son URL et accepte les demandes RMI d'accs cet objet ( fait un rebind ). Cot client L'utilisateur lance une classe qui fait une recherche sur l'objet distant ( un lookup ) et rcupre une rfrence distante. Ds lors, il peut utiliser cet objet comme s'il tait en local. Remarque: Nous ne dtaillerons pas ici les mcanismes assez complexes qui sous-tendent ce processus. Pour une formation plus pousse, consulter le tutorial RMI de SUN dont l'URL est donne plus bas.

Le RMI par l'exemple


En guise de cours, nous allons donner un rapide exemple d'application RMI appel MiniMiddleware et servant grer le lancement d'un programme plac sur un serveur partir de n'importe quel poste client ( rexec ) . Une application pourrait tre le lancement de binaires AIX plac sur un serveur Unix partir d'un poste sous Microsoft Windows et d'en rcuprer le code de sortie. 1- Dclarer une interface pour l'objet distribu interface MiniMiddleware extends java.rmi.Remote{ public int launch(String sProg) throws java.rmi.RemoteException;

} } Puis compiler l'interface pour disposer d'une classe MiniMiddleware 2- Implmenter l'objet distribu public class MiniMiddlewareImpl extends UnicastRemoteObject implements MiniMiddleware{ //on remarque la norme de nommage 'Impl' public MiniMiddleware() throws java.rmi.RemoteException{ //constructeur par dfaut super(); } public int launch(String sNomProg) throws java.rmi.RemoteException { Process p=System.exec(sNomProg); //lancement du programme p.waitFor(); //attente de la fin de l'excution return (int)p.getExitValue(); } } Le compiler. 3- Gnrer les classes squelette qui vont permettre le dialogue avec RMIRegistry par le programme JDK rmic: rmic MiniMiddleware qui devrait crer les classes MiniMiddleware_Skel.class et MiniMiddleware_Stub.class 4- Implmenter le programme serveur de gestion de l'objet distribu. import java.rmi.Naming; public class MiniMiddlewareServer{ public static void main(String[] sArgs) { try{ MiniMiddleware mmServer=new MiniMiddleware(); //on instancie cet UnicatRemoteObject Naming.rebind("rmi://"+sArgs[0]+":"+sArgs[1]+"/MiniMiddlewareService",mmServer); } catch(RemoteException re){ re.printStackTrace(); } } } Compiler cette classe. 5- Implmenter un exemple de classe cliente utilisant l'objet distribu

import java.rmi.*; public class TestMiniMiddleware(){ public static void main(String[] sArgs){ try{ MiniMiddleware mmClient=(MiniMiddleware)Naming.lookup("rmi://"+sArgs[0]+":"+sArgs[1]+"/MiniMiddl ewareService"); mmClient.launch(sArgs[2]); } catch(RemoteException re){ re.printStackTrace(); } } } Compiler la classe. 6- Lancer le serveur RMI: rmiregistry Puis le programme serveur: java MiniMiddlwareServer [nom de la machine] [port] Testons finalement la communication: java TestMiniMiddleware [nom de la machine] [port] [ commande lancer sur le serveur]

Tutorial Sun: http://developer.java.sun.com/developer/onlineTraining/rmi/

8.6.2- Corba
Corba ou 'Common Object Request Broker Architecture' est une norme labore par 700 socits regroupes dans le groupe de dveloppement OMG. Tout comme RMI, il permet de faire interagir des objets distribus. Cependant, il ajoute une 'couche' la programmation distribue pour rendre les objets indpendants du langage de programmation dans lequel ils ont t cris. Ainsi, un objet C++ peut dialoguer avec un objet Java ou Lisp... Les langages supports par Corba sont principalement: C,C++, Java, Ada, Cobol, Smalltalk et Lisp. Un 'objet' Corba est une simple interface crit en IDL (Interface Definition Language) et n'implmente aucune mthode. Le compilateur IDL va gnrer une interface dans le langage dsir. Ainsi, nous obtenons comme en RMI une classe 'squelette' qui sera l'image de la classe

implmente. Ensuite, il faut implmenter la classe correspondant cet interface. A l'utilisation, le dialogue entre les objets se fera via un ORB (Object Request Broker) qui joue le mme rle que le RmiRegistry de Java. L'ORB permettra l'excution de mthodes distantes et accessoirement crites dans un autre langage. L'IDL supporte :

les principaux types (int,long,float,string) Les exceptions Les types structurs

Le protocole de communication Corba s'appelle l'IIOP ( Internet Inter-ORB protocole ).

8.7- Les servlets


Dfinition
Dans une architecture client-serveur, une application cliente initialise un dialogue avec une application serveur. Nous avons vu que ce type de dialogue peut tre ralis par objets distribus en RMI ou en Corba. Un protocole personnel peut galement tre mis en place par sockets. Les servlets quant elles sont des applications serveur qui viennent "en couche" au dessus d'un protocole existant. Elle permettent de donner de 'l'intelligence' cot serveur un protocole. Typiquement - et nous nous en tiendrons ici cette utilisation - les servlets sont utilises avec le protocole HTTP. Nous connaissons les applets du cot client. Ce sont des petites applications tlcharges du serveur qui s'excutent sur le client. Elle sont tlcharges via le protocole HTTP l'initiative d'un navigateur web. Cependant, elles ne possdent aucun mcanisme permettant de communiquer avec un serveur. Elle sont simplement stockes cot serveur, au mme titre que des images ou des pages HTML mais s'excutent sur le client de faon autonome. La servlet HTTP vient alors comme partie serveur naturelle de l'applet. Elle est une application s'excutant cot serveur uniquement et pouvant intervenir entre le client HTTP ( le navigateur ) et le serveur HTTP (Apache, IIS...) pour contrler les requtes et effectuer des actions que le protocole HTTP ne sait pas faire. L'une des applications les plus rpandues des servlets est la gnration de pages HTML dynamiques. L'intrt des servlets est alors vident vis vis de solutions distribues type RMI / Corba ou sockets : les servlets possdent toutes les mthodes pour grer facilement le HTTP.

Le protocole HTTP
Pour bien comprendre le rle des servlets, donnons un bref rappel du protocole HTTP. Ce protocole est trs simple: le client effectue une requte au serveur par un GET URL ou URL est l'adresse de la ressource afficher ( une page HTML, une applet... ). Le serveur HTTP envoi alors le fichier au client. Le client peut galement effectuer sa requte par un POST si cette dernire est trs longue. Le port par dfaut de ce protocole est le 80.

Utilit des servlets


Le rle de la servlet va alors tre de modifier ce protocole trs statique pour le complter. Ainsi, une HttpServlet peut surcharger la requte GET par sa propre mthode doGet() dans laquelle elle peut faire tout ce que Java permet. Par exemple, gnrer une page HTML dynamique qui va tre renvoyer au client. Cependant, pour pouvoir 'surcharger le protocole

HTTP', il faut disposer d'un serveur de servlet qui a pour tche d'aiguiller la requte vers la servlet. Il existe des serveurs de servlet pour Apache, comme JServer ou Tomcat qui est intgr dans l'ensemble d'outils serveurs open-source Jakarta.

Les servlets HTTP par l'exemple


Dans cet exemple trs simple, nous gnerons une page dynamique affichant "Votre IP est:" et donnant l'IP du client. import java.servlet.*; import javax.io.*; import javax.servlet.http.*; class DonneIPClient extends HttpServlet{ public void doGet(HttpServletRequest hsrReq,HttpServletResponse hsrRes){ try{ hsrRes.setContentType("text/html"); //prcise au HTTP que l'on transfert du texte PrintWriter pwOut=hsrRes.getWriter(); //donne un flux HTTP vers le poste client pwOut.println("<HTML><BODY>"); pwOut.println("Votre IP est : "+hsrRes.getRemoteHost()); pwOut.println("</BODY></HTML>"); } catch(Exception e){ e.printStackTrace(); } } }

Les SSI
La seconde grande utilisation des servlets rside dans les SSI (Server Side Includes ). Les SSI sont de simples servlets dont le rsultat une requte peut tre stock directement dans une page HTML. Le tag <SERVLET> dans une page HTML suivi de l'url complet de la servlet signifie au navigateur qu'il doit insrer dans la page le rsultat de l'excution de cette servlet. La servlet est excute ct serveur et ne transmet que le rsultat de son excution. Imaginons par exemple un SSI effectuant une requte SQL via JDBC qui est excute cot serveur et qui renvoie sous forme de texte le rsultat de la requte. Cette dernire s'affichera alors dans la page HTML.

CHAPITRE 9 - Notions gnrales graphiques


Ou comment raliser une interface graphique en utilisant les classes swing... Nous dvelopperons ici les notions gnrales du graphisme en Java.

9.1 - Le package Swing


Tous les objets java que nous allons utiliser proviennent du package : javax.swing. Fourni partir du JDK 1.2, le package javax.swing est beaucoup plus riche que le package graphique basique AWT, sur lequel il se base. Ces deux packages ont beaucoup d'objets en commun mais javax.swing complte avantageusement java.awt .

Utilisation
Il faut tout d'abord importer les classes du package javax.swing. Ce package contient tous les objets de base pour crer une interface utilisateur conviviale: barre de dfilement, boutons, boutons radio, saisie de texte, etc ...Les noms des classes Swing sont prcds d'un "J", ce qui les diffrencie de celles du package AWT :

La classe Button en AWT devient la classe JButton pour l'objet Swing La classe TextField en AWT devient la classe JTextField pour l'objet Swing. etc...

En revanche on utilise encore l'AWT pour grer la plupart des vnements et des mises en page ( Layout ).

Classes principales
Les objets les plus couramment utiliss avec Swing sont les classes :

Classe JFrame JPanel JButton JTextField JLabel JComboBox JScrollBar JTable JList JCheckBox JRadioButton

Description Fentre graphique. Zone graphique, container Objet bouton Zone de texte saisir Texte non modifiable Choix d'lments dans une liste avec slecteur Barre de dfilement Tableau Choix d'lments dans une liste sans slecteur Objet pouvant tre coch ou dcoch Choix exclusifs pour les options

9.2 - La philosophie graphique Java


La base d'une interface dveloppe en Java est le panneau ( classe Panel ). Un panneau est un objet pouvant contenir les composants graphiques afficher. Un panneau peut contenir d'autres panneaux. Il faut imaginer ce panneau comme une base de construction sur laquelle on peut poser d'autres lments pour former une interface graphique. Pour comprendre la logique des lments graphiques, il faut savoir que tous les lments appartiennent la classe Component.

Classes graphiques de Java

Les composants
Tous les objets graphiques Java sont des composants de la classe Component . Les objets swing sont des JComponent, classe fille de Component. Ces objets sont susceptibles d'tre associs des vnements ( vus plus loin ) tels une slection dans une liste droulante ou un clic. Ils possdent des mthodes de type addItemListener() qui les rendent sensibles aux vnements. Les objets graphiques sont galement appels widgets.

Les containers
Un container ( classe Container ) est un composant possdant la facult de contenir d'autres composants. Par exemple, un bouton ( JButton ) est un container car il peut contenir un titre (

JLabel ).

Les frames ou fentre


Une fentre ( classe JFrame ) est une fentre systme autonome. Il est ainsi possible de dvelopper facilement des applications multi-fentres. La frame est un container qui possde un panneau racine dont la rfrence est donne par la mthode getContentPane(). Un ajout de composants ou de containers dans ce dernier panneau permet de les afficher l'cran. Attention! une JFrame ne peut contenir directement de composants graphiques, il faut utiliser son panneau racine.

Les applets
Une applet au sens gnral est une petite application s'excutant l'intrieur d'une autre application ( en gnral un navigateur web ). Dans le sens strict, un objet JApplet est un container pouvant contenir d'autres composants graphiques. Tout comme la JFrame, elle possde un panneau racine dont la rfrence est donne par la mthode getContentPane(). Les composants graphiques sont alors poss sur ce panneau et s'affiche dans l'applet.

Gestionnaires de placement
Chaque container spcifie sa mthode de mise en page. C'est la faon dont sont positionns les objets les uns par rapport aux autres. Les objets grant cette mise en page sont des layouts. Un panel peut contenir d'autres panels dont chacun possde un layout diffrent. Les gestionnaires de placement les plus courants sont les suivants :

FlowLayout
Il permet une mise en place squentielle des composants. Par dfaut ils s'affichent de la gauche vers la droite. Lorsqu'il n'y a plus de place sur une ligne, les objets sont affichs sur la ligne d'en dessous.

GridLayout
Le layout est cr en spcifiant le nombre de lignes et de colonnes et chaque composant graphique est affich dans une cellule du tableau. Toutes les cellule font la mme taille ( donc celle du plus grand lment ) .

BoxLayout
Le BoxLayout dfinit un 'empilage' des objets sur l'axe des X ou des Y. Il ressemble au FlowLayout mais il est plus complet car possde des attributs qui permettent un affichage plus facile et affin.

Par dfaut
Si on ne fixe pas de LayoutManager notre panel, le premier lment pos dans ce dernier prend l'intgralit de l'espace disponible et masque les widgets ultrieurs. Dans ce cas, il est possible de placer les objets au pixel prs par la mthode setBounds(int X,int Y,int width,int height) de la classe Component. Mais dans ce cas, il faut s'assurer que l'on n'utilise pas de layout et faire un setLayout(null).

9.4 - Les vnements


Dfinition des vnements et couteurs
Un vnement est un objet de type Event. Les vnements sont gnrs lors d'une action de l'utilisateur sur l'interface. Par exemple, le clic sur un bouton peut gnrer un vnement de type MouseEvent. Mais ces vnements n'ont de consquences sur le programme que si l'objet possde un couteur ( listener ) l'coute. Dans l'exemple du bouton, si on clique sur ce dernier, le gestionnaire graphique Java gnre un objet MouseEvent qui va tre intercept par un couteur pralablement pos ( comme un MouseListener ). Alors le programme excutera la mthode de traitement associe l'couteur, dans notre cas, le programme excutera la mthode mouseClicked(MouseEvent me). Notez que les objets vnement sont toujours gnrs dans une application graphique mais dans le cas o il n'y a pas d'couteurs pour les intercepter, il n'y aura pas de traitements associs. Les couteurs et vnements courants font partie du package AWT. Il faut donc penser faire un import du package java.awt.event. Les composants graphiques possdent des mthodes spcifiques permettant de poser un couteur. Par exemple, addActionListener(ActionListener al) permet de poser un couteur de type 'action sur le composant' qui sait intercepter les ActionEvent comme le clic sur une liste dfilante. Il existe des couteurs pour chaque type d'vnement. Les couteurs sont toujours des interfaces. Ainsi la classe de dveloppement courante devra implmenter toutes les mthodes de l'interface. La plupart du temps, il n'y en a qu'une. C'est cette mthode que le programme excutera si l'vnement se produit. Remarquons que si la classe courante implmente un ActionListener, elle devient elle-mme un objet de type ActionListener. Par consquent,les mthodes d'ajout d'couteurs sur des composants graphiques comme addActionListener(ActionListener al) qui prennent en argument un ActionListener pourront prendre this en argument.

Ecouteurs courants
Listeners courants MouseListener Mthodes implmenter MouseClicked(MouseEvent e) MouseEntered(MouseEvent e) MouseExited(MouseEvent e) MousePressed(MouseEvent e) MouseReleased(MouseEvent e)

MouseDragged(MouseEvent e) ActionListener ( exemple: les boutons ) ActionPerformed(ActionEvent e) ItemListener ( exemple: les listes comme les ComboBox ) ItemStateChanged(ItemEvent e) FocusListener FocusGained(FocusEvent e) FocusLost(FocusEvent e) Il existe galement des couteurs pour grer les actions sur une fentre ( WindowListener ), grer la barre de dfilement ( AdjustementListener ), etc...

TD 9 - Notions gnrales graphiques


Exercice 1 - Cration de notre premire interface graphique
Crer une interface graphique ( une fentre ) d'une taille de 320 pixels par 200 pixels qui porte le nom "TEST". Cette interface doit contenir :

Un Titre "TEST GUI" Un Bouton avec comme label "Au revoir"

Ajouter ses objets sur le panel principal, quel rsultat voyez-vous ? O est le problme ?

Exercice 2 - Mise en place d'une mise en page


Mise en place d'une mise en page de haut en bas sur cette mme interface. Choisissez votre mise en page de manire optimiser le placement.

Le titre doit tre centr au-dessus du bouton et les deux objets ne doivent pas tre "colls". Pensez utiliser plusieurs panels.

Exercice 3 - Ajout des listeners


Ajouter un listener sur le bouton pour que l'application se ferme lors du clic sur le bouton. Ajouter une JComboBox initialises avec trois lments. Lorsqu'on choisi un lment dans la ComboBox, la valeur est affiches dans un JLabel.

CHAPITRE 10 - Les Applets


Le terme applet ou appliquette en franais signifie "petite application" java s'excutant l'interieur d'une autre application. La plupart du temps, le terme dsigne les classes java drivant de la classe Applet et s'excutant dans un navigateur web. Un applet est souvent de taille rduite pour permettre les transferts via Internet.

10.1 - Excution d'une Applet


Ces applets ne sont pas lances comme des programmes stand-alone, c'est- -dire en lanant java maClasse. Une page HTML est ncessaire. Elle doit contenir un TAG dans lequel sera indiqu le programme Java lancer. Les principaux navigateurs prsents sur le march possdent une JVM (Java Virtual Machine ) en standard mais ce sont souvent des JVM java 1 (1.1) . Dans ce cas, les navigateurs ne peuvent excuter les classe crites en Java 2. Il faut alors installer le JRE (Java Runtime Environment ) qui est une JVM Java 2 et qui ne contient que les lments utiles l'excution des classes et non leur compilation. Une applet s'excute sur le poste CLIENT, c'est--dire le poste qui a appel l'applet. L'applet est tlcharge par le navigateur et le JRE l'excute. Il est noter que les applets de grande taille peuvent tre compresses grce l'utilitaire JDK jar pour optimiser les temps de chargement; cependant le navigateur interprte aussi bien les fichiers .jar que les fichiers .class.

10.2 - Notre premire Applet


L'applet suivante charge simplement un bouton "ok" import java.applet.*; import javax.swing.*; class TestApplet extends Applet{ void init(){ getContentPane().add(new Jbutton("ok")); } } Pour excuter ce programme il faut donc crire une page HTML qui fait rfrence ce fichier. <HTML> <BODY> <applet code="TestApplet.class" width="760" height="400" align="middle"</applet> </BODY> </HTML> Le fichier HTML doit se trouver dans le mme rpertoire que le fichier .class. Dans le cas contraire, l'instruction codebase="rpertoire du .class" doit tre rajouter au TAG. Il ne reste

plus qu' lancer le navigateur et ouvrir le fichier HTML. Pour un exemple de fichier HTML lanant une applet Java 2, voir le paragraphe 10.5.

10.3 - Cycle de vie d'une Applet


Les applets ont un processus de vie lorsqu'elles tournent dans un navigateur. Elles suivent ce cycle : init() -> start() -> stop() -> destroy()

INIT:
L'applet est charge dans le navigateur et sa mthode init() est excute ( une seule fois). C'est dans cette mthode que les composants de l'interface utilisateur sont gnralement initialiss.

START:
Aprs la naissance, le navigateur lance l'applet en appelant la mthode start(). Si la page HTML qui a lanc le programme Java est quitte, ( pour aller une autre URL ) et que l'utilisateur y retourne, la mthode start() sera relance. La mthode start() est un bon moyen de lancer toutes les oprations comme du son ou des animations lors du lancement de la page HTML.

STOP:
Lorsque l'utilisateur change de page HTML, l'applet courante se met en mode "veille". La mthode stop() est appele ce moment. start() sera relance si l'utilisateur revient sur la page HTML qui a lanc l'applet.

DESTROY:
Lorsque le navigateur se fermera la mthode destroy() sera excute. Cette mthode ne doit pas tre appele directement.

10.4- Passage de paramtres


Il est possible de passer dans la page HTML des paramtres qui seront transmis l'applet. Les paramtres sont definis dans la page HTML comme il suit: <param name="[Nom du paramtre]" value="[valeur]"> Exemple: <param name="color" value="blue"> Nous disposons donc d'un paramtre nomm "color" et valant "blue". Il n'est possible de

passer que des chanes de caractres en paramtre. Pour rcuprer ces valeurs, nous utilisons la mthode getParameter(String s). Exemple: String sMonParametre=getParameter("Color"); //sMonParametre="blue"

10.5- Model de page HTML d'appel d'une applet Java 2:


<HTML> <TITLE>Titre de l'application</TITLE> <BODY> <!-- Partie lue par InterNet Explorer !--> <object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" width="760" height="400" align="middle"> <PARAM NAME="CODE" value="ex.MonExemple.class"> <PARAM NAME="NAME" value="MonExemple"> <PARAM NAME=TRACE VALUE="ON"> <PARAM NAME="cache_option" VALUE="PLUGIN"> <PARAM NAME="cache_archive" VALUE="exemple.jar"> <!-- Partie lue par Netscape qui ignore le tag <COMMENT> !--> <comment> <embed type="application/x-java-applet;version=1.3" width="760" height="400" align="middle" CODE="ex.MonExemple.class" name="MonExemple" cache_option="PLUGIN" cache_archive="exemple.jar" TRACE="ON"> </OBJECT> </BODY> </HTML> Remarques:

Le nom de la classe lancer par le navigateur comprend le nom complet ( avec le package ) suivi de ".class". Le fichier HTML se trouve ici dans le mme rpertoire que le rpertoire "ex". Le paramtre "cache_archive" correspond la variable d'environnement CLASSPATH pour les classes stand-alone et donne la liste des jars tlcharger pour pouvoir utiliser l'applet. De plus, ces fichiers sont alors mis en cache "protg" du navigateur pour tre certain que les classes de l'application ne seront pas tlcharges chaque lancement mais que dans le cas o l'application a chang. La taille graphique de l'applet est donne par les paramtres "width" et "height" en pixels.

TD 10: Les applets


Exercice 1

Modifier l'applet de test pour que les diffrentes tapes du cycle de vie des applets s'affichent dans la console Java.

Exercice 2
1- Reprendre les crans des TD9 et les transformer en applet. 2- Modifier ces applets pour qu'elles soient la fois des JApplet et des stand-alone que l'on pourra lancer sans navigateur ( classes possdant une mthode main() )

Das könnte Ihnen auch gefallen