Ecole Sup´rieure d’Ing´nieurs de Luminy              e            e          Universit´ de la M´diterran´e                ...
Chapitre 1Introduction    Java est un langage de programmation orient´ objets adapt´ ` la distribution                    ...
1.2. PROGRAMMATION MODULAIREvoid fonction1(....) {   ....   x=pgcd(1990,y);   ....}Exemple de la pile#include <stdio.h>typ...
1.2. PROGRAMMATION MODULAIRE    Les types abstraits de donn´es (TAD) sont bas´s sur deux id´es :                          ...
´                                   1.3. PROGRAMMATION ORIENTEE OBJETS    Dans l’exemple de la pile, on aurait pu impl´men...
1.4. JAVA, QU’EST-CE-QUE C’EST ?r´soudre ce probl`me. La POO permet ´galement de r´soudre de fa¸on ´l´gante le e          ...
1.4. JAVA, QU’EST-CE-QUE C’EST ?                              £                                                           ...
1.4. JAVA, QU’EST-CE-QUE C’EST ?autrement dit, toutes les classes d´rivent de java.lang.Object. L’h´ritage en Java        ...
´                               1.5. ENVIRONNEMENT DE DEVELOPPEMENT1.4.5    Dynamique et multithread    Un programme Java ...
Chapitre 2Syntaxe de base    Dans ce chapitre, on introduit la syntaxe de base du langage. Vous verrez qu’elleest assez pr...
´                                                          2.1. UNITES LEXICALESExemples : x         Bidule         Bidule...
´                                                        2.1. UNITES LEXICALESCaract`res      e   Le type caract`re est ch...
2.2. LES VARIABLES   – en notation hexad´cimale, avec les caract`res 0x ou 0X au d´but : 0xDead,                         e...
´                                           2.3. EXPRESSIONS ET OPERATEURS   Il n’y a pas vraiment de notion de variable g...
´                                            2.3. EXPRESSIONS ET OPERATEURS   – char → int, long, float, ou double   – int...
ˆ                                                     2.4. STRUCTURES DE CONTROLE             de d´calage des bits ;      ...
ˆ                                            2.4. STRUCTURES DE CONTROLE        op´rateurs postfixes           e           ...
ˆ                                            2.4. STRUCTURES DE CONTROLE                instructionDefaut}    Attention, s...
ˆ                                               2.4. STRUCTURES DE CONTROLEint i=10;while (i=0) {       System.out.println...
2.5. STRUCTURE D’UN PROGRAMME AUTONOME JAVAlabel : instruction1while(...){...break label;...}    Ceci dit, l’usage des ´ti...
2.5. STRUCTURE D’UN PROGRAMME AUTONOME JAVA    Enfin, pour ex´cuter le programme, il faut utiliser l’interpr´teur de code J...
Chapitre 3Classes et Objets    En C on utilise des structures pour cr´r des TAD (Types Abstraits de Donn´es),             ...
´                                               3.1. DECLARATION DES CLASSES   – les structures de donn´es associ´es aux o...
´                                               3.1. DECLARATION DES CLASSES   La m´thode affecter fait partie de la class...
´                                              3.1. DECLARATION DES CLASSESclass Date {          ...       public Date(int...
´                                               3.2. DEFINITIONS DE CHAMPS3.2      D´finitions de champs          e3.2.1   ...
´                                                 3.2. DEFINITIONS DE CHAMPS25/9/200025/12/200022Initialisation des champs...
´             ´                                               3.3. DEFINITION DE METHODES   private int mois;   private in...
´             ´                                               3.3. DEFINITION DE METHODESOn appelle signature d’une m´thod...
´             ´                                        3.3. DEFINITION DE METHODES       for (Date d=Date.listeDates; d!=n...
Chapitre 4H´ritage e4.1     Introduction    La notion d’h´ritage est fondamentale en POO. Elle permet de sp´cialiser des  ...
4.1. INTRODUCTIONsous classe doit ´videmment compl´ter (enrichir) la classe de base, on parle aussi de                 e  ...
4.2. RETOUR SUR LES QUALIFICATIFS DE CLASSES ET CHAMPS4.2      Retour sur les qualificatifs de classes et champs   Il exist...
´                                           4.4. REDEFINITION ET SURCHARGEAinsi le constructeur de la classe d´riv´e devra...
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Apprentissage du java
Prochain SlideShare
Chargement dans…5
×

Apprentissage du java

1 897 vues

Publié le

0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
1 897
Sur SlideShare
0
Issues des intégrations
0
Intégrations
2
Actions
Partages
0
Téléchargements
36
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Apprentissage du java

  1. 1. Ecole Sup´rieure d’Ing´nieurs de Luminy e e Universit´ de la M´diterran´e e e e Support de cours pourl’apprentissage du langage JAVA ESIL - GBM 2 Claudine Chaouiya 2003/2004 chaouiya@esil.univ-mrs.fr http ://www.esil.univ-mrs.fr/˜chaouiya
  2. 2. Chapitre 1Introduction Java est un langage de programmation orient´ objets adapt´ ` la distribution e e ad’aplications sur Internet et qui s’int`gre au Web. Nous verrons avant tout les ediff´rentes approches de programmation. e Avant d’´crire un programme, il faut poser le probl`me que ce programme devra e er´soudre. La formulation du probl`me influe sur l’´criture du programme, on parle e e ede paradigmes de programmation. S’il est ` peu pr`s possible d’impl´menter tous les a e eparadigmes avec tout langage de programmation, chaque langage est quand mˆme eplus adapt´ ` un paradigme donn´. Ainsi, C est un langage dit proc´dural, C++ et ea e eJava sont orient´s objets. e1.1 Programmation proc´durale e C’est l’approche que vous connaissez. Le langage C est adapt´ ` la programma- eation proc´durale. Dans ce style de programmation, l’accent porte sur l’algorithme emis en oeuvre. Chaque ´tape de l’algorithme peut elle mˆme ˆtre d´coup´e. C’est e e e e ela programmation structur´e qui indique qu’il faut isoler et clairement identifier les ediff´rentes op´rations. On utilise ainsi des fonctions auxquelles on fournit des ar- e eguments et qui retournent des r´sultats. Ces fonctions peuvent ´ventuellement ˆtre e e erang´es dans des biblioth`ques, pour que l’on puisse les r´utiliser. On retrouve ici les e e enotions de modules (voir plus loin), et de compilation s´par´e vues l’an dernier. e eExemple du calcul du pgcdint pgcd(int a, int b){ int r; if (a<b){r=a;a=b;b=r;} do { r=a%b; a=b; b=r; } while (r!=0); return a;}... 1
  3. 3. 1.2. PROGRAMMATION MODULAIREvoid fonction1(....) { .... x=pgcd(1990,y); ....}Exemple de la pile#include <stdio.h>typedef struct elt { char info; struct elt *suiv;} Maillon, *Pile;Pile empiler(char c,Pile P) { Pile q; q=(Pile)malloc(sizeof(Maillon)); q->info=c; q->suiv=P; return(q);}char depiler(Pile *P) { Pile q; char c; q=*P; *P=q->suiv; c=q->info; free(q); return(c);}int vide(Pile P){ return (P==NULL);}int main() { char c; Pile P=NULL; for (c=’a’;c<’e’;c++) P=empiler(c,P); while(!vide(P)) { printf("%c n",depiler(&P)); }}1.2 Programmation modulaire L’encapsulation des donn´es est fondamentale d`s que la taille des programmes e eest importante. Cela permet de se concentrer sur l’essentiel. Ainsi, l’ensemble desproc´dures ou fonctions et les donn´es qu’elles manipulent sont regroup´es dans un e e emodule. Un programme est alors constitu´ de diff´rents modules, et la communication e eentre modules se fait ` travers une interface, les d´tails d’impl´mentation de chaque a e emodule ´tant cach´s aux autres modules. On a vu ce principe dans le cours de C avec e eles fichiers d’entˆtes. eSupport de cours programmation Java - GBM2 - 2-
  4. 4. 1.2. PROGRAMMATION MODULAIRE Les types abstraits de donn´es (TAD) sont bas´s sur deux id´es : e e e – L’encapsulation : c’est la d´finition d’un type et d’un ensemble d’op´rations e e pour le manipuler ` l’int´rieur d’une unit´ syntaxique (un contenant : fichier, a e e classe, module, package, etc.) – La dissimulation de l’information : c’est le masquage des d´tails d’impl´mentation e e qui ne concernent pas l’utilisateur de l’abstraction. L’encapsulation est utilis´e pour la compilation s´par´e : on regroupe dans un e e efichier les parties d’un programme qui sont s´mantiquement li´es. Lors d’une modi- e efication, on n’a pas ` recompiler tout le programme mais seulement le module qui a achang´. Les TAD sont d´finis par : e e – La sp´cification du type tel que vu de l’ext´rieur, elle d´finit comment utiliser e e e le type (donn´es et op´rations accessibles). Elle d´crit aussi l’interface, ce qui est e e e export´. Les programmes utilisant le TAD importent l’interface pour pouvoir e utiliser le type. – La repr´sentation des objets de ce type (structure de donn´e du type), elle e e d´crit comment les objets du TAD sont construits. e – L’impl´mentation des op´rations qui manipulent les objets de ce type. Il y a e e parfois deux op´rations particuli`res : constructeur et destructeur qui sp´cifient e e e comment cr´er un objet du type et quoi faire quand on veut le d´truire. e e Un bon TAD ne devrait exporter que des op´rations, pas de donn´es (champs). e eEventuellement, les donn´es sont acc´d´es au travers d’op´rations tr`s simples ap- e e e e epel´es fonctions d’acc`s (getters et setters) pour donner une valeur ou extraire la e evaleur d’une donn´e.eRemarque : Les classes du mod`le ` objets sont des TAD. e aExemple de TAD : Type Polynome - Interface Constructeurs ZERO → polynome PLUS(Polynome, entier, reel) → Polynome Autres g´n´rateurs e e ADD(Polynome,Polynome) → Polynome SOUSTR(Polynome,Polynome) → Polynome MULT(Polynome,reel) → Polynome PROD(Polynome,Polynome) → Polynome DERIV(Polynome) → Polynome Fonctions d’acc`s et d’interrogation e NUL(Polynome) → booleen DEGRE(Polynome) → entier COEF(Polynome, entier) → reel VAL(Polynome,reel) → reelSupport de cours programmation Java - GBM2 - 3-
  5. 5. ´ 1.3. PROGRAMMATION ORIENTEE OBJETS Dans l’exemple de la pile, on aurait pu impl´menter cette structure avec un etableau, ou encore une liste doublement chaˆ ee... Si, pour un probl`me donn´, on ın´ e ea besoin de cette structure de donn´e, la fa¸on dont elle est mise en oeuvre nous e cimporte peu. Ce qui compte, c’est son comportement (caract´risations des fonctions eempiler, depiler,...). Or, tel que le module pile a ´t´ ´crit, on a le fichier pile.h eeesuivant pour d´crire l’interface. Notez que rien n’empˆche l’utilisateur du module e epile d’acc´der directement aux donn´es (champ info par exemple) : e e// interface du module Pile de caracteres (pile.h)#include <stdio.h>typedef struct elt { char info; struct elt *suiv;} Maillon, *Pile;Pile empiler(char c,Pile P);char depiler(Pile *P);int vide(Pile P);Exemple des formes g´om´triques e eenum type{cercle,triangle,carre}typedef struct{ float l; point c; type f;} forme;float surface(forme x) { switch(x.f) { case cercle : return(PI*l*l); break; case triangle : ..... break; case carre : ..... break; }} L’ajout ou la suppression d’une nouvelle forme am`nent ` reprendre l’ensemble e ades fonctions et ` les adapter. De plus, un cercle a un rayon, un carr´ un cˆt´, un a e oerectangle une longueur et une largeur...1.3 Programmation orient´e objets e Dans l’exemple des piles de caract`res, comment faire lorsqu’on veut utiliser des epiles d’entiers, et non plus de caract`res ? Il faudrait r´´crire un module (alors que, e eefondamentalement, une pile a toujours le mˆme comportement, que ce soit une pile ed’entiers, de caract`res, ou de n’importe quoi). L’approche orient´e objets permet de e eSupport de cours programmation Java - GBM2 - 4-
  6. 6. 1.4. JAVA, QU’EST-CE-QUE C’EST ?r´soudre ce probl`me. La POO permet ´galement de r´soudre de fa¸on ´l´gante le e e e e c eeprobl`me pos´ par le petit exemple des formes g´om´triques, et ceci grˆce ` la notion e e e e a ad’h´ritage que l’on verra au chapitre 4. e Les objets sont au coeur de la POO... Un objet a deux caract´ristiques : son e´tat courant et son comportement. Dans l’exemple de la pile de caract`res, l’´tat este e erepr´sent´ par le contenu de la pile, le comportement par les fonctions que l’on peut e eappliquer ` la pile. a L’´tat d’un objet est repr´sent´ par des attributs, son comportement par des e e em´thodes. On ne peut modifier l’´tat d’un objet que par l’utilisation de ses m´thodes ; e e el’encapsulation des donn´es permet de cacher les d´tails d’impl´mentation d’un ob- e e ejet. Ceci dit, cette vue id´ale est trop rigide pour des applications informatiques. eAinsi, en POO, on pourra avoir des attributs priv´s (modifiables uniquement via une em´thode appropri´e) ou publics (accessibles directement par l’ext´rieur). e e e En POO, on utilise le concept de classe, qui permet de regrouper des objets demˆme nature. Par exemple, une pile de caract`res n’est qu’une pile de caract`res e e eparmi d’autres. En POO, on dira que notre pile particuli`re est une instance de la eclasse des objets connus sous le nom de piles de caract`res. Toutes les piles de ca- eract`res ont des caract´ristiques communes mais peuvent ˆtre dans un ´tat diff´rent. e e e e e – Une classe est un moule (on dira prototype) qui permet de d´finir e les attributs (ou champs) et m´thodes communs ` tous les objets de e a cette classe. – Les types abstraits de donn´es dans le mod`le ` objets s’appellent e e a des classes. – Les instances des classes sont des objets (ou instances). – Les op´rations d’une classe sont ses m´thodes. e e attributs surface, couleur... m´thodes e afficher, detruire, changerCouleur... Tab. 1.1 – La classe Forme g´om´trique e eL’h´ritage Une notion fondamentale en POO est la notion d’h´ritage. Si l’on re- e eprend notre exemple des formes g´om´triques, une fa¸on de proc´der est de d´finir la e e c e eclasse FormeGeometrique avec les attributs et comportements communs ` toutes les aformes g´om´triques. La sous-classe Cercle h´rite alors de la classe FormeGeometrique e e eet a ses propres sp´cificit´s. e e1.4 Java, qu’est-ce-que c’est ? Java est compos´ de 4 ´l´ments : e ee – un langage de programmation – une machine virtuelle (JVM)Support de cours programmation Java - GBM2 - 5-
  7. 7. 1.4. JAVA, QU’EST-CE-QUE C’EST ? £   FormeGeometrique type (chaine de caracteres) centre (point) couleur (de remplissage) afficher() ¢ ¨ rr ¡ ¨¨¨ r rr ¨ r ¨¨ rr £   ¨ £   ¨ % r j Carre Rectangle longueur £ c   longueur ¢ ¡ Cercle ¢ largeur ¡ rayon ¢ ¡ Fig. 1.1 – Classe m`re et ses sous-classes e – un ensemble de classes standards r´parties dans diff´rentes API (Application e e Programming Interface) – un ensemble d’outils (jdb, javadoc,...).Le langage Java est connu et est tr`s souvent associ´ aux applets que l’on peut voir e esur certaines pages WEB, g´n´ralement de jolies applications graphiques... Il ne faut e epas r´duire Java ` un langage d´di´ aux pages WEB. Il s’agit bien d’un langage ` e a e e apart enti`re, qui vous permettra de r´aliser de vraies applications ! e e Dans ce qui suit, on reprend les adjectifs associ´s ` Java par leurs concepteurs e a(voir http ://java.sun.com/docs/white/langenv/Intro.doc2.html).1.4.1 Simple et familier Java est simple et familier car il n’utilise qu’un nombre restreint de conceptsnouveaux. Sa syntaxe est tr`s proche du langage C. Toutes les embˆches sur lesquelles e ubutte le programmeur en C ou C++ sont ´limin´es, par exemple : e e – seul existe le concept de classe, plus de struct, union et enum, – plus de pointeurs et leur manipulation (avec parfois des pointeurs adressant des emplacements non maˆ es !), ıtris´ – plus de pr´occupation de gestion de la m´moire, Java a un “ramasse-miettes” e e (garbage collector) qui se charge (presque) de restituer au syst`me les zones e m´moires inaccessibles, e – plus de pr´processeur : e – comme Java est ind´pendant de la plateforme (voir plus loin), il n’est plus e n´cessaire d’´crire du code d´pendant de la plateforme, e e e – les fichiers d’entˆte .h n’ont plus lieu d’ˆtre, le code produit contient toutes e e les informations sur les types de donn´es manipul´s. e e – ...1.4.2 Orient´ objets e Enfin, Java est orient´ objets, car un programme Java est compl`tement centr´ e e esur les objets. Mis ` part les types primitifs et les tableaux, en Java tout est objet, aSupport de cours programmation Java - GBM2 - 6-
  8. 8. 1.4. JAVA, QU’EST-CE-QUE C’EST ?autrement dit, toutes les classes d´rivent de java.lang.Object. L’h´ritage en Java e eest simple, mais il existe l’h´ritage multiple pour les interfaces. Les objets se mani- epulent via des r´f´rences. Enfin une librairie standard fournit plus de 500 classes au eeprogrammeur (l’API).1.4.3 Interpr´t´, portable et ind´pendant des plateformes e e e C’est justement pour une question de portabilit´ que les programmes Java ne esont pas compil´s en code machine. Le compilateur g´n`re un code appel´ bytecode, e e e ecode interm´diaire qui est ensuite interpr´t´ par la JVM (cf figure 1.2). De plus il e een’y a pas de phase d’´dition de liens ; les classes sont charg´es dynamiquement en e efonction des besoins, au cours de l’ex´cution, de mani`re incr´mentale. La taille des e e etypes primitifs est ind´pendante de la plateforme. e La Java Virtual Machine (JVM) est pr´sente sur Unix, Windows, Mac, Netscape, eInternet Explorer, ... 4 Fichier Bonjour.java 4 public class Bonjour{ BONJOUR ! public static void main(String[ ] arg){ System.out.println(”BONJOUR !”) ; } } 7 7            interpr´teur e   JVM (Java Virtual Machine) compilateur   Fichier Bonjour.class   java Bonjour javac Bonjour.java  ~  Bytecode Fig. 1.2 – Compilation et ex´cution d’un programme Java e1.4.4 Robuste et sˆ r u Il s’agit d’un langage fortement typ´, beaucoup d’erreurs sont donc ´limin´es ` e e e ala compilation. Le ramasse-miettes assure une bonne gestion de la m´moire et il n’y ea pas d’acc`s direct ` la m´moire. Le m´canisme des lev´es d’exceptions permet une e a e e ebonne gestion des erreurs d’ex´cution. Le compilateur est contraignant. e La s´curit´ est prise en charge par l’interpr´teur avec trois niveaux : e e e – Verifier qui v´rifie le code byte e – Class Loader qui est responsable du chargement des classes – Security Manager qui v´rifie les acc`s ressources e eSupport de cours programmation Java - GBM2 - 7-
  9. 9. ´ 1.5. ENVIRONNEMENT DE DEVELOPPEMENT1.4.5 Dynamique et multithread Un programme Java est constitu´ de plusieurs classes. Lorsqu’un classe incon- enue dans un programme est requise par celui-ci, la JVM la recherche et la chargedynamiquement. Un thread (appel´ aussi “processus l´ger”) est une partie de code s’ex´cutant en e e econcurrence avec d’autres threads dans un mˆme processus. Cela permet donc ` un e aprogramme unique d’effectuer plusieurs tˆches “simultan´ment”. La notion de thread a eest int´gr´e au langage et aux API. e e1.4.6 Distribu´ e1.5 Environnement de d´veloppement e Le JDK (Java Developer Kit) contient l’ensemble des librairies standards de java(java.lang, java.util, java.awt, ...), le compilateur (javac), un interpr´teur ed’applets (appletviewer), un interpr´teur (java), un g´n´rateur de documentation e e e(javadoc) et quelques autres outils... C’est le minimum pour d´velopper des appli- ecations en Java. Par ailleurs, il existe de nombreux environnement de d´veloppement. On en cite edeux ci-dessous (cf. http ://java.developpez.com/outils/edi/) pour plus de d´tails... e JBuilder de Bordland est tr`s bien plac´ parmi les environnements professionnels e epour le d´veloppement d’applications Java (http ://www.borland.fr/jbuilder/index.html). e Anciennement connu sous le nom de Forte for Java, Sun ONE (Open NetEnvironnement) Studio s’appuie sur le noyau de NetBeans, projet initi´ par Sun e(http ://developers.sun.com/prodtech/devtools/). GNU/Emacs est un ´diteur polyvalent. Pour l’´dition du code, il poss`de de nom- e e ebreux ”modes” : C, C++, HTML, Java, qui vont adapter le fonctionnement d’Emacs.Il dispose d’un grand nombre de fonctions, couramment utilis´es (en programma- etion) : recherche/remplacement (supporte les expressions r´guli`res ), indentation e eautomatique du code, coloration syntaxique, (Re)d´finition des raccourcis claviers, eauto-compl´tion, gestion du multifenˆtrage, etc... ( plus de 1600 fonctions assur´es e e e). Nous choisirons de travailler avec cet ´diteur et de compiler et ex´cuter en ligne e ede commande.Support de cours programmation Java - GBM2 - 8-
  10. 10. Chapitre 2Syntaxe de base Dans ce chapitre, on introduit la syntaxe de base du langage. Vous verrez qu’elleest assez proche de celle du langage C, avec quelques ajouts et diff´rences. Ce qui echange radicalement, c’est l’approche orient´e objets, ce sera l’objet du chapitre esuivant.2.1 Unit´s lexicales e Le compilateur Java reconnait cinq types d’unit´s lexicales : les identificateurs, eles mots r´serv´s, les litt´raux, les op´rateurs et les s´parateurs. e e e e e2.1.1 Jeu de caract`res e Java utilise le jeu de caract`res Unicode. Les caract`res sont cod´s sur 16 bits e e e(au lieu de 7 pour le code ASCII). Ce code a ´t´ introduit pour tenir compte de tous ee(ou presque !) les alphabets.2.1.2 Commentaires Java reconnait trois types de commentaires : – les commentaires sur une ligne : tous les caract`res suivants //... jusqu’` la e a fin de la ligne sont ignor´s e – les commentaires multilignes : tous les caract`res entre /* ... et...*/ sont e ignor´s e – les commentaires de documentation : quand ils sont plac´s juste avant une e d´claration, les caract`res entre /** ...et...*/ sont inclus dans une docu- e e mentation g´n´r´e automatiquement par l’utilitaire javadoc. e ee2.1.3 Identificateurs Les identificateurs ne peuvent commencer que par une lettre, un soulign´ (’ ’) ou eun dollar (’$’). Les caract`res suivants peuvent ˆtre des lettres ou des chiffres ou tout e ecaract`re du jeu Unicode de code sup´rieur ` H00C0. e e a 9
  11. 11. ´ 2.1. UNITES LEXICALESExemples : x Bidule Bidule $BiduleNote : on convient de r´server des noms commen¸ant par une majuscule aux classes, e cles noms compos´s sont sous la forme “NomCompos´” ou bien “nomCompos´”, et de e e efa¸on g´n´rale, on conseille de nommer les variables et m´thodes de fa¸on parlante. c e e e c2.1.4 Mots r´serv´s e e Les identificateurs du tableau suivant sont des mots cl´s du langage et sont ` ce e atitre des mots r´serv´s que vous ne pouvez en aucun cas utiliser comme identifica- e eteurs. abstract double int super boolean else interface switch break extends long synchronized byte final native this case finally new throw catch float package throws char for private transient class goto * protected try const * if public void continue implements return volatile default import short static do instanceof while* indique un mot cl´ qui n’est pas utilis´ dans les versions actuelles e e Il y a encore trois mots r´serv´s du langage qui ne sont pas des mots cl´s mais e e edes litt´raux :true false et null. e2.1.5 Types primitifs simples Toute variable ou expression a un type qui permet de d´finir l’ensemble des valeurs eet des actions l´gales. Java a un petit nombre de types pr´d´finis appel´s aussi types e e e eprimitifs, le m´canisme des classes et interfaces permet ensuite de d´finir d’autres e etypes. Java a deux sortes de types : les types simples, atomiques (entiers, r´els, bool´ens e eet caract`res) et les types composites (tableaux, classes et interfaces). eSupport de cours programmation Java - GBM2 - 10-
  12. 12. ´ 2.1. UNITES LEXICALESCaract`res e Le type caract`re est char. Il est repr´sent´ sur 16 bits (jeu de caract`res Uni- e e e ecode).Bool´ens e Le type bool´en est boolean. Les deux seules valeurs qu’il peut prendre sont true eet false. Il s’agit du type retourn´ par les op´rateurs relationnels (cf.2.3.4). e eEntiers Ils sont tr`s similaires ` ceux de C, sinon qu’ils sont ind´pendants de la plate- e a eforme. Les 4 types d’entiers sont : – byte =⇒ entier sur 8 bits (compl´ment ` 2) e a – short =⇒ entier sur 16 bits (compl´ment ` 2) e a – int =⇒ entier sur 32 bits (compl´ment ` 2) e a – long =⇒ entier sur 64 bits (compl´ment ` 2) e aR´els e Il n’y a que deux types de r´els en Java : e – float=⇒ repr´sent´ sur 32 bits e e – double=⇒ repr´sent´ sur 64 bits e e2.1.6 Constantes litt´rales eConstantes bool´ennes e On l’a vu, les seules possibles sont true et falseConstantes caract`res e Elles sont constitu´es d’un caract`re ou une s´quence d’´chappement entre des e e e eguillemets simples : ’a’, ’b’,... ’’’, ’’, ’’ ’n’ nouvelle ligne ’t’ tabulationConstantes enti`res e Elles peuvent s’´crire e – en notation d´cimale : 123, -123 e – en notation octale avec un z´ro en premi`re position : 0123 e eSupport de cours programmation Java - GBM2 - 11-
  13. 13. 2.2. LES VARIABLES – en notation hexad´cimale, avec les caract`res 0x ou 0X au d´but : 0xDead, e e e 0XbaBA Le type d’une constante est toujours int, pour pr´ciser qu’une constante est de etype long, la faire suivre de l ou L (par exemple, 1L, 0x7FFL,...).Constantes r´elles e Elles se pr´sentent sous la forme d’une partie enti`re suivie d’un point (.), suivi e ed’une partie d´cimale, d’un exposant et un suffixe de type. L’exposant est un E ou e esuivi d’un entier. 3.1415, 3.1E12, .1E-4 2.0d (ou 2.0D) est un r´el double e 2.0f (ou 2.0F) est un r´el float eConstantes chaˆ ınes de caract`res e Une chaˆ de caract`res est une suite de caract`res d´limit´e par des guillemets. ıne e e e eAttention, en Java les chaˆ ınes de caract`res sont des objets et forment ` ce titre e aun type ` part enti`re, il ne s’agit pas d’un tableau de caract`res. On verra la classe a e eString plus loin (6)2.2 Les variables Toute variable doit avoir ´t´ d´clar´e. La d´claration d’une variable consiste ` ee e e e alui donner un nom et un type, ´ventuellement une valeur initiale et un qualificatif. eLa d´claration alloue la place m´moire n´cessaire au stockage, la taille d´pendant du e e e etype. Java distingue diff´rentes natures de variables (pas n´cessairement incompa- e etibles) : – les variables d’instances, – les variables de classe, – les param`tres de m´thodes, e e – les param`tres de constructeurs, e – les variables de type exception, – les variables locales. Le qualificatif final permet d’interdire la modification ult´rieure d’une variable. e La d´claration des variables locales se fait dans le bloc o` elles sont utilis´es, elles e u esont alors visibles ` partir de leur d´claration jusqu’` la fin du bloc. a e a...for(int i=0;i10;i++) { ... // i est visible dans ce bloc}...Support de cours programmation Java - GBM2 - 12-
  14. 14. ´ 2.3. EXPRESSIONS ET OPERATEURS Il n’y a pas vraiment de notion de variable globale en Java. Toute d´claration de evariable se trouve n´cessairement dans la d´claration d’un classe. Seules les variables e equalifi´es de static (dites de classe) et public peuvent ressembler aux variables eglobales de C et C++.2.3 Expressions et op´rateurs e Les expressions en Java ressemblent beaucoup ` celles que l’on ´crit en C. Elles a esont compos´es de constantes, variables et op´rateurs, assembl´s “correctement”. e e e L’essentiel d’un programme consiste ` ´valuer des expressions pour produire ce aequ’on appelle des effets de bord, ou pour calculer des valeurs. Une expression aveceffet de bord est une expression qui, lorsqu’elle est ´valu´e, produit un changement e ede l’´tat du syst`me. Par exemple, l’affectation est une expression qui a pour effet e ede bord la modification du contenu de l’op´rande gauche. e Le r´sultat de l’´valuation d’une expression est soit une valeur, soit une variable e e(une lvalue, (pour left ou location value) une adresse, membre gauche d’une affecta-tion, ` opposer ` une rvalue qui est une valeur), soit void. Ce dernier cas apparaˆ a a ıtlors de l’invocation d’une m´thode qui ne retourne rien. e2.3.1 Priorit´ des op´rateurs et ordre d’´valuation e e e Les op´rateurs, de la priorit´ la plus forte ` la plus faible sont donn´s dans le e e a etableau 2.3. Introduire des parenth`ses rend souvent l’expression plus lisible, et dans etous les cas l`ve les ambiguit´s. L’ordre d’´valuation est important. A part dans le e e ecas des op´rateurs || et ? : les op´randes de chaque op´ration sont compl`tement e e e e´valu´es avant d’effectuer l’op´ration. Java garantit ´galement que les op´randes sonte e e e e´valu´es de gauche ` droite (dans l’expression x + y, x est ´valu´ avant y). Ceci este e a e eimportant lorsqu’on a des expressions avec effets de bord. Les op´rateurs de Java esont d´taill´s plus loin (2.3.4). e e2.3.2 Type d’une expression Toute expression a un type, connu d`s la compilation. Ce type est d´termin´ par e e ecelui des op´randes et par la s´mantique des op´rateurs. Si le type d’une expres- e e esion n’est pas appropri´, cela conduit ` une erreur de compilation. Par exemple, si e al’expression dans une structure de test if n’est pas de type boolean, le compila-teur produit une erreur. Dans d’autres cas, plutˆt que de demander au programmeur od’indiquer une conversion de type explicite, Java produit une conversion implicitedu type de l’expression en un type qui convient au contexte. Il existe ainsi plusieurssortes de conversions implicites. Les conversions d’un type primitif ` un type primitif plus large pour lesquelles aon ne perd pas d’information : – byte → short,int,long,float, ou double – short → int, long, float, ou doubleSupport de cours programmation Java - GBM2 - 13-
  15. 15. ´ 2.3. EXPRESSIONS ET OPERATEURS – char → int, long, float, ou double – int → long, float, ou double – long → float ou double – float → doubleLes conversions d’un type primitif ` un type primitif plus restreint pour lesquelles aon perd de l’information, ou de la pr´cision : e – byte → char – short → byte ou char – char → byte ou short – int → byte, short, ou char – long → byte, short, char, int – float → byte, short, char, int,ou long – double → byte, short, char, int,long, float Pour les conversions sur les r´f´rences, nous verrons cela plus loin... ee2.3.3 Erreur d’´valuation d’une expression e L’´valuation d’une expression peut conduire ` une erreur, dans ce cas Java lance e aune exception qui pr´cise la nature de l’erreur (voir chapitre 7). e OutOfMemoryError espace m´moire requis insuffisant e ArrayNegativeSizeException une dimension de tableau est n´gative e NullPointerException valeur de r´f´rence ` null ee a IndexOutOfBoundsException valeur d’indice de tabelau hors des bornes ClassCastException op´ation de cast interdite r ArithmeticException division par z´ro e ArrayStoreException affectation ` un ´l´ment de tableau d’une r´f´rence a ee ee de type incompatible des exceptions g´n´r´es par l’invocation d’une m´thode e ee e des exceptions g´n´r´es par les constructeurs e ee bien d’autres !... Tab. 2.1 – Exemples de lev´es d’exceptions e2.3.4 Op´rateurs e Le tableau 2.2 pr´sente tous les op´rateurs du langage, avec leur ordre d’´valuation e e eet leur s´mantique. Il manque dans ce tableau les op´rateurs : e e – les op´rateurs d’affectation (+=, -=, *=, ...) dont l’´valuation est faite de droite e e a ` gauche, – les op´rateurs de manipulation de bits : e (ET bit ` bit), | (OU bit ` bit), ∧ (OU exclusif bit ` bit) et ∼ (compl´mentation a a a e bit ` bit), aSupport de cours programmation Java - GBM2 - 14-
  16. 16. ˆ 2.4. STRUCTURES DE CONTROLE de d´calage des bits ; e – l’op´rateur ternaire conditionnel (si-alors-sinon) : cond ?expr1 :expr2 e Op´rateur(s) e Ordre Type Description = D/G variable affectation * / % G/D arithm´tique e multiplication, division, reste + - G/D arithm´tique e addition, soustration + - G/D arithm´tique e plus, moins unaires ++ - - G/D arithm´tique e pr´ et post incr´ment, d´cr´ment1 e e e e ≤ ≥ G/D arithm´tique e comparaison arithm´tique e == != G/D objet, type primitif comparaison ´gal et diff´rent e e + G/D chaˆınes de caract`res e concat´nation e ! D/G bool´en e non bool´en e ∧ | G/D bool´en e ET, OU exclusif, OU (les 2 op´randes sont ´valu´es) e e e || G/D bool´ens e ET, OU conditionnels (l’op´rande e de droite n’est pas n´cessairement ´valu´e) e e e Tab. 2.2 – Op´rateurs de Java e2.4 Structures de contrˆle o2.4.1 Instructions et blocs d’instructions Un programme Java est constitu´ de d´clarations de classes dans lesquelles fi- e egurent des m´thodes. Ces derni`res sont construites ` l’aide d’instructions combin´es e e a eentre elles par des structures de contrˆle. o Une instruction est une expression suivie d’un point virgule. Les instructionscompos´es ou blocs d’instructions sont des suites d’instructions simples ou compos´es e ed´limit´es par des accolades { et }. L’accolade fermante n’est pas suivie de point e evirgule.Exemple :{ int i; i=4; System.out.println(coucou ! ); System.out.println(i vaut +i);} 1 la valeur d’une expression de post-incr´ment est la valeur de l’op´rande et a pour effet de bord e ele stockage de la valeur de l’op´rande incr´ment´e de 1, la valeur d’une expression de pr´-incr´ment e e e e eest la valeur de l’op´rande incr´ment´e de 1 et a pour effet de bord le stockage de cette valeur. e e eC’est similaire pour le d´cr´ment. e eSupport de cours programmation Java - GBM2 - 15-
  17. 17. ˆ 2.4. STRUCTURES DE CONTROLE op´rateurs postfixes e [] . (params) expr++ expr– op´rateurs unaires e ++expr –expr +expr -expr ∼ ! cr´ation ou cast e new (type)expr op´rateurs multiplicatifs e * / % op´rateurs additifs e + - op´rateurs de shift e op´rateurs relationnels e = = instanceof op´rateurs d’´galit´ e e e == != ET bit ` bit a OU exclusif bit ` bit a ∧ OU inclusif bit ` bit a | ET logique OU logique || op´rateur conditionnel e ?: affectations = += -= *= /= %= = ∧= |= = = = Tab. 2.3 – Op´rateurs dans l’ordre d´croissant de priorit´ e e e L’objet de cette section est de passer bri`vement en revue toutes les structures ede contrˆle (vous les connaissez d´j`). o ea2.4.2 Instruction conditionnelle : if Elle permet d’ex´cution des instructions de mani`re s´lective, en fonction du e e er´sultat d’un test. eif (expression) instruction1if (expression) instruction1 else instruction22.4.3 Etude de cas : switch Elle permet de choisir un bloc d’instruction selon la valeur d’une expressionenti`re : eswitch (expression) { case cste1 : instruction1 case cste2 : instruction2 ... case csteN : instructionN default :Support de cours programmation Java - GBM2 - 16-
  18. 18. ˆ 2.4. STRUCTURES DE CONTROLE instructionDefaut} Attention, si la valeur de expression vaut csteI, instructionI sera ex´cut´e e eainsi que toutes les suivantes (instructionI+1...instructionDefaut) sauf si uneinstruction break a ´t´ rencontr´e. L’exemple suivant illustre le fonctionnement de ee ecette structure de contrˆle : oExemple :char c;...switch (c) { case ’1’: case ’2’: case ’3’: // notez l’absence d’intruction case ’5’: case ’7’: System.out.println(c+est un nombre premiern); break; // notez l’instruction break case ’6’: System.out.println(c+est un multiple de 3n); // notez l’absecnce de break case ’4’: case ’8’: System.out.println(c+est un multiple de 2n); break; case ’9’: System.out.println(c+est un multiple de 3n); break; default : System.out.println(c+n’est pas un chiffre non nuln);}...2.4.4 It´rations : while, do...while et for e La structure de contrˆle while ´value une condition et ex´cute l’instruction tant o e eque cette condition reste vraie.while (condition) instructionExemple :Support de cours programmation Java - GBM2 - 17-
  19. 19. ˆ 2.4. STRUCTURES DE CONTROLEint i=10;while (i=0) { System.out.println(i); i=i-1;} L’instruction do...while est une variante de la pr´c´dente. Une it´ration est e e etoujours ex´cut´e. Il faut la traduire en fran¸ais par Faire... tant que. Attention de e e cne pas confondre avec la structure r´p´ter...jusqu’` ce que ! e e ado instructionwhile (condition)Exemple :int i=-1;do { System.out.println(i); i=i-1;} while (i=0); Enfin, l’instruction for qui comporte une initialisation, une condition d’arrˆt, et eune ou des instructions de fin de boucle :for (instruction1;condition_de_poursuite;instruction2) instruction3est ´quivalente ` : e ainstruction1;while (condition_de_poursuite) { instruction3 instruction2} La virgule (,) est utilis´e pour combiner plusieurs initialisations et plusieurs ins- etructions de fin de boucle.2.4.5 Etiquettes, break, continue et return Toute instruction peut ˆtre ´tiquet´e. e e elabel : instruction L’instruction break d´j` vue avec le switch est utilis´e aussi dans les structures ea ede boucle et permet la sortie imm´diate de la boucle, sans tenir compte des conditions ed’arrˆt de cette derni`re. Une variante permet d’associer une ´tiquette ` l’instruction e e e abreak.Support de cours programmation Java - GBM2 - 18-
  20. 20. 2.5. STRUCTURE D’UN PROGRAMME AUTONOME JAVAlabel : instruction1while(...){...break label;...} Ceci dit, l’usage des ´tiquettes et du break est fortement d´conseill´, ce n’est e e epas ´l´gant, cela nuit ` la lisibilit´ du programme, c’est contraire aux principes de la ee a eprogrammation structur´e ! La plupart du temps, on peut s’en passer. e L’instruction continue apparaˆ dans les structures de boucles. Elle produit ıtl’abandon de l’it´ration courante et, si la condition d’arrˆt n’est pas satisfaite, le e ed´marrage de l’it´ration suivante. e e L’instruction return quant ` elle est indispensable ! Elle provoque l’abandon de ala fonction en cours et le retour ` la fonction appelante. Quand elle est suivie d’une aexpression, le r´sultat de cette expression est la valeur que la fonction appel´e renvoie e ea` la fonction appelante. Mais attention, il est d´conseill´ de placer une instruction e ereturn dans le corps d’une boucle, cela signifie que vous n’avez probablement pasbien ´crit la condition de sortie de la boucle ! e2.5 Structure d’un programme autonome Java Un programme Java est constitu´ d’une ou plusieurs classes. Parmi ces classes, il edoit y en avoir au moins une qui contienne la m´thode statique et publique main qui eest le point d’entr´e de l’ex´cution du programme. Voici un exemple (l’in´vitable !) : e e eExemple :// Fichier Bonjour.javapublic class Bonjour { public static void main(String[] arg) { System.out.println(Bonjour !n); }} On a d´fini une classe Bonjour qui ne poss`de qu’une seule m´thode. La m´thode e e e emain doit ˆtre d´clar´e static et public pour pouvoir ˆtre invoqu´e par l’in- e e e e eterpr´teur Java. L’argument arg est un tableau de chaˆ e ınes de caract`res qui corres- epond aux arguments de la ligne de commande lors du lancement du programme. Avant tout, il faut compiler ce programme avec la commande javac :javac Bonjour.java La compilation traduit le code source en byte code. Le compilateur produit autantde fichiers que de classes pr´sentes dans le fichier source. Les fichiers compil´s ont e el’extension .class.Support de cours programmation Java - GBM2 - 19-
  21. 21. 2.5. STRUCTURE D’UN PROGRAMME AUTONOME JAVA Enfin, pour ex´cuter le programme, il faut utiliser l’interpr´teur de code Java et e elui fournir le nom de la classe public que l’on veut utiliser comme point d’entr´e : ejava BonjourSupport de cours programmation Java - GBM2 - 20-
  22. 22. Chapitre 3Classes et Objets En C on utilise des structures pour cr´r des TAD (Types Abstraits de Donn´es), e eou structures de donn´es complexes. Dans les langages orient´s objets, on utilise le e econcept de classes. Elle permettent de d´finir de nouveaux types de donn´es qui se e ecomportent comme des types pr´d´finis et dont les d´tails d’impl´mentation sont e e e ecach´s aux utilisateurs de ces classes. Seule l’interface fournie par le concepteur peut eˆtre utilis´e.e e Un objet est une instance d’une classe (qui peut ˆtre vue comme un moule). Les eobjets communiquent entre eux par des messages qui sont ´valu´s par des m´thodes. e e eCes messages ´valu´s par des m´thodes de l’objet, induisent des modification de son e e e´tat ou de son comportement. Les objets vivent en famille, et peuvent donc h´ritere edes caract´ristiques de leurs ancˆtres, en affinant (sp´cialisant) ces caract´ristiques. e e e eUn objet est caract´riq´ par : e e – un ensemble d’attributs, typ´s et nomm´s repr´sentant des propri´t´s statiques. e e e ee L’ensemble des valeurs des attributs consitue l’´tat de l’objet, e – un ensemble de m´thodes, d´finissant son comportement et ses r´actions ` e e e a des stimulations externes. Ces m´thodes impl´mentent les algorithmes que l’on e e peut invoquer sur ces objets, En Java, on ne peut acc´der ` un objet que par une r´f´rence vers celui-ci. Une e a eer´f´rence est une sorte de pointeur vers la structure de donn´es, avec la diff´rence qu’il ee e eest interdit de manipuler les r´f´rences comme les pointeurs en C ou C++. On ne peut eepas connaˆ la valeur d’une r´f´rence, ni effectuer d’op´rations arithm´tiques. La ıtre ee e eseule manipulation possible consiste ` changer la valeur de la r´f´rence pour qu’elle a ee“fasse r´f´rence” ` un autre objet. ee a Une classe est un moule d’objets, elle en d´crit la partie priv´e (structure de e edonn´es interne ou attributs et corps des m´thodes), et la partie publique (nom e eet param`tres des m´thodes). C’est un g´n´rateur d’objets, on peut ainsi cr´er un e e e e eensemble d’objets rentrant dans ce moule.3.1 D´claration des classes e Basiquement, une classe d´finit : e 21
  23. 23. ´ 3.1. DECLARATION DES CLASSES – les structures de donn´es associ´es aux objet de la classe, les variables d´signant e e e ces donn´es sont appel´es champs ou attributs, e e – les services ou comportements associ´s aux objets de la classe qui sont les e m´thodes, d´finies dans la classe. e e3.1.1 Champs ou attributs Java poss`de trois mots cl´s pour l’encapsulation des donn´es (les droits d’acc`s) : e e e epublic, private et protected. Nous les reverrons plus en d´tail, mais retenez ici que eles donn´es et m´thodes d´clar´es public sont accessibles par toutes les classes. In- e e e eversement, les donn´es et m´thodes d´clar´es private ne sont accessibles que par les e e e em´thodes de cette classe. Enfin, le mot cl´ protected institue une notion de “famil- e ele”. Supposons que nous voulions d´clarer une structure de donn´es Date constitu´e e e ede trois entiers codant le jour, le mois et l’ann´e : eclass Date{ private int mois; private int jour; private int annee; ...} Les donn´es mois, jour et ann´e ont ´t´ d´clar´es priv´es. Elles ne seront acces- e e ee e e esibles que par des m´thodes d´finies de la classe Date dans la section qui suit. e e3.1.2 M´thodes e Elles sont d´finies par un identificateur, des param`tres formels, un type de retour, e eun corps et ´ventuellement un qualificatif (comme pour les champs) public, private eou protected.class Date{ private int mois; private int jour; private int annee; ... public void affecter(int m, int j, int a) { mois=m; jour=j; annee=a; } public int quelJour(){return jour;} public int quelMois(){return mois;} public int quelleAnnee(){return annee;} public void imprimer(){ System.out.println(jour+/+mois+/+annee); }}Support de cours programmation Java - GBM2 - 22-
  24. 24. ´ 3.1. DECLARATION DES CLASSES La m´thode affecter fait partie de la classe Date, il lui est donc permis d’acc´der e ea` ses champs priv´s. Et cette m´thode, puisqu’elle est d´clar´e public, permet de e e e emodifier les champs d’un objet de la classe Date. Les m´thodes publiques d’une classe econstituent ce que l’on appelle son interface publique. Contrairement au langage C++ la d´finition effective des m´thodes de la classe e edoit se faire dans la d´finition de la classe. e Une m´thode est un message envoy´ ` un objet. Ainsi, pour afficher la date e e acontenue dans l’objet d, on lui envoie le message imprimer :d.imprimer();De telles m´thodes sont appel´es m´thodes d’instances, elles sont ´voqu´es via un ob- e e e e ejet. Nous verrons plus loin qu’il existe des m´thodes de classes. La m´thode imprimer e en’est utilisable que parce qu’elle fait partie des m´thodes publiques. Par contre, il ne esera pas possible d’acc´der aux champs d.jour, d.mois et d.annee car ce sont des edonn´es priv´es. e e3.1.3 Cr´ation d’objets e Une fois la classe d´clar´e, pour pouvoir utiliser un objet de cette classe, il faut e ed´finir une instance de cette classe. La d´claration suivante ne fait que d´finir une e e er´f´rence vers un objet ´ventuel de la classe Date : ee eDate d;La variable d repr´sente une r´f´rence vers un objet de type Date qui doit ˆtre e ee einstanci´ (cr´´) explicitement avec le mot cl´ new et le constructeur (cf. section3.1.4) e ee ede la classe Date :Date d; //d´claration de la r´f´rence d e e ed = new Date(); // instanciation de l’objet r´f´renc´ par d e e e3.1.4 Constructeurs On a dit que pour d´finir un objet d’une classe, il fallait faire appel ` son construc- e ateur. En l’absence de constructeur(s) explicite(s), un constructeur implicite, sansargument, est invoqu´ par d´faut. e e Lorsque l’on veut d´finir un objet, il est souvent utile de pouvoir initialiser cet eobjet. Dans notre exemple de la classe Date, il est possible d’utiliser la m´thodeeaffecter pour donner une valeur aux champs d.jour, d.mois et d.annee. Date aujourdhui=new Date(); aujourdhui.affecter(8,25,1961);Mais ce n’est pas tr`s agr´able. Le constructeur est une m´thode sp´cifique qui est e e e eautomatiquement appel´e lors de la cr´ation d’un objet. Elle a la particularit´ de e e eporter le mˆme nom que la classe, d’ˆtre publique et n’a pas de valeur de retour. e eSupport de cours programmation Java - GBM2 - 23-
  25. 25. ´ 3.1. DECLARATION DES CLASSESclass Date { ... public Date(int j, int m, int a) { jour=j; mois=m; annee=a;} ...} Maintenant, pour cr´er un objet de type Date il faudra fournir imp´rativement e ele jour, le mois et l’ann´e. On peut contourner ce probl`me en fournissant plusieurs e econstructeurs :class Date { ... public Date(int j, int m, int a) { jour=j; mois=m; annee=a;} public Date(int j, int m) { jour=j; mois=m; annee=2000;} public Date(int j) { jour=j; mois=1; annee=2000;} public Date() { jour=1; mois=1; annee=2000;} ...}3.1.5 Destructeurs En g´n´ral, en Java, on n’a pas ` se soucier de la restitution de l’espace m´moire e e a eoccup´ par un objet qui n’est plus r´f´renc´. On a d´j` ´voqu´ le “ramasse-miettes” e ee e eae e(garbage collector) qui est un syst`me de r´cup´ration de m´moire automatique. Par e e e ed´faut, ce syst`me tourne en arri`re-plan pendant l’ex´cution de vos programmes. Il e e e erep`re les objets qui ne sont plus r´f´renc´s, et lib`re l’espace en m´moire allou´ ` e ee e e e eaceux-ci. Vous pouvez d´sactiver le ramasse-miettes (option -noasyngc sur la ligne ede commande de lancement de la JVM). Selon les applications, un objet peut bloquer d’autres types de ressources que lam´moire (descripteur de fichiers, socket, ...), il est alors bon d’utiliser un destruc- eteur pour lib´rer ces ressources. De plus, vous pouvez ne pas vouloir attendre que ele ramasse-miettes lib`re des ressources critiques. Il existe une m´thode sp´cifique e e efinalize qui est un destructeur et red´finit la m´thode protected void finalize e ede la classe Object. Une classe peut donc impl´menter une m´thode finalize qui e eest d´clar´e de la fa¸on suivante : e e cprotected void finalize() throws Throwable { super.finalize(); ...} Ce code s’´claircira plus tard, avec les notions d’h´ritage et d’exceptions. e eSupport de cours programmation Java - GBM2 - 24-
  26. 26. ´ 3.2. DEFINITIONS DE CHAMPS3.2 D´finitions de champs e3.2.1 Champs de classe Si l’on d´finit trois objets de type Date, chacun aura ´videmment son propre jeu e ede valeurs pour les champs jour, mois, annee. De tels champs sont appel´s variables e(ou attributs) d’instances. Il est des cas o` il est souhaitable d’avoir une donn´e u ecommune ` tous les objets d’une mˆme classe. Un champ d’une classe est dit static a e(ou de classe) ; il n’y a qu’un seul exemplaire de ce champ pour tous les objets decette classe. Ce champ existe mˆme s’il n’y a aucune instance de la classe. eExemple :class Date{ private int mois; private int jour; private int annee; public static int nbDate=0; public Date(int j, int m, int a){ mois=m; jour=j; annee=a; nbDate++; } public int quelJour(){return jour;} public int quelMois(){return mois;} public int quelleAnnee(){return annee;} public void imprimer(){ System.out.println(jour+/+mois+/+annee); }}class Programme{ public static void main(String[] arg){ Date aujourdhui=new Date(25,9,2000); Date noel=new Date(25,12,2000); aujourdhui.imprimer(); noel.imprimer(); System.out.println(noel.nbDate); System.out.println(Date.nbDate); }}Voici le r´sultat obtenu : echaouiya@pccc:~/coursJava/Notes_cours$ javac Programme.javachaouiya@pccc:~/coursJava/Notes_cours$ java ProgrammeSupport de cours programmation Java - GBM2 - 25-
  27. 27. ´ 3.2. DEFINITIONS DE CHAMPS25/9/200025/12/200022Initialisation des champs de classe Les champs static sont initialis´s une fois lors du chargement de la classe qui eles contient. Une erreur de compilation se produit lorsque : – un champ de classe est initialis´ relativement ` un champ de classe d´fini plus e a e loin class X{ static int x = y+1; // erreur, y est declare apres x static int y =0; static int z=z+1; // erreur } – un champ de classe est initialis´ relativement ` un champ d’instance e a class X{ public int x=120; static int y=x+10; // erreur, x variable d’instance }Initialisation des champs d’instance Les champs d’instance sont initialis´s lors de l’instanciation (` la cr´ation) des e a eobjets de la classe. Contrairement aux champs de classe, chaque instanciation pro-voque l’intialisation des champs de l’objet cr´´. Une erreur de compilation se produit eesi un champ d’instance est initialis´ par r´f´rence ` un champ d’instance d´fini plus e ee a eloin. On peut utiliser les valeurs des champs de classe pour initialiser des champsd’instance.3.2.2 Mot cl´ this e Il d´signe l’objet sur lequel la m´thode est invoqu´e. On peut par exemple r´´crire e e e eela m´thode affecter comme suit : e public void affecter(int m, int j, int a) { this.mois=m; this.jour=j; this.annee=a; } Dans l’exemple qui suit, l’int´rˆt du mot cl´ this est certainement mieux illustr´. ee e eOn cr´e une liste chaˆ ee de tous les objets de type Date qui ont ´t´ instanci´s : e ın´ ee eclass Date{Support de cours programmation Java - GBM2 - 26-
  28. 28. ´ ´ 3.3. DEFINITION DE METHODES private int mois; private int jour; private int annee; private Date suivant; public static Date listeDates=null; public Date(int j, int m, int a){ jour=j; mois=m; annee=a; suivant=listeDates; listeDates=this; } public void imprimer(){ System.out.println(jour+/+mois+/+annee); }}class Test { public static void main(String[] arg){ Date noel=new Date(25,12,2000); Date aujourdhui=new Date(25,9,2000); for (Date d=Date.listeDates; d!=null; d=d.suivant) d.imprimer(); }}3.2.3 Champs final Un champ peut ˆtre d´clar´ final pour indiquer qu’il ne peut pas ˆtre modif´, et e e e e egardera donc une valeur constante. Leur initialisation doit se faire de la mˆme fa¸on e cque pour les champs de classe.3.3 D´finition de m´thodes e e3.3.1 Le passage des param`tres e Tous les param`tres sont pass´s par valeur. Les seuls types possibles de param`tres e e esont les types primitifs et les r´f´rences. Autrement dit : ee – les types primitifs sont pass´s par valeur. Une m´thode ne peut donc jamais e e modifier la valeur d’une variable de type primitif, – les r´f´rences ´galement sont pass´es par valeur (valeur de la r´f´rence vers ee e e ee l’objet). Si la m´thode modifie un champ de l’objet r´f´renc´, c’est l’objet qui e ee e est modifi´, et le code appelant voit donc l’objet r´f´renc´ modifi´. e ee e e3.3.2 Signature et polymorphisme Contrairement ` ce que vous connaissez en C, un mˆme identificateur peut ˆtre a e eutilis´ pour d´signer deux m´thodes ` condition que leur signature soit diff´rente. e e e a eSupport de cours programmation Java - GBM2 - 27-
  29. 29. ´ ´ 3.3. DEFINITION DE METHODESOn appelle signature d’une m´thode, la donn´e de son nom, du nombre de ses pa- e eram`tres formels et de leurs types. eint methode1(int i){...} // erreur, type retour de la methode nefloat methode1(int i){...} // fait pas partie de sa signatureint methode2(int i){...}float methode2(float f){...} //OKint methode3(int i) {...}int methode3(int i, int j) {...} //OK3.3.3 Variables locales Les variables locales sont allou´es lors de l’invocation de la m´thode et sont e ed´truites ` la fin de celle-ci. Ces variables ne sont visibles qu’` l’int´rieur de la e a a em´thode ou du bloc d’instructions o` elles sont d´clar´es. e u e e3.3.4 M´thodes de classe e Les m´thodes vues juqu’` pr´sent s’appliquent toujours ` une r´f´rence sur un ob- e a e a eejet. Les m´thodes qualifi´es de static sont celles qui n’ont pas besoin d’une instance e epour ˆtre invoqu´es. e e Comme toute m´thode, une m´thode de classe est membre d’une classe. Elle est e einvoqu´e en lui associant, non pas un objet mais la classe ` laquelle elle appartient. e aPar exemple, la m´thode sqrt qui calcule la racine carr´e appartient ` la classe Math. e e aPour l’invoquer on ´crit : Math.sqrt(x) ; e Une m´thode static, puisqu’elle ne s’applique pas sur un objet, ne peut acc´der e eaux variables d’instances. De mˆme, le mot cl´ this n’a pas de sens dans une m´thode e e estatic.class Date{ private int mois; private int jour; private int annee; private Date suivant; public static Date listeDates=null; public Date(int j, int m, int a){ jour=j; mois=m; annee=a; suivant=listeDates; listeDates=this; } ... public void imprimer(){ System.out.println(jour+/+mois+/+annee); } public static void listerDate(){Support de cours programmation Java - GBM2 - 28-
  30. 30. ´ ´ 3.3. DEFINITION DE METHODES for (Date d=Date.listeDates; d!=null; d=d.suivant) d.imprimer();* }}class Test { public static void main(String[] arg){ Date noel=new Date(25,12,2000); Date aujourdhui=new Date(25,9,2000); Date.listerDate(); }}Support de cours programmation Java - GBM2 - 29-
  31. 31. Chapitre 4H´ritage e4.1 Introduction La notion d’h´ritage est fondamentale en POO. Elle permet de sp´cialiser des e eclasses. Reprenons l’exemple de la classe Date, et supposons que nous devions main-tenant d´finir une classe DateAnniversaire, qui associe ` une date donn´e le nom e a eet le pr´nom d’une personne n´e ` cette date. Une premi`re solution consisterait ` e e a e ad´finir compl`tement la nouvelle classe : e eclass DateAnniversaire{ private int mois; private int jour; private int annee; private String nom; private String prenom; public DateAnniversaire(int j,int m,int a,String n,String p) { jour=j; mois=m; annee=a; nom=n; prenom=p; } public affecter(int m,int j,int a,String n,String p) { jour=j; mois=m; annee=a; nom=n; prenom=p; } ... public void imprimer(){ System.out.println(prenom+ +nom+ est ne le +jour+/+mois+/+annee); }} Cette approche va ` l’encontre de l’esprit de la POO. Dans la mesure o` l’on a a ud´j` ´crit une classe Date, il s’agit de la r´utiliser, en la sp´cialisant. C’est l’id´e de eae e e el’h´ritage. Une DateAnniversaire est une Date avec des fonctionnalit´s suppl´mentaires. e e e L’h´ritage est une caract´ristique des langages orient´s objets. Une classe obte- e e enue par h´ritage poss`de la totalit´ des champs et m´thodes de la classe de base e e e e(dont elle h´rite). Une classe B peut donc se d´finir par rapport ` une classe A dont e e aelle h´rite. On dit que la classe B est une sous classe de la classe de base A. Une e 30
  32. 32. 4.1. INTRODUCTIONsous classe doit ´videmment compl´ter (enrichir) la classe de base, on parle aussi de e esp´cialisation. Elle d´finit donc des champs et comportements suppl´mentaires, et e e epeut, ´ventuellement, modifier une ou des m´thodes de la classe de base. e e Notre exemple de classe DateAnniversaire poss`de beaucoup de caract´ristiques e ede la classe Date (´videmment, c’est une date !). Elle comporte deux champs suppl´- e ementaires, et les m´thodes (constructeur, m´thodes d’acc`s et de modification) doivent e e eˆtre compl´t´es et/ou adapt´es en fonction de l’ajout de ces nouveaux champs. One ee ed´finira la classe DateAnniversaire comme une sous classe de la classe Date. Cela ese fait en Java grˆce au mot cl´ extends. a e Voici l’exemple complet de la classe DateAnniversaire. Nous y reviendrons parla suite :class Date { protected int mois; protected int jour; protected int annee; public Date(int j, int m, int a) { jour=j; mois=m; annee=a; } public void affecter(int j, int m, int a) { mois=m; jour=j; annee=a; }}class DateAnniversaire extends Date{ private String nom; private String prenom; public DateAnniversaire(int j,int m,int a,String n,String p) { super(j,m,a); nom=n; prenom=p; } public void affecter(int j,int m,int a,String n,String p) { super.affecter(j,m,a); nom=n; prenom=p; } public void imprimer(){ System.out.println(prenom+ +nom+ est ne(e) le +super.jour+/+super.mois+/+super.annee); }}class TestDate{ public static void main(String[] arg){ DateAnniversaire d=new DateAnniversaire(0,0,0,,); d.affecter(10,3,1920,Boris,Vian); d.imprimer(); }}Support de cours programmation Java - GBM2 - 31-
  33. 33. 4.2. RETOUR SUR LES QUALIFICATIFS DE CLASSES ET CHAMPS4.2 Retour sur les qualificatifs de classes et champs Il existe trois qualificatifs (on dit aussi modifieurs) pour les classes : – public : une seule classe ou interface peut ˆtre d´clar´e public par fichier e e e source .java, et par convention, le fichier porte le nom de la classe d´clar´e e e public. Une telle classe est accessible depuis l’ext´rieur (nous reverrons ces e notions avec les paquetages). – final : une classe d´clar´e final ne peut ˆtre d´riv´e (et ne peut donc jamais e e e e e suivre la clause extends). – abstract : une classe d´clar´e abstract ne peut jamais ˆtre instanci´e. Nous e e e e verrons l’int´rˆt de telles classes un peu plus loin. Disons simplement pour le ee moment que leur int´rˆt est de fournir une esp`ce de mod`le pour les classes ee e e d´riv´es. e e Pour les champs, voici les qualificatifs possibles : – public : pour signifier que le champ est accessible partout o` est accessible la u classe dans laquelle il est d´clar´, e e – protected : pour signifier que le champ est accessible par les classes du mˆme e paquetage et les classes d´riv´es de la classe o` il est d´clar´, e e u e e – package : pour signifier que le champ est accessible par les classes du mˆme e paquetage (c’est le qualificatif par d´faut), e – private : pour signifier que le champ n’est accessible qu’` l’int´rieur de la a e classe o` il est d´clar´, u e e – static : pour signifier qu’il s’agit d’un champ de classe, un seul exemplaire est cr´´, ee – final : pour signifier qu’il s’agit d’une constante, – transient : que nous verrons plus tard... lorsque nous aborderons les notions de persistance, – volatile : que nous verrons plus tard... lorsque nous aborderons les notions de processus (threads). Maintenant, vous devez mieux comprendre les qualificatifs donn´s aux champs ede la classe Date.4.3 Constructeur de la sous-classe4.3.1 Invocation du constructeur Lors de la d´finition d’une classe d´riv´e, il faut s’assurer que, lors de l’instancia- e e etion des objets de cette nouvelle classe, les champs propres ` cette classe mais aussi ales champs de la classe de base seront bien initialis´s. Souvent, les champs de la classe ede base sont priv´s et la classe d´riv´e ne peut donc se charger de leur initialisation. e e eSupport de cours programmation Java - GBM2 - 32-
  34. 34. ´ 4.4. REDEFINITION ET SURCHARGEAinsi le constructeur de la classe d´riv´e devra faire appel ` celui de la classe de base e e apour l’initialisation de ces champs. Dans notre exemple de dates, on dira que pourcr´er une DateAnniversaire, il faut d’abord cr´er une Date. e e Voici quelques points essentiels : – Le constructeur est appel´ au moment de la cr´ation de l’objet (instanciation). e e Il initialise cet objet en fonction des param`tres fournis. e – Si la classe ne comporte pas de constructeur, Java en cr´e un de fa¸on implicite, e c sans param`tre. Mais attention, si la classe a au moins un constructeur avec e param`tre(s) et aucun sans param`tre, elle n’a alors plus de constructeur par e e d´faut. e – Si, la premi`re instruction du constructeur n’est pas un appel explicite d’un e constructeur de la classe de base (utilisation de super(...), voir plus loin), le constructeur par d´faut de la classe de base est appel´. e e – Si la classe de base n’a pas de constructeur par d´faut (ou de constructeur sans e param`tre), on a une erreur de compilation (j’ai repris l’exemple des dates, et e enlev´ l’appel explicite au constructeur de la classe Date dans celui de la classe e DateAnniversaire) : Date2.java:20: No constructor matching Date2() found in class Date2 public DateAnniversaire(int j,int m,int a,String n,String p) { ^ 1 error4.3.2 Enchaˆ ınement des constructeurs Rappelons que la classe Object est la m`re de toutes les classes : toute classe eest d´riv´e directement ou non de la classe Object. Pour tout objet instanci´, le e e econstructeur de sa classe est invoqu´, lequel,` son tour, invoque le constructeur de sa e aclasse de base et ainsi de suite. Cette cascade d’appels s’arrˆte ´videmment lorsqu’on e eatteint le constructeur de la classe Object.4.4 Red´finition et surcharge e4.4.1 Red´finition des champs e Les champs d´clar´s dans la classe d´riv´e sont toujours des champs suppl´- e e e e ementaires. Si l’on d´finit un champ ayant le mˆme nom qu’un champ de la classe e ede base, il existera alors deux champs de mˆme nom. Le nom de champ d´signera e ecelui d´clar´ dans la classe d´riv´e. Pour avoir acc`s ` celui de la classe de base, il e e e e e afaudra changer le type de la r´f´rence pointant sur l’objet, ou utiliser super. Voici eeun exemple :class A { public int i; ...}class B extends A { public int i;Support de cours programmation Java - GBM2 - 33-

×