Beruflich Dokumente
Kultur Dokumente
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
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.
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.
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.
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'.
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
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.
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?
Soit le programme suivant se trouvant dans une classe quelconque: ( les notations ne correspondent pas celles d'un vritable langage de programmation).
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 ?
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.
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.
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... )
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.
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.
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:
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
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
L'instruction if
if ( i ==0 ){ 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
L'instruction switch (manipule uniquement les entiers int et les caractres 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.
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){ ... } }
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.
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
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; }
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)...
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.
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.
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 .
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?
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.
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.
addElement(Object o);
Parcours d'un vecteur: Nous utilisons un objet Enumeration. Cf. 3.4- Les Enumrations
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);
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
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.
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.
2- Donnez le no de tlphone d'une des personnes stockes dans le dictionnaire 3- Supprimez l'entre concernant une personne donne.
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.
char[] toCharArray() String toUpperCase() String toLowerCase() String trim() static String valueOf( int / boolean / double / float / long )
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());
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.
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.
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"
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...
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.
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.
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.
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 }
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.
* 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.
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{ }
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.
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
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.
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.
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; }
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 .
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 ?
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
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.
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)>....
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.
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.
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.
- 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?
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 ?
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().
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.
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.
Dans le thread.
class Object void notifyAll() mthode d'instance class Object void notify() mthode d'instance
De l'extrieur du thread
Notifie au thread sur lequel De l'extrieur du thread cette mthode est applique de reprendre son excution.
Force le thread courant se Dans le thread met en pause et laisse la main au threads concurrents
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
De l'extrieur
De l'extrieur
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); } }
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]
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 ).
bTest2[i]=bTest[i]; }
250ms
System.arraycopy(bTest,0,bTest2,0,10000000);
110ms
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...).
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.
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)
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.*;
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(); } }
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 )
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.
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.
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.
} } 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]
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 :
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.
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 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.
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
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 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).
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...
Ajouter ses objets sur le panel principal, quel rsultat voyez-vous ? O est le problme ?
Le titre doit tre centr au-dessus du bouton et les deux objets ne doivent pas tre "colls". Pensez utiliser plusieurs panels.
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.
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.
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.
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"
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.
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() )