Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
El Mostafa DAOUDI
Dpartement de Mathmatiques et dInformatique, Facult des Sciences Universit Mohammed Premier Oujda m.daoudi@fso.ump.ma Septembre 2012
El Mostafa DAOUDI- p. 1
Quelques Rfrences: - Cours JAVA SMI S5, Daoudi 2011/2012 Livre: - Titre: Programmer en JAVA , AuteurClaude Delnoy, Editeur: Eyrolles - Thinking in Java, Bruce Eckel Ressources Internet: - http ://www.java.sun.com - Richard Grin: http://deptinfo.unice.fr/~grin - Cours Mickal BARON - 2007 - Cours Interface graphique en Java API swing, Juliette Dibie-Barthlemy mai 2005 - ..
El Mostafa DAOUDI- p. 2
En Java, tout se trouve dans une classe. Il ne peut y avoir de dclarations ou de code en dehors du corps d'une classe. La classe elle mme ne contient pas directement du code.
Elle contient des attributs. et des mthodes (quivalents des fonctions).
Le code se trouve exclusivement dans le corps des mthodes, mais ces dernires peuvent aussi contenir des dclarations de variables locales (visibles uniquement dans le corps de la mthode).
El Mostafa DAOUDI- p. 4
II. Environnement de Programmation 1. Compilation La compilation dun programme Java ne traduit pas directement le code source en fichier excutable. Elle traduit dabord le code source en un code intermdiaire appel bytecode. Cest le bytecode qui sera ensuite excut par une machine virtuelle (JVM ; Java Virtual Machine). Ceci permet de rendre le code indpendant de la machine qui va excuter le programme. Sun fournit le compilateur javac avec le JDK. Par exemple,
javac MonPremProg.java
compile la classe MonPremProg dont le code source est situ dans le fichier MonPremProg.java
El Mostafa DAOUDI- p. 5
Si le fichier MonPremProg.java fait rfrence, par exemple, des classes situes dans les rpertoires /prog/exemple et /cours, alors la compilation se fait de la faon suivante:
sous windows: sous Linux: javac -classpath /prog/exemple ; /cours; MonPremProg.java javac -classpath /prog/exemple : /cours; MonPremProg.java
On peut dsigner le fichier compiler par un chemin absolu ou relatif : javac home/user2/MonPremProg.java Cette compilation cre un fichier nomm MonPremProg.class qui contient le bytecode
Si un systme possde une JVM, il peut excuter tous les bytecodes (fichiers .class) compils sur nimporte quel autre systme.
El Mostafa DAOUDI- p. 6
2. Excution du bytecode
Le bytecode doit tre excut par une JVM. Cette JVM n'existe pas; elle est simule par un programme qui lit les instructions (en bytecode) du programme .class, les traduit dans le langage machine relatif la machine sur laquelle il sera excut. Lance leur excution Pour excuter, Sun fournit le programme java qui simule une JVM. Il suffira dutiliser la commande: java MonPremProg Si des classes dautres rpertoires sont ncessaires, alors faut alors utiliser loption classpath de la mme faon que la compilation: sous windows: java -classpath /prog/exemple ; /cours MonPremProg sous Linux: java -classpath /prog/exemple : /cours MonPremProg
El Mostafa DAOUDI- p. 7
El Mostafa DAOUDI- p. 8
Dans le cas de lenvironnement JDK de SUN. Pour compiler, il suffit dutiliser la commande javac: javac MonPremProg.java Pour excuter, il suffira dutiliser la commande: java MonPremProg qui interprte le bytecode de la mthode main() de la classe MonPremProg
El Mostafa DAOUDI- p. 9
Lexcution du programme MonPremProg affiche lcran, comme rsultat, la chane de caractres: Bonjour: mon premier programme Java Ceci grce linstruction: System.out.println(" Bonjour: mon premier programme Java ");
El Mostafa DAOUDI- p. 10
De manire gnrale, dans tout programme destin tre excut doit contenir une mthode particulire nomme main() dfinie de la manire suivante:
public static void main(String args[]) { /* corps de la mthode */ }
Le paramtre args de la mthode main() est un tableau dobjets de type String. Il est exig par le compilateur Java. La classe contenant la mthode main() doit obligatoirement tre public afin que la machine virtuelle y accde. Dans lexemple prcdent, le contenu de la classe MonPremProg est rduit la dfinition dune mthode main().
El Mostafa DAOUDI- p. 11
Un fichier source peut contenir plusieurs classes mais une seule doit tre public (dans lexemple cest la classe: MonPremProg ). Le nom du fichier source est identique au nom de la classe publique qu'il contient, suivi du suffixe .java. Dans lexemple prcdent, le fichier source doit obligatoirement avoir le nom: MonPremProg.java
El Mostafa DAOUDI- p. 12
El Mostafa DAOUDI- p. 13
Intrts de la Programmation Oriente Objet (POO) Programmation modulaire: Faciliter de la rutilisation de code. Encapsulation (Principe de la POO) et abstraction (proche du monde rel): Regrouper les caractristique dans une classe. Cacher les membres dune classe: choix dans les niveaux de confidentialit. Programmation par composants (chaque portion de code est isole) : Faciliter de lvolution du code. Les grands principes de la POO - lencapsulation - Lhritage - Le Polymorphisme
El Mostafa DAOUDI- p. 14
Les membres dune classe: - Champs (appels aussi attributs ou donnes membres): lensemble des membres dfinissent ltat dun objet (chaque objet a ses donnes propres). - Mthodes (appels aussi fonctions membres ou comportement): dfinissent un ensemble doprations applicables lobjet (on manipule les objets par des appels de ses mthodes). Lensemble des mthodes est appel linterface de lobjet. Une interface dfinit toutes les oprations quon peut appliquer lobjet (dfinit tous ce quil est possible de "faire" avec un objet).
El Mostafa DAOUDI- p. 16
Exemple: Rectangle est une classe utilise pour crer des objets reprsentant des rectangles particuliers. Elle regroupe 4 donnes de type rel qui caractrisent le rectangle: longueur , largeur et origine (x,y) (la position en abscisse et en ordonne de son origine). On suppose quon peut effectuer les oprations de dplacement et de calcul de la surface du rectangle. Les symboles + et sont les spcificateurs daccs (voir plus loins) Exemple (notation UML)
Rectangle - longueur - largeur -x -y + deplacer(int,int) + calculSurface() Nom de la classe Description des attributs
Cration dune classe Pour crer une classe (un nouveau type dobjets) on utilise le mot cl class. La syntaxe pour crer une classe de nom ClasseTest est la suivante: class ClasseTest{ /* ClasseTest est le nom de la classe crer */ /* Corps de la classe - Description des attributs (donnes membres) - Description des mthodes */ } Pour les commentaire on utilise: // pour un commentaire sur une seule ligne /* pour un commentaire tal sur plusieurs lignes. Il doit terminer avec */
El Mostafa DAOUDI- p. 18
Exemple: Soit Rectangle une classe utilise pour crer des objets reprsentant des rectangles particuliers. Un objet de type Rectangle est caractris par: La longueur de ses cots. Sa position dans le plan: cette position peut tre dfinie par la position de son centre dans le plan. On suppose aussi que les cots du rectangle sont parallles laxe des abscisses et laxe des ordonnes. On suppose quon peut effectuer sur un objet de type rectangle, les oprations suivantes: calcul de la surface dplacement dans le plan
El Mostafa DAOUDI- p. 19
Attributs
Mthodes
class Rectangle { int longueur; int largeur; int x; int y; void deplacer(int dx, int dy) { x = x+ dx; y = y + dy; } int calculSurface() { return longueur * largeur; } }
El Mostafa DAOUDI- p. 20
10
III. Cration et manipulation dObjets 1. Introduction Une fois la classe est dfinie, on peut crer des objets (variables). Donc chaque objet est une variable dune classe. Il a son espace mmoire, il admet une valeur propre chaque attribut. Les valeurs des attribut caractrisent ltat de lobjet. Lopration de cration de lobjet est appele une instanciation. Un objet est aussi appel une instance d'une classe. Il est rfrenc par une variable ayant un tat (ou valeur). On parle indiffremment dinstance, de rfrence ou dobjet
El Mostafa DAOUDI- p. 21
Une classe permet dinstancier plusieurs objets. les attributs et les mthodes dun objet (une instance dune classe) sont les mmes pour toutes les instances de la classe. Les valeurs des attributs sont propres chaque objet. Par exemple rectangleR1 est une instance de la classe Rectangle
Rectangle instance rectangleR1 - longueur =10 - largeur =2 - x=0 - y=0 - : private
El Mostafa DAOUDI- p. 22
11
Les valeurs des attributs peuvent tre diffrents. Chaque instance dune classe possde ses propres valeurs pour chaque attribut (chaque objet a son propre tat).
Rectangle instance
El Mostafa DAOUDI- p. 23
12
Attention: - La dclaration dune variable de type primitif rserve un emplacement mmoire pour stocker la variable. - Par contre, la dclaration dun objet, ne rserve pas une place mmoire pour lobjet, mais seulement un emplacement pour une rfrence cet objet. les objets sont manipuls avec des rfrences
El Mostafa DAOUDI- p. 25
Exemple: Considrons la classe ClasseTest class ClasseTest { // corps de la classe ClasseTest } linstruction: ClasseTest objA; - Dclare objA comme objet (variable) de type ClasseTest - Dfinit le nom et le type de lobjet. - Dclare que la variable objA est une rfrence un objet de la classe ClasseTest. Cela veut dire quon va utiliser une variable objA qui rfrencera un objet de la classe ClasseTest. - Aucun objet nest cr: un objet seulement dclar, vaut null .
objA null
El Mostafa DAOUDI- p. 26
13
2.2. Cration dun objet Aprs la dclaration dune variable, on doit faire la cration (et allocation) de la mmoire de lobjet qui sera rfrenc par cette variable. - La cration doit tre demand explicitement dans le programme en faisant appel loprateur new. - La cration rserve de la mmoire pour stocker lobjet et initialise les attributs. Lexpression new NomDeClasse() cre un emplacement pour stocker un objet de type NomDeClasse. Important: - avant dutiliser un objet on doit le crer. - la dclaration seule dun objet, ne nous permet pas de lutiliser.
El Mostafa DAOUDI- p. 27
Exemple class ClasseTest { /* Corps de la classe ClasseTest */ } ClassTest objA ; /* dclare une rfrence sur lobjet objA */ objA= new ClasseTest(); /* cre un emplacement pour stocker lobjet objA */ Les deux expressions prcdentes peuvent tre remplaces par : ClassTest objA = new ClasseTest(); En gnrale: 1. Chaque objet met ses donnes membres dans sa propre zone mmoire. 2. En gnral, les donnes membres ne sont partages entre les objets de la mme classe.
El Mostafa DAOUDI- p. 28
14
Exemple : Considrons la classe rectangle public class Rectangle{ int longueur; int largeur; int x; int y; public static void main (String args[]) { Rectangle rectangleR1; /* dclare une rfrence sur lobjet rectangleR1 */ rectangleR1 = new Rectangle(); /* cration de lobjet rectangleR1 */ // rectangle R1 est une instance de la classe Rectangle // Les deux expressions peuvent tre remplaces par : // Rectangle rectangleR1=new Rectangle(); } }
El Mostafa DAOUDI- p. 29
2.3. Initialisation par dfaut La cration dun objet entrane toujours une initialisation par dfaut de tous les attributs de lobjet mme si on ne les initialise pas:
---------------------------------------------------------------Type | Valeur par dfaut | ---------------------------- |-----------------------------------| boolean | false | char | \u0000 (null) | byte | (byte) 0 | short | (short) 0 | int | 0 | long | 0L | float | 0.0f | double | 0.0 | Class | null | ------------------------------------------ ----------------------|
El Mostafa DAOUDI- p. 30
15
Attention: Cette garanti dinitialisation par dfaut ne sapplique pas aux variables locales (variables dclare dans un bloc: par exemple les variables locales dune mthode) (voir plus loin).
El Mostafa DAOUDI- p. 31
16
- Liste des paramtres : liste des arguments de la mthode. Elle dfinit les types et les noms des informations quon souhaite passer la mthode lors de son appel. - typeRetour : cest le type de la valeur qui sera retourne par la mthode aprs son appel. Si la mthode ne fournit aucun rsultat, alors typeRetour est remplac par le mot cl void. Remarque: Dans le cas o la mthode retourne une valeur, la valeur retourne par la fonction doit tre spcifie dans le corps de la mthode par linstruction de retour:
return expression; ou return; // (possible uniquement pour une fonction de type void)
El Mostafa DAOUDI- p. 33
2. Passage des paramtres Le mode de passage des paramtres dans les mthodes dpend de la nature des paramtres : - par valeur pour les types primitifs. - par valeur des rfrences pour les objets: la rfrence est passe par valeur (i.e. le paramtre est une copie de la rfrence), mais le contenu de lobjet rfrenc peut tre modifi par la fonction (car la copie de rfrence pointe vers le mme objet) :
El Mostafa DAOUDI- p. 34
17
Exemple: class ClasseTest { void methode1(int j){ j+=12; } void methode2() { int j = 3; methode1(j); System.out.println(j=" + j); // j=3 } }
El Mostafa DAOUDI- p. 35
3. Surcharge des mthodes On parle de surcharge (en anglais overload) lorsquun mme symbole possde plusieurs significations diffrentes entre lesquelles on choisit en fonction du contexte. Par exemple la symbole + dans linstruction a+b dpend du type des variables a et b. En Java , on peut surcharger une mthode, cest--dire, dfinir (dans la mme classe) plusieurs mthodes qui ont le mme nom mais pas la mme signature (diffrencies par le type des arguments) Remarques: La signature dune mthode est: le nom de la mthode et lensemble des types de ses paramtres.
18
Considrons lexemple suivant ou la classe ClasseTest est dote de 2 mthodes calcMoyenne: - La premire a deux arguments de type double - La deuxime a trois arguments de type double
El Mostafa DAOUDI- p. 37
class ClasseTest{ public double calcMoyenne(double m1, float m2) { return (m1+m2)/2; } public float calcMoyenne(double m1, double m2, double m3) { return (m1+m2+m3)/3; } } public class TestSurcharge { public static void main(String[] args) { ClasseTest objA; System.out.println(Moy1="+objA.calcMoyenne(10., 12.2)); System.out.println(Moy2="+objA.calcMoyenne(10., 12.6, 8.)); } }
El Mostafa DAOUDI- p. 38
19
Une fois lobjet est cr, on peut accder ses donnes membres de la manire suivante: on indique le nom de lobjet suivi par un point, suivi par le nom de lattribut comme suit: nomObjet.nomAttibut o:
nomObjet = nom de la rfrence lobjet (nom de lobjet) nomAttribut =nom de la donne membre (nom de lattribut).
Exemple: pour les objets objA et objB de la classe ClassTest qui sont dj crs: objA.b=true; // affecte true lattribut b de lobjet objA. objA.x=2.3; // affecte le rel 2.3 lattribut x de lobjet objA. objB.b=false; // affecte false lattribut b de lobjet objB. objB.x=0.35; // affecte le rel 0.35 lattribut x de lobjet objB.
El Mostafa DAOUDI- p. 40
20
2. Accs aux mthodes: appels des mthodes Les mthodes ne peuvent tre dfinies que comme des composante dune classe. Une mthode ne peut tre appele que pour un objet. Lappel dune mthode pour un objet se ralise de la manire suivante: on indique le nom de lobjet suivi dun point, suivi du nom de la mthode et de sa liste darguments: nomObjet.nomMethode(arg1, .). o nomObjet: nom de lobjet nomMethode: nom de la mthode.
El Mostafa DAOUDI- p. 41
Exemple 1: soit f () une mthode qui prend un paramtre de type double et qui retourne une valeur de type int.
class ClasseTest { // attributs int f(double x) { int n; // corps de la fonction f() return n; } }
ClasseTest objA = new ClasseTest(); // cr un objet objA; int j = objA.f(5.3); // affecte j la valeur retourne par f()
El Mostafa DAOUDI- p. 42
21
Exemple 2: Considrons la classe Rectangle dote de la mthode initialise qui permet daffecter des valeurs lorigine (aux attributs x et y). public class Rectangle{ int longueur, largeur; int x,y; void initialise_origine(int x0, int y0) { x=x0; y=y0; } public static void main (String args[]) { Rectangle r1; r1.longueur=4; r1.largeur=2; r1. initialise_origine(0,0); // affecte 0 aux attribut x et y // Affiche lerreur : NullPointException() /* En effet lobjet r1 est seulement dclar. Il nest pas encore cr. Avant de lutiliser, il faut tout dabord le crer */ } }
El Mostafa DAOUDI- p. 43
Exemple : cre lorigine un rectangle r1 de longueur 4 et de largeur 2 public class Rectangle{ int longueur, largeur; int x,y; void initialise_origine(int x0, int y0) { x=x0; y=y0; } public static void main (String args[]) { Rectangle r1=new Rectangle (); r1.longueur=4; r1.largeur=2; r1. initialise_origine(0,0); } }
El Mostafa DAOUDI- p. 44
22
VI. Encapsulation
Une classe permet denvelopper les objets : Un objet est vu par le reste du programme comme une entit opaque. L'enveloppement [wrapping] des attributs et mthodes l'intrieur des classes plus (+) le contrle d'accs aux membre de lobjet est appel encapsulation. Le contrle d'accs aux membres de lobjet est appel cacher l'implmentation: Les membres publiques sont vus de l'extrieur mais les membres privs sont cachs. L'encapsulation est un mcanisme consistant rassembler les donnes et les mthodes au sein d'une structure en cachant l'implmentation de l'objet, c'est--dire en empchant l'accs aux donnes par un autre moyen que les services proposs.
El Mostafa DAOUDI- p. 45
Possibilit daccder aux attributs dune classe Java mais ceci nest pas recommand car contraire au principe dencapsulation: Les donnes (attributs) doivent tre protgs. Accessibles pour lextrieur par des mthodes particulires (par exemple slecteurs). Plusieurs niveaux de visibilits peuvent tre dfinis en prcdant, la dclaration dun attribut, dune mthode ou dun constructeur, par un modificateur (spcificateur daccs) : private, public ou protected.
El Mostafa DAOUDI- p. 46
23
Spcificateurs daccs: L'encapsulation permet de dfinir 3 niveaux de visibilit des lments de la classe. Ces 3 niveaux de visibilit (public, private et protected) dfinissent les droits d'accs aux donnes suivant le type daccs:
Membres privs : un membre d'une classe C dont la dclaration est prcde par le modificateur private est considr comme un membre priv. Il n'est accessible que depuis lintrieur. Cest dire seulement les mthode de la classe elle-mme (classe C) qui ont le droit daccder ce membre. Accs par dfaut: lorsquaucun spcificateur daccs nest mentionn devant un membre de la classe C, on dit que ce membre a l'accessibilit par dfaut. Ce membre n'est accessible que depuis la classe C et depuis les autres classes du paquet auquel C appartient (classes du mme paquetage que la classe C).
El Mostafa DAOUDI- p. 47
Membres protgs : un membre d'une classe C dont la dclaration est prcd par le modificateur protected se comporte comme private avec moins de restriction: il n'est accessible que depuis: - la classe C, - les classes du paquet auquel C appartient (les classes du mme paquetage que la classe C) - et les sous-classes, directes ou indirectes, de C. Attention: une classe drive a un accs aux membres protected mais pas aux membres private. Membres publics : un membre de la classe C dont la dclaration commence par le modificateur public est accessible partout o C est accessible. Il peut tre accder depuis lextrieure (par une classe quelconque).
El Mostafa DAOUDI- p. 48
24
} }
objA.y=3; // ne compile pas car accs depuis lexterieur un attribut priv: private y
El Mostafa DAOUDI- p. 49
25
VII. Mthodes daccs aux valeurs des variables depuis lextrieur Comment peut on accder la valeur dune variable protge ?? Considrons la classe etudiant qui a les champs nom et prenom private. Exemple: class Etudiant { private String nom, prenom; public Etudiant(String st1, String st2){ nom=st1; prenom=st2; } } public class MethodeStatic{ public static void main(String[] argv) { Etudiant e= new Etudiant("Mohammed","Ali"); System.out.println("Nom = "+e.nom); // ne compile pas car le champs nom est priv /* comment faire pour afficher le nom de ltudiant e; ?? } }
El Mostafa DAOUDI- p. 51
Pour afficher la valeur de lattribut nom (champs private), on dfinie Un accesseur (mthode getNom) qui est une mthode permettant de lire, depuis lextrieur, le contenu d'une donne membre protge. Exemple: class Etudiant { private String nom, prenom; public Etudiant(String nom, String Prenom){ this.nom=nom; this.prenom=prenom; } public String getNom (){ return nom; } public String getPrenom (){ return prenom } }
El Mostafa DAOUDI- p. 52
26
public class MethodeStatic{ public static void main(String[] argv) { Etudiant e= new Etudiant("Mohammed","Ali"); e.initialise("Mohammed","Ali"); System.out.println("Nom = "+e.getNom()); System.out.println("Prenom = "+e.getPrenom()); } }
El Mostafa DAOUDI- p. 53
} }
El Mostafa DAOUDI- p. 54
27
Pour modifier la valeur de lattribut nom (champs private), on dfinie Un modificateur (mutateur) qui est une mthode permettant de modifier le contenu d'une donne membre protge. Exemple: class Etudiant { private int cne; public void setCNE (int cne){ this.cne=cne; } } public class MethodeStatic{ public static void main(String[] argv) { Etudiant e= new Etudiant(); e.setCNT(23541654); } }
El Mostafa DAOUDI- p. 55
VIII. Autorfrences: emploi de this - Possibilit au sein dune mthode de dsigner explicitement l'instance courante (lobjet courant): faire rfrence lobjet qui a appel cette mthode. - Par exemple pour accder aux attributs "masqus" les paramtres de la mthode. class ClasseA { . public void f(.) { // ici lemploi de this dsigne la rfrence lobjet // ayant appel la mthode f } }
El Mostafa DAOUDI- p. 56
28
Exemple:
class Etudiant { private String nom, prenom; public initialise(String st1, String st2) { nom = st1; prenom = st2; } } Comme les identificateurs st1 et st2 sont des arguments muets pour la mthode initialise(), alors on peut les noter nom et prenom qui nont aucune relation avec les champs private nom et prenom. Dans ce cas la classe Etudiant peut scrire comme suit:
El Mostafa DAOUDI- p. 57
class Etudiant { private String nom, prenom; public initialise(String nom, String prenom){ this.nom=nom; this.prenom=prenom; } }
El Mostafa DAOUDI- p. 58
29
IX. Champs et mthodes de classe 1. Champs de classe (variable de classe) Considrons la dfinition simpliste suivante: class ClasseTest { int n; double x; } Chaque objet de type ClasseTest possde ses propres valeurs (ses propres donnes) pour les champs n et x. Les valeurs des champs ne sont pas partages entre les objets. Exemple : on cr deux objets diffrents instances de la classe ClassTest: ClasseTest objA1=new ClasseTest(); ClasseTest objA2= new ClasseTest(); objA1.n et objA2.n dsignent deux donnes diffrentes. objA1.x et objA2.x dsignent aussi deux donnes diffrents.
El Mostafa DAOUDI- p. 59
Certaines attributs peuvent tre partags par toutes les instances dune classe. Cest--dire ils peuvent tre dfinis indpendamment des instances (objets): Par exemple: le nombre dtudiants = le nombre dobjets tudiants crs. Les attributs qui peuvent tre partags entre tous les objets sont nomms champs de classe ou variables de classe. Ils sont comparables aux variables globales . Ces variables nexistent quen un seul exemplaire. Elles sont dfinies comme les attributs mais prcds du mot-cl static.
El Mostafa DAOUDI- p. 60
30
Exemple: Considrons la classe: class ClasseTest { static int n; // la valeur de n est partage par toutes les instances double y; } ClasseTest objA1=new ClasseTest(), objA2=new ClasseTest(); Ces dclarations cres deux objets (instances) diffrents: objA1 et objA2. Puisque n est un attribut prcd du modificateur static , alors il est partag par tous les objets en particulier les objets objA1 et objA2 partagent la mme variable n. objA1.n et objA2.n dsignent la mme donne. La valeur de lattribut n est indpendante de linstance (lobjet). Pour accder au champs statique n, on utilise le nom de la classe ClasseTest.n // champs (statique) de la classe ClasseTest
El Mostafa DAOUDI- p. 61
Exemple1:
class ClasseTest { int n; double y; } public class MethodeStatic{ public static void main(String[] argv) { ClasseTest objA1=new ClasseTest(); objA1.n+=4; // La valeur de lattribut n de lobjet objA1 vaut 4; ClasseTest objA2=new ClasseTest(); // objA2.n = ? /* la valeur de lattribut n de lobjet objA2 vaut 0. initialisation par dfauts des attributs. */ } }
El Mostafa DAOUDI- p. 62
31
Exemple2:
class ClasseTest { static int n; // la valeur de n est partage par toutes les instances float y; } public class MethodeStatic{ public static void main(String[] argv) { ClasseTest objA1=new ClasseTest(); objA1.n+=4; // objA1.n vaut 4; // quivalent ClasseTest.n=4; ClasseTest objA2=new ClasseTest(); // objA2.n = ? // objA2 vaut 4 car champs statique . } }
El Mostafa DAOUDI- p. 63
2. Mthodes de classe Ce sont des mthodes qui ont un rle indpendant dun objet spcifique. Elles excutent une action indpendante dune instance particulire de la classe La dclaration dune mthode de classe se fait laide du mot cl static. Lappelle dune telle mthode ne ncessite que le nom de la classe correspondante. Important: Une mthode de classe ne pourra pas accder des champs usuels (champs non statiques).
El Mostafa DAOUDI- p. 64
32
Exemple: class ClasseTest{ private static int n; // champs de classe private float x; // champs usuel public static void f() { // mthode de clase
/* ici (dans le corps de la mthode f(), on ne pas accder au champs x, champs usuel Par contre on peut accder au champs statique n. */
} }
El Mostafa DAOUDI- p. 65
X. Le mot cl final Lattribut final indique que la valeur de la variable ne peut tre modifie : on pourra lui donner une valeur une seule fois dans le programme. Variable dinstance final Une variable dinstance final est une constante pour chaque objet. Remarques: - une variable dinstance final peut avoir 2 valeurs diffrentes pour 2 objets diffrents. - une variable d'instance final peut ne pas tre initialise sa dclaration mais elle doit avoir une valeur la sortie de tous les constructeurs.
El Mostafa DAOUDI- p. 66
33
Variable locale final Considrons une variable locale prcd par le mot cl final. Si la variable est dun type primitif, sa valeur ne pourra pas changer. Si la variable rfrence un objet, elle ne pourra pas rfrencer un autre objet mais ltat de lobjet peut tre modifi Exemple: final Etudiant e = new Etudiant("Mohammed", "Ali");
...
e.nom = "Ahmed"; // ok, changement de ltat de lobjet e e.setCNE(32211452); // ok, changement de ltat de lobjet e e = new Etudiant("Ahmed"); /* Interdit car cette instruction indique que e rfrence un autre objet */
El Mostafa DAOUDI- p. 67
Constantes de classe Usage Ce sont des variables de classes dclares avec le mot-cl final Ce sont des constantes lies une classe Elles sont crites en MAJUSCULES Pour y accder, il faut utiliser non pas un identificateur dobjet mais le nom de la classe Exemple: public class Galerie { public static final int MASSE_MAX = 150; } if (maVoiture.getWeightLimite() <= Galerie.MASSE_MAX) {...}
El Mostafa DAOUDI- p. 68
34
El Mostafa DAOUDI- p. 69
public class Point{ private int x; // abscisse private int y; // ordonne public void initialise (int abs,int ord){ x=abs; y=ord; } public void deplace (int dx, int dy){ x+=dx; y+=dy; } public void affiche (){ System.out.println(" abscisse : "+ x + " ordonne : " + y); } }
El Mostafa DAOUDI- p. 70
35
public class TstPoint{ public static void main (String args[]) { Point pA=new Point(); // cration de lobjet pA pA.initialise(1,1); // initialisation de lobjet pA pA.deplace(2,0); Point pB=new Point(); // cration de lobjet pB pB.initialise(2,3); // initialisation de lobjet pB pB.affiche(); } }
El Mostafa DAOUDI- p. 71
Remarque: La cration et linitialisation des attributs sont spares: - Tout dabord on cre lobjet (linstance). - Ensuite, dans notre exemple, pour chaque instance on appelle la mthode initialise() pour initialiser lobjet ainsi crer. On personnalise ltat de lobjet - Si on nappelle pas la mthode initialise, lobjet de type Point ainsi crer ne sera pas initialis. Pas derreur la compilation mais risque de problme smantique : toute manipulation de lobjet, utilisera les valeurs de linitialisation par dfaut. Crer un objet, ne garanti pas son initialisation
El Mostafa DAOUDI- p. 72
36
instructions excuter la cration des objets, en particulier : linitialisation des attributs. La cration et linitialisation peuvent tre unifies Quand une classe possde un constructeur, Java lappel automatiquement toute cration dobjet avant quil ne puisse tre utilis. Chaque classe a un ou plusieurs constructeurs qui servent crer les instances initialiser ltat de ces instances Rgles de dfinition dun constructeur : un constructeur: porte le mme nom que la classe. na pas de type retour. peut disposer dun nombre quelconque darguments (ventuellement aucun).
El Mostafa DAOUDI- p. 73
Exemple: Considrons la classe point et transformons la mthode initialise en un constructeur. public class Point{ private int x; // abscisse: variable dinstance private int y; // ordonne: variable dinstance public Point (int abs, int ord) { // Constructeur, remplace initialise x=abs; y=ord; } public void deplace (int dx, int dy){ x+=dx; y+=dy; } public void affiche (){ System.out.println(" abscisse : "+ x + " ordonne : " + y); } }
El Mostafa DAOUDI- p. 74
37
public class TestPoint{ public static void main (String args[]) { Point pA=new Point(1,1); // cration et initialisation de lobjet pA pA.deplace(2,0); Point pB=new Point(2,3); // cration et initialisation de lobjet pB pB.affiche(); } } Remarque: - Les instructions: Point pA=new Point(); et pA.initialise(1,1) ; sont remplaces par: Point pA = new Point(1,1); Attention: Linstruction: Point pA = new Point(); ne convient plus car le constructeur a besoin de deux arguments
El Mostafa DAOUDI- p. 75
Un autre exemple public class Etudiant { private String nom, prenom; private int codeNatEtudiant;
// Variables dinstance
public Etudiant(String n, String p) { // dfinition dun constructeur nom = n; prenom = p; } public void setCNE (int cne) { codeNatEtudiant = cne; } public static void main(String[] args) { Etudiant e; e = new Etudiant("Mohammed", "Ali"); // cration d'une instance e.setCNE(23456765); } }
El Mostafa DAOUDI- p. 76
38
5. Un constructeur ne peut pas tre appel de la mme manire que les autres mthodes. Par exemple: Point a=new Point(1,1); // ok car Point possde un constructeur a.Point (2,3); // Interdit car Point() est un constructeur et // non une mthode classique. 6. Si un constructeur est dclar private, dans ce cas il ne pourra plus tre appel de lextrieur, cest--dire il ne pourra pas tre utilis pour instancier des objets. Exemple: class ClasseA{ private ClasseA() { } // constructeur prive sans arguments } ClasseA a=new ClasseA(); // erreur, car constructeur ClasseA() est priv
El Mostafa DAOUDI- p. 78
39
IV. Initialisation des attributs On distingues 3 types dinitialisation des attributs: 1. Initialisation par dfaut: les champs dun objet sont toujours initialiss par dfaut. ------------------------------------ |--------------------------------Type de lattribut ( champ) | Valeur par dfaut ------------------------------------ |-------------------------------boolean | false char | caractre de code nul int, byte, short, int long | 0 float, double | 0.f ou 0. class | null --------------------------------------------------------------------El Mostafa DAOUDI- p. 79
2. Initialisation explicite des champs dun objet: Un attribut peut tre initialis pendant sa dclaration. Par exemple: class ClasseTest{ private int n=10; private int p; } 3. Initialisation par le constructeur:
On peut aussi initialiser les attributs lors de lexcution des instructions du corps du constructeur. Exemple du constructeur Point(int,int) voir avant: Point pA=new Point(8,12);
El Mostafa DAOUDI- p. 80
40
Dune manire gnrale, la cration dun objet entrane toujours, par ordre chronologique, les oprations suivantes:
- Linitialisation par dfaut de tous les champs de lobjet. - Linitialisation explicite lors de la dclaration du champ. - Lexcution des instructions du corps du constructeur.
El Mostafa DAOUDI- p. 81
Exemple: Considrons la classe suivante: class ClasseTest{ public ClasseTest () { } // Constructeur ClasseTest private int n=10; private int p; } Linstruction suivante: ClasseTest objA=new ClasseTest(); Entrane successivement: 1. initialisation implicite (par dfaut) des champs n et p de lobjet objA 0 2. initialisation explicite: On affecte au champ n la valeur 10 (la valeur figurant dans sa dclaration). 3. excution des instruction du constructeur: Le corps du constructeur nest excut quaprs linitialisation par dfaut et linitialisation explicite.
El Mostafa DAOUDI- p. 82
41
class ClasseA { public ClasseA() { // ici n =20, p =10 et np = 0 np=n*p; n=5; } private int n=20, p=10; private int np; } public class Init { public static void main (String args[]) { ClasseA objA=new ClasseA(); // ici objA.n =5, objA.p = 10, mais objA.np = 200 } } Aprs appel du constructeur on a: n=5 , p=10 , np = 200
El Mostafa DAOUDI- p. 83
42
public class TestEtudiant { public static void main (String[] args) { Etudiant e1, e2; e1 = new Etudiant("Mohammed", "Ali"); e2 = new Etudiant("Ouardi", " fatima", 22564321); } }
El Mostafa DAOUDI- p. 85
Il est possible, quau sein dun constructeur, on peut appeler un autre constructeur de la mme classe. Pour faire on fait appel au mot cl this qui est utilis cette fois comme nom de mthode. Supposons que la classe Point admet deux constructeurs. Un constructeur initialise lorigine (au point (0,0)) et un autre initialise un point quelconque.
El Mostafa DAOUDI- p. 86
43
44
La syntaxe de la dclaration : type identificateur; O - identificateur est une suite de caractres pour dsigner les diffrentes entits manipuls par un programme: variables, mthode, classe, objet, - type dsigne le type de la variable dclare Remarque: concernant les identificateurs: - Tous les caractres sont significatifs. - On fait la diffrence entre les majuscules et les minuscules. - Mots rservs: un identificateur ne peut pas correspondre un mot rserv du langage (par exemple if, else, while, ..., ). Exemple: int val; double delta; Rectangle r1; /* Rectangle est une classe */
El Mostafa DAOUDI- p. 89
El Mostafa DAOUDI- p. 90
45
II. Style de programmation non standard Conventions de nommage en Java: ne sont pas obligatoire, mais fortement recommandes (cest essentiel pour la lisibilit du code et sa maintenance). Identificateur: pas d'emploi de $ (et de caractres non ASCII) Nom de classe : Si le nom de la classe est compos de plusieurs mots, ils sont accols (on ne les spare pas avec le trait _ soulign). Commencez chaque mot par une majuscule Exemple: HelloWorld, ClasseTest, MonPremierProgramme.
El Mostafa DAOUDI- p. 91
Nom de variable ou mthode : Si le nom est compos dun seul mot: la premire lettre est minuscule. Si le nom est compos par plusieurs mots, ils sont accols et respecte la rgle suivante: La premire lettre du premier mot est minuscule. Les premires lettre des autres mots sont majuscules Exemple: maPremiereNote, initialiseAttribut(), calculTaux(), main(), objEtudiant, Les constantes: majuscules et sparation des mots par _ : VALEUR_MAX; Usage non recommand : mapremierevariable ma_premiere_variable
El Mostafa DAOUDI- p. 92
46
Les commentaires Sur une seule ligne : style C++ // Ceci un commentaire int taux = 75; // taux de russite Sur plusieurs lignes : style C /* Premire ligne du commentaire suite du commentaire */
El Mostafa DAOUDI- p. 93
Mise en page des programmes La mise en page dun programme Java est libre. - Une instruction peut tre tendue sur plusieurs lignes. - Une ligne peut comporter plusieurs instructions Emploi du code Unicode: Java utilise le codage Unicode, qui est bas sur 2 octets (16 bits), par consquent on peut coder 65 536 symboles, ce qui permet de couvrir la plus part des symboles utiliss dans le monde. Pour assurer la portabilit, le compilateur commence par traduire le fichier source en Unicode. On peut, par exemple, utiliser lidentificateur lment: int lment; On peut aussi utiliser le code Unicode dun caractre (mais viter pour la lisibilit) de la manire suivante: \uxxxx reprsente le caractre ayant comme code Unicode la valeur xxxx. Par exemple \u0041 reprsente le caractre A.
El Mostafa DAOUDI- p. 94
47
III. Laffectation Lopration daffectation affecte ( assigne) une valeur une variable. Elle est ralise au moyen de loprateur = . la syntaxe : identificateur = valeur ; Signifie prendre la valeur du cot droit et la copier du cot gauche. identificateur : dsigne une variable. valeur : est une constante, une variable ou une expression qui retourne une valeur du mme type que la variable rfrence par identificateur .
El Mostafa DAOUDI- p. 95
Cas des types primitifs Soient a et b de type primitif. Laffectation a=b; signifie que le contenu de b est copi dans a. Exemple: a=2; b=15; a=b; // La nouvelle valeur de a est 15 aprs affectation a et b existent et ont tous la mme valeur 15. Remarque: si ensuite on modifie le contenu de a, alors le contenu de b ne sera pas modifi.
El Mostafa DAOUDI- p. 96
48
Cas des Objets Soient objA est objB deux objets, Laffectation objA=objB; signifie quon copie la rfrence de objB dans objA. 1. Aprs affectation, les rfrences objA et objB pointent vers le mme objet rfrenc par objB. 2. Lobjet qui a t initialement rfrenc par objA existe toujours, mais on na aucun contrle sur lui (il reste inaccessible).
El Mostafa DAOUDI- p. 97
Exemple: class A { public int i; } public class TestAffectation { public static void main(String[] args) { A a=new A(); A b=new A(); a.i=6; b.i=11; a=b; // a et b contiennent la mme rfrence, on a: a.i=11 a.i=20; // b.i = 20 b.i=13; // a.i = 13 }
a= new A() a Instance a a a= b b Instance b b Instance b Instance a
b= new B()
El Mostafa DAOUDI- p. 98
49
El Mostafa DAOUDI- p. 99
1. Types primitifs
Boolen: Boolean : prend deux valeurs true ou false Caractre (un seul caractre) : char : cod sur 2 octet par le codage Unicode Nombres entiers : byte: reprsent sur 1 octet (8 bits), short: reprsent sur 2 octets (16 bits), int : reprsent sur 4 octets (32 bits), long : reprsent sur 8 octets (64 bits). Nombres virgule flottante : float : flottant (IEEE 754) 32-bit double : flottant (IEEE 754) 64-bit
El Mostafa DAOUDI- p. 100
50
b prend une des deux valeurs true ou false Cest un vritable type:
Il est retourn par les oprateurs de comparaison Il est attendu dans tous les tests
1.2. Type caractre Permet de manipuler des caractres: Java reprsente un caractre sur 2 octets (16 bits) 16-bit => 65536 valeurs : presque tous les caractres de toutes les critures. Ne sont affichables que si le systme possde les polices de caractres adquates. Une variable de type caractre est dclare par: char c1,c2; Constantes de type caractre doivent tre crites entre simples quottes . Exemple : 'a , 'Z' , E Les caractres disposant dune notation spciale.
Notation \b \t \n \f \r \" \ \\ Code Unicode 0008 0009 000a 000c 000d 0022 0027 005c Abrviation usuelle BS(Back Space) HT(Horizontal Tabulation) LF(line Feed) FF(Form Feed) CR(Cariage Return) Signification Retour arrire Tabulation horizontale Saut de ligne Saut de page Retour chariot
51
et
Constantes nombres: Une constante entire est de type int. Si elle est suffixe par L ou l alors elle est de type long. Exemple: 108 // 108 constante de type int, reprsent sur 32 bits 108L // 108 constante de type long, reprsent sur 64 bits Reprsentation en octal (8bits) et hexadcimale (16 bits). Exemple 1: 014 // 14 en octal (base 8) = 12 en dcimal 0xA7 // A7 en hexadcimal (base 16) = 167 en dcimal Conversion automatique (implicite) seulement vers les types entiers plus grands (taille plus grande). (int long, short int, byte short) et vers les types flottants.
52
53
Constantes nombres
Une constante relle est par dfaut elle est de type double. Pour spcifier un float, il faut la suffixe par F ou f . Conversion automatique (implicite) : seulement float double Exemple: .567e2 // 56,7 de type double 5.123E-2F // 0,05123 de type float float x=2.5f //ok double y = 2.5; //ok float x = 2.5; // Erreur: conversion double float
2. Type objet: Constante null null : valeur d'une "rfrence vers rien" (pour tous types de rfrences). Elle indique quune variable de type non primitif ne rfrence rien) ; convient pour tous les types non primitifs.
54
3. Transtypage
Java est un langage fortement typ Dans certains cas, il est ncessaire de forcer le programme changer le type dune expression. On utilise pour cela le cast (transtypage) : (type-forc) expression Exemple: int i=13; // i cod sur 32 bit; 13 constante , par dfaut de type int byte b=i; // Erreur: pas de conversion implicite int byte Pour que a marche, on doit faire un caste (un transtypage) cest-dire on doit forcer le programme changer le type de int en byte. byte b=(byte)i; // de 32 bits vers 8 bit. b vaut 13 cod sur 8 bits
Casts autoriss En Java, deux seuls cas sont autoriss pour les casts : entre types primitifs, entre classes mre/anctre et classes filles.
55
3.1. Casts entre types primitifs Un cast entre types primitifs peut occasionner une perte de donnes sans aucun avertissement ni message d'erreur. int i=13; // i cod sur 32 bit; byte b=(byte)i; 13 cod sur 32 bits
// b vaut 13 car conversion de 32 bits vers 8 bit (On considre les 8 bits de poids le plus faible). i est un entier petit int i=256; // i cod sur 32 bit; 256 cod sur 32 bits byte b=(byte)i; // b = 0 ! Pourquoi ??? // b vaut 0 car conversion dun int vers un byte (de 32 bits vers 8 bits : on considre les 8 bits de poids le plus faible). i est un entier grand int i = 130; b = (byte)i;
// b = -126 !
Pourquoi ???
Transtypage implicite et explicite: Une affectation types primitifs peut utiliser un cast implicite si elle ne provoque aucune perte Exemple: byte =120; // cast implicite Ne provoque pas derreur car 120 est dans max/min pour les byte. byte b=130; // Provoque une erreur "cannot convert from int to byte" car 130 est hors max/min. Dans ce cas le cast explicite est obligatoire. Mais attention au perte dinformation: byte b=(byte)130; // cast explicite. Ca passe la compilation mais provoque une erreur de calcul: renvoie -126. Pour une affectation non statique, le cast est obligatoire : int i = 120; byte b=i; // Provoque une erreur mme si la valeur de i est dans lintervalle max/min des byte. On doit faire un cast explicite: byte b = (byte)i ; // cast obligatoire, sinon erreur
El Mostafa DAOUDI- p. 112
56
Les casts de types flottants vers les types entiers tronquent les nombres : float x=1.99F; int i = (int)x; /* i = 1, et pas 2. On fait une troncature et non un arrondi. */ Attention: la conversion peut donner un rsultat totalement faux sans aucun avertissement ni message d'erreur : int c = (int)1e+30; // c = 2147483647 ! int x = 10, y = 3; double z; z=x/y; // donne z=3.0; car x/y donne 3 si on veut que z=3.3333.. et pas 3.0, on doit crire: z = (double)x / y; // cast de x suffit
De mme, on peut affecter un entier une variable de type nombre virgule flottante float x; int i; x=i; Un cast peut provoquer une simple perte de prcision : la conversion d'un long vers un float peut faire perdre des chiffres significatifs mais pas l'ordre de grandeur.
57
3.2. Casts entre entiers et caractres Ils font correspondre un entier un caractre qui a comme code Unicode la valeur de lentier La correspondance char int, long sobtient par cast implicite Le code dun char peut aller de 0 65 535 donc char short, byte ncessite un cast explicite (short ne va que jusqu 32 767) Les entiers sont signs et pas les char donc long, int, short ou byte char ncessite un cast explicite
El Mostafa DAOUDI- p. 115
58
short p=3; // ok car 3 est dans le max/min de short a.deplace(p); // appel deplace (short) byte b=2; } }
El Mostafa DAOUDI- p. 117
a.deplace(b);
Attention: Il peut y avoir ambigut. Supposons que la classe contient les deux mthodes deplace () suivantes: public void deplace(int dx, byte dy) { x+=dx; y+=dy; } public void deplace(byte dx, int dy) { x+=dx; } Soit la classe excutable suivante: public class Surcharge { public static void main(String arg[]) { Point a =new Point(2,4); int n; byte b; a.deplace(n,b); a.deplace(b,n); a.deplace(b,b); } }
El Mostafa DAOUDI- p. 118
59
V. Principaux oprateurs
affectation : = arithmtiques : + - * / % comparaisons : < <= > >= == boolens : && || ! ^ oprations bit--bit (sur les entiers) : & | ^ ~ << >> >>> opration et affectation simultanes : += -= *= /= %= &= |= ^= <<= >>= >>>= pr/post-incrmentation : ++ pr/post-dcrmentation : -oprateur ternaire : ?: cration tableau ou objet (allocation mmoire) : new test de type des rfrences : instanceof
El Mostafa DAOUDI- p. 119
!=
60
Remarque : La porte ( zone de validit de la dclaration) d'une variable va de sa dclaration jusqu' la fin du bloc o elle est dclare. Elle est fixe par les accolades { }.
Exemple 2: { int x=12; // x est accessible { int q; q=x+100; // x et q tous les deux sont accessibles } x=6; // x est accessible q=x+2; // Erreur: q est hors de porte }
El Mostafa DAOUDI- p. 121
Attention: Ceci nest pas permis en Java { int x=12; { int x=96; // illgale en Java, valable en C, C++ } }
61
Porte des objet : Considrons une classe nomme ClasseA et qui a une mthode publique nomme f(). objetA { Attribut1 Attribut2 ClasseA objA=new ClasseA(); . } // fin de porte objA.f(); // Erreur car la rfrence objA est hors porte. Remarque: - La rfrence ObjA disparat la fin de la porte, - Par contre lobjet qui a t rfrenc par objA existe toujours, mais on na aucun contrle sur lui (il reste inaccessible). Les objets nont pas la mme dure de vie que les types primitifs.
62
Le ramasse-miettes (garbage collector) est une tche qui travaille en arrire-plan libre la place occupe par les instances non rfrences compacte la mmoire occupe Il intervient quand le systme a besoin de mmoire ou, de temps en temps, avec une priorit faible
VII. Instructions de contrle 1. Structure alternative if else Soit exprBool une expression Boolenne qui retourne true (Vrai) ou false (faux) if (exprBool) { instructions; // excutes si exprBool retourne true } if (exprBool) { instructions1 ; } else { instructions2; }
63
} else { // ... } Remarque: Un bloc serait prfrable, mme sil ny a quune seule instruction.
El Mostafa DAOUDI- p. 127
2. Expression conditionnelle
Lexpression: expressionBoolenne ? expression1 : expression2 Est quivalente : if (expressionBoolenne) { expression1; } else { expression2; }
El Mostafa DAOUDI- p. 128
64
3. Cas multiple: Distinction de cas suivant une valeur switch(expression) { case val1: instructions; // excutes si expression ==val1 break; // Attention, sans break, les instructions du cas suivant sont excutes ! case val2: instructions; // excutes si expression ==val2 break; ... case valn: instructions; // excutes si expression ==valn break; default: instructions; // excutes si aucune des valeurs prvues break; } Expression est de type char, byte, short, ou int, ou de type numration (ou type numr dfini avec enum). Sil ny a pas de clause default, rien nest excut si expression ne correspond aucun case (aucune valeur prvue).
El Mostafa DAOUDI- p. 130
65
4. Boucles de rptitions Deux types de boucles : - Rptitions tant que while (expressionBoolenne) { instructions; // corps de de la boucle } - Rptition faire tant que : le cors de la boucle est excut au moins une fois. do { instructions; // corps de de la boucle } while (expressionBoolenne);
66
6. Interruptions des boucles Break : sortie de la boucle : sort de la boucle et continue lexcution des instructions se trouvant aprs la boucle. continue : passage l'itration suivante: interrompe litration encours et passe litration suivante break et continue peuvent tre suivis dun nom dtiquette qui dsigne une boucle englobant la boucle o elles se trouvent (une tiquette ne peut se trouver que devant une boucle)
Etiquette de boucles etiq1: while (pasFini) { // etiq1: tiquette ... for (int i=0; i < n; i++) { ... if (t[i] < 0) continue etiq1; // rexcuter partir de etiq1 ... } ... }
67
Exemple 1: float z=1.732f; System.out.print("z="); System.out.println(z); System.out.println(" et 2z= " + (2*z)); Affiche: z=1.732 et 2z= 3.464 Exemple 2:
68
2. Lecture (Saisi partir du clavier: La classe Scanner: Les mthodes de la classe Scanner les plus intressantes sont certainement : byte nextByte() : Lecture dune valeur de type byte short nextShort() : Lecture dune valeur de type short. int nextInt() : Lecture dune valeur de type int. long nextLong() : Lecture dune valeur de type long. float nextFloat() : Lecture dune valeur de type float. double nextDouble() : Lecture dune valeur de type double. String nextLine() : Lecture dune chaine jusqu une marque de fin de ligne. La marque de fin de ligne n'est pas incorpore la chane produite.
Exemple: import java.util.Scanner; public class TestScanner { public static void main(String[] args) { Scanner entree = new Scanner(System.in); System.out.print("nom et prnom? "); String nom = entree.nextLine(); System.out.print("ge? "); int age = entree.nextInt(); System.out.print("taille (en m)? "); float taille = entree.nextFloat(); System.out.println("lu: "+nom+", "+age+" ans, "+taille+" m"); } }
69
II. Dclaration et cration des tableaux 1. Dclaration : La dclaration dune rfrence un tableau prcise le type des lments du tableau. int[] tab; Ou int tab[]; Cette dernire forme permet de mlanger les tableaux de type int et les variables de type int. Exemple: int [] a, tabNotes, b; // a, tabNotes et b sont tous des tableaux de type int. double a, tabNotes[ ], b; /* a et b de type double, tabeNotes est un tableau de type double */ Attention: En java la taille des tableaux nest pas fixe la dclaration. Elle est fixe quand lobjet tableau sera effectivement cr. int[10] tabNotes; // Erreur car on a fix la taille pendant la dclaration. // Le programme ne compile pas
El Mostafa DAOUDI- p. 140
70
2. Cration: avec loprateur new - Cration aprs la dclaration int [] tab; // dclaration du tableau dentier tab tab = new int[5]; // cration et fixation de la taille du tableau - Dclaration et cration. int [] tab = new int[5]; La cration dun tableau par loprateur new: - Alloue la mmoire en fonction du type et de la taille - Initialise, par dfaut, chaque lment du tableau 0 ou false ou null, suivant le type de base du tableau.
71
Remarques:
4. Autres mthodes de cration et dinitialisation. On peut lier la dclaration, la cration et linitialisation explicite dun tableau. La longueur du tableau ainsi cre est alors calcule automatiquement daprs le nombre de valeurs donnes (Attention : cette syntaxe n'est autorise que dans la dclaration) : Cration et initialisation explicite la dclaration int tab[] = {5, 2*7, 8}; // la taille du tableau tab est fix 3 Etudiant [] etudiantsSMI = { new Etudiant("Mohammed", "Ali"), new Etudiant("Fatima", "Zahra") } // la taille du tableau etudiantsSMI est fix 2 Initialisation lors de la cration. int[] tab; tab = new int[] {6, 9, 3, 10}; // la taille du tableau est fix 4
El Mostafa DAOUDI- p. 144
72
Exemple:
public class ExempleTableau { public static void main(String[] args) { // DECLARATION double[] tab; // CREATION dun tableau de dimension 100 tab = new double[100]; // AFFECTATION DES ELEMENTS DU TABLEAU for (int i=0; i<tab.length; i++) tab[i] = 1.; // AFFICHAGE for (int i=0; i<tab.length; i++) System.out.print(tab[i]+" "); System.out.println(); } }
El Mostafa DAOUDI- p. 145
Exemple de tableau de paramtres de la ligne de commande public class TestArguments { public static void main(String[] args) { for (int i=0; i < args.length; i++) System.out.println(argument +i+ = +args[i]); } } $ javac TestArguments // compilation $ java TestArguments arg1 arg2 /* excution en passant 2 arguments (deux chaines de caractres arg1 et arg2) la ligne de commande */ Le programme affichera: argument 0 = arg1 argument 1 = arg2
El Mostafa DAOUDI- p. 146
73
74
Allocation et copie par appel de: Arrays.copyOf() ou Arrays.copyOfRange() Exemple: Soit tab un tableau dentier dj cre et initialis. Cration et initialisation du tableau t2 partir du tableau tab import java.util.Arrays; int[] t2= Arrays.copyOf(tab, 10); // 1. cre le tableau t2 // 2. affecte au tableau t2 les 10 premiers lments du tableau tab. int[] t3= Arrays.copyOfRange(tab, debut, fin); // 1. cre le tableau t3 //2. affecte t3 les lments de tab situs entre // les indices: debut et (fin-1) :
75
Exemple Considrons lexemple de la classe Etudiant. Soit setCNE(int ) une mthode de la classe Etudiant. Etudiants [] etudiantSMI = new Etudiant[100]; /* dclare un tableau de 100 tudiants. Chaque lment du tableau contient une rfrence vers un objet de type Etudiant */ etudiantSMI[0].setCNE(11225467); /* gnre une erreur, car pour le moment etudiantSMI[0] ne contient que la rfrence vers un objet de type Etudiant. Avant dutiliser lobjet etudiantSMI[0] il faut le crer. */ etudiantSMI[0] = new Etudiant(); // Cration de lobjet etudiantSMI[0] etudiantSMI[0].setCNE(11225467); // ok! Car lobjet etudiantSMI[0] est cr.
76
Attention: Pour les tableaux dobjets, la mthode equals() de la classe Arrays compare les rfrences. Exemple: Considrons la classe Point (voir TD). public class TestTableauObjet { public static void main(String[] args) { Point p1[]=new Point[2]; // p1 est tableau de Point de taille 2 Point p2[]=new Point[2]; // p2 est tableau de Point de taille 2 Point p3[]=new Point[2]; // p3 est tableau de Point de taille 2 p1[0]=new Point(1,2); p1[1]=new Point(5,8); // initialisation p2[0]=new Point(1,2); p2[1]=new Point(5,8); // initialisation boolean b1=Arrays.equals(p1,p2); // retourne false p3[0]= p1[0]; p3[1] =p1[1] boolean b2=Arrays.equals(p1,p3); // retourne true p1=p2; boolean b3=Arrays.equals(p1,p2); // retourne true } }
El Mostafa DAOUDI- p. 153
VII. Les tableaux en argument dune mthode: - Le passage des tableaux se fait par spcification du tableau comme paramtre dune mthode. - On ne doit pas spcifier la taille de chaque dimension. Cette taille peut tre obtenue dans la mthode laide de lattribut length. - Le passage des tableaux comme paramtres des mthodes se fait par rfrence (comme les objets) et non par copie (comme les types primitifs) - La mthode agit directement sur le tableau et non sur sa copie.
77
VIII. Tableaux deux dimensions - Un tableau deux dimensions, ou matrice, reprsente un rectangle compos
de lignes et de colonnes. - Si tab est un tableau deux dimensions, llment de la ligne i et de la colonne j est dsign par tab[i][j]. Dclaration int[][] notes; // dclare un tableau deux dimensions Chaque lment du tableau contient une rfrence vers un tableau Cration: On utilise lopration new de cration de tableaux. Il faut donner au moins la premire dimension
Exemple: notes = new int[30][3]; // cr un tableau de 30 tudiants, chacun a au plus 3 notes Nous pouvons considr le tableau notes comme un rectangle avec 30 lignes et 3 colonnes. Par convention, la premire dimension est celle des lignes, et la deuxime, celle des colonnes. Les indices dbutent 0. Lors de sa cration, les lments du tableau sont initialiss par dfaut. notes = new int[30][]; //cre un tableau de 30 tudiants, chacun a un nombre variable de notes Remarques: - Les tableaux plusieurs dimensions sont dfinis laide de tableaux des tableaux. Ce sont des tableaux dont les composantes sont elles-mmes des tableaux. - Un tableau deux dimensions de tailles n et m, est en ralit un tableau unidimensionnel de n lignes, o chaque ligne est un tableau de m composantes.
El Mostafa DAOUDI- p. 156
78
Dimensions du tableau Soit t un tableau a deux dimensions: t.length : donne la longueur de la premire dimension, cest--dire le nombre de lignes du tableau t. t[i].length : donne la longueur de la ligne i de t, autrement dit, le nombre de colonnes de cette ligne. Initialisation - Comme pour les tableaux une dimension, on peut faire linitialisation dune matrice par numration de ses composantes. Exemple 1: int [][] tab = { {1,2,3,4}, {5,6,8}, {9,10,11,12}}; /* cr une matrice 3 lignes (un tableau 3 composante). Chaque ligne (chaque composante) est un tableau unidimensionnelle un nombre variable de composantes: */ int [] t = tab[1]; // cre le tableau t= {5,6,8} tab[1][2] = 8;
El Mostafa DAOUDI- p. 157
Exemple 2: int[][] t; t = new int[2][]; int[] t0 = {0, 1}; t[0]= t0; // t[0] est un tableau t[1] = new int[] {2, 3, 4, 5}; // Dclaration et initialisation for (int i = 0; i < t.length; i++) { for (int j = 0; j < t[i].length; j++) { System.out.print(t[i][j] + " "); } System.out.println(); } Affiche: 0 1 2 3 4 5
79
Exemple 3:
Possibilit de forme non rectangulaire : float triangle[][]; int n; // ... triangle = new float[n][]; //cr un tableau n lignes for (int i=0; i<n; i++) { triangle[i] = new float[i+1]; // la ligne i est de dimension i } Quelques (rares) fonctions connatre sur les tableaux de tableaux : Arrays.deepEquals(); // explorer Arrays.deepToString(); // explorer
80
1. Syntaxe:
class <ClasseDerivee> extends <ClasseDeBase> Interprtation: Permet de dfinir un lien d'hritage entre deux classes: - La classe <ClasseDeBase> est le nom de la classe de base. On lappelle aussi une classe mre, une classe parente ou une super-classe. Le mot clef extends indique la classe mre. - La classe <ClasseDerivee> est le nom de la classe drive. Elle hrite de la classe <ClasseDeBase>. On l'appelle aussi une classe fille ou une sous-classe. Remarques: - On a seulement besoin du code compil de la clase de base. - Toutes les classe hritent de la classe Object. Par dfaut, on ne met pas extends Object dans la dfinition dune classe. Exemple: public class TestClasse { } // quivalent : public class TestClasse extends Objet { }
Lorsqu'une classe hrite d'une autre classe La classe drive bnficie automatiquement des dfinitions des attributs et des mthodes de la classe mre. Elle hrite de tous les attributs (y compris static) et mthodes membres de la classe mre (sauf les mthodes prives et les constructeurs) . En plus, la classe drive peut avoir des attributs et des mthodes supplmentaires correspondants sa spcificit (ses propres attributs et mthodes). Elle peut y ajouter ses propres dfinitions. redfinir des mthodes (personnaliser les mthodes): exactement le mme nom et la mme signature. surcharger des mthodes: mme nom mais pas les mmes arguments (signature).
El Mostafa DAOUDI- p. 162
81
Exemple:
class ClasseDeBase { // classe mre // Dfinition des attributs et des mthodes } class ClasseDerivee extends Classedebase{ // ClasseDerivee : Sous-classe directe de la classe ClasseDeBase // Dfinition de nouveaux attributs et mthodes (propres la classe ClasseDerivee) // Adaptation des mthodes qui sont dj dfinies dans la classe mre // ClasseDerivee hrite des mthodes et attributs de la classe ClasseDeBase } class ClasseSousDerivee extends ClasseDerivee { /* ClasseSousDerivee: Sous-classe directe de la classe ClasseDerivee et sous-classe indirecte de la classe ClasseDeBase */ // Dfinition de nouveaux attributs et mthodes (propres la classe ClasseSousDerivee) // Adaptation des mthodes qui sont dj dfinies dans les superclasses directes ou indirectes // ClasseSousDerivee hrite des mthodes et attributs des superclasses. }
Accs depuis lextrieur: Un objet (une instance ) dune classe drive peut appeler depuis lextrieur (accs depuis lextrieur) - ses propres mthodes et attributs publics et protected. - Les mthodes et attributs publics et protected de la classe de base. Accs depuis lintrieur: - Une mthode dune classe drive a accs aux membres publics et protected de sa classe de base. - Une mthode dune classe drive na pas accs aux membres prives de sa classe de base. La classe drive ne peut accder qu'aux membres (attributs ou mthodes) publics et protgs hrits.
El Mostafa DAOUDI- p. 164
82
Remarques1: Quand on crit la classe drive on doit seulement: crire le code (variables ou mthodes) li aux nouvelles possibilits: offrir de nouveaux services. redfinir certaines mthodes: enrichir les services rendus par une classe. Remarques2:
Java, ne permet pas lhritage multiple. Il permet lhritage simple uniquement: chaque classe a une et une seule classe mre dont elle hrite les variables et les mthodes. C++ permet lhritage multiple.
83
} } class ClasseDerivee1 extends ClasseDeBase { public ClasseDerivee1(int i, int j) { // constructeur de la classe drive 1 super(i+j); // appel du constructeur ClasseDeBase
System.out.println(" Classe drive1: " + i+ " , "+j);
} } class ClasseDerivee2 extends ClasseDerivee1{ public ClasseDerivee2(int i) { // constructeur de la classe drive 2 super(i , i+300); // appel du constructeur ClasseDerivee1
System.out.println(" Classe drive2: " + i);
} }
public class TestHeritage{ public static void main (String args[]) { ClasseDerivee2 objA=new ClasseDerivee2(7); } } Sortie:
84
} class ClasseDerivee extends ClasseDeBase { // Pas de constructeur . } On obtient une erreur de compilation. Un constructeur de la classe drive doit tre dfini et doit appeler le constructeur de la classe de base.
} } class ClasseDerivee extends ClasseDeBase { public ClasseDerivee(arguments2) { // constructeur de la classe drive /* Premire instruction = Appel de super(arguments1) Cest obligatoire sinon une erreur */ . } }
El Mostafa DAOUDI- p. 170
85
Exemple 3: class ClasseDeBase{ public ClasseDeBase() { // constructeur sans paramtres de la classe de base
} } class ClasseDerivee extends ClasseDeBase { public ClasseDerivee(arguments2) { // constructeur de la classe drive // lappel de super() nest pas obligatoire. /* si super() nest pas explicitement appel, alors le constructeur sans paramtres de la classe de base qui sera appel par dfaut. */ . } }
} } class ClasseDerivee extends ClasseDeBase { public ClasseDerivee(arguments2) { // constructeur de la classe drive // lappel de super(avec ou sans arguments) nest pas obligatoire. /* si super nest pas explicitement appel, alors le constructeur sans paramtres de la classe de base qui sera appel par dfaut. */ . } }
El Mostafa DAOUDI- p. 172
86
} class ClasseDerivee extends ClasseDeBase { public ClasseDerivee(arguments) { /* appel implicite du constructeur par dfaut de la classe de base */ . } } La cration dun objet de type ClasseDerivee entrane lappel du constructeur par dfaut de la clase ClasseDeBase .
El Mostafa DAOUDI- p. 173
} class ClasseDerivee extends ClasseDeBase { // Pas de constructeur . } La cration dun objet de type ClasseDerivee entrane lappel de constructeur par dfaut qui appelle le constructeur par dfaut de la classe ClasseDeBase .
87
} } class ClasseDerivee1 extends ClasseDeBase { public ClasseDerivee1() { // 1re instruction obligatoire = appel explicite de super() super(4); // par exemple
System.out.println(" Classe drive1: ");
} } class ClasseDerivee2 extends ClasseDerivee1{ public ClasseDerivee2() { // Appel explicite de super() nest pas obligatoire // Appel implicite du constructeur sans paramtres de ClasseDerivee1
System.out.println(" Classe drive2: " );
} }
El Mostafa DAOUDI- p. 175
public class TestHeritage{ public static void main (String args[]) { ClasseDerivee2 objA=new ClasseDerivee2(); } } Sortie:
88
Rsum: Si on n'appelle pas le constructeur de la superclasse, le constructeur par dfaut est utilis si: - aucun constructeur nest dfini - au moins un constructeur sans paramtre est dfini sinon le compilateur dclare une erreur Remarques Une classe dclare final ne peut pas avoir de classes filles. La redfinition d'une mthode public ne peut tre private Une mthode final ne peut pas tre redfinie
El Mostafa DAOUDI- p. 177
4. Notion de la Redfinition on redfinit une mthode quand une nouvelle mthode a le mme nom et la mme signature quune mthode hrite de la classe mre. la redfinition d'une mthode d'une classe consiste fournir dans une sousclasse une nouvelle implmentation de la mthode. Cette nouvelle implmentation masque alors compltement celle de la superclasse Attention: Ne pas confondre redfinition et surcharge des mthodes : on surcharge une mthode quand une nouvelle mthode a le mme nom, mais pas la mme signature, quune autre mthode de la mme classe
El Mostafa DAOUDI- p. 178
89
class ClasseDeBase{ public f(arg) { } } class ClasseDerivee1 extends ClasseDeBase { public f(arg) { // la mthode f() est redfinie dans ClasseDerivee1 } } class ClasseDerivee2 extends ClasseDeBase{ public f(arg){ // la mthode f() est redfinie dans ClasseDerivee2 . } }
El Mostafa DAOUDI- p. 179
Visibilit Lorsqu'un attribut ou une mthode ont t dfinis dans une classe et sont redfinis dans une classe drive (qui en hrite) alors les lments visibles dans la classe drive sont ceux redfinis dans cette classe. Les lments de la classe de base (hrite) sont alors masqus. Rgles On peut avoir les mmes mthodes dans des classes hritant les unes des autres. Dans ce cas, c'est la classe la plus drive de l'objet qui dtermine la mthode excuter, sans que le programmeur ait faire des tests sur le type de l'objet traiter (voir exemple suivant).
El Mostafa DAOUDI- p. 180
90
A*
Soit f() est une mthode dfinie dans la classe A. On suppose les liens dhritage suivants: - Les classes B et C hritent de A - Les classes D et E hritent de B
B C*
- La classe F hrite de C *: signifie redfinition de f(). Dans class A: la mthode f() de A Dans classe B: la mthode f() de A Dans classe D: la mthode f() de D
D*
Dans classe E: la mthode f() de A Dans classe C: la mthode f() de C Dans classe F: la mthode f() de C
Le mot cl super Grce au motcl super, la mthode redfinie dans la sousclasse peut rutiliser du code crit dans la mthode de la superclasse, qui n'est plus visible autrement. super a un sens uniquement dans une mthode (comme le motcl this).
91
Exemple: class Point { private int x,y; public void afficher(){ System.out.println(" je suis en "+ x +" et " +y); } } class PointCol extends Point { public void afficher() { // redfinition de la mthode afficher() super.afficher(); // appel de la mthode afficher() de la classe de base System.out.println (" et ma couleur est: "+ couleur); } private byte couleur; }
El Mostafa DAOUDI- p. 183
Dune manire gnrale, Soit g() une mthode dfinie dans une classe drive D. Dans la mthode g(), linstruction super. sert dsigner un membre dune classe anctre (la premire classe anctre de D contenant le membre dsign par super). Par exemple: super.f() dsigne la mthode f() dfinie dans la premire classe anctre de la classe D. La recherche de la mthode f() commence dans la classe mre de D, ensuite dans la classe mre de cette classe mre, et ainsi de suite, jusqu trouver la dfinition dune mthode f() qui sera alors excute Attention: Une fois la premire classe anctre trouve, on ne peut pas remonter plus haut: pas de super.super.
El Mostafa DAOUDI- p. 184
92
Exemple: class ClasseA { public String nom="Mostafa"; public void f(){ System.out.println("Je suis dans la classe de base ClasseA"); } } class A extends ClasseA { public String nom="Ali"; public void ff(){ System.out.println("Je suis dans la classe de base A"); } } class B extends A { public String nom = "Mohammed"; public void g(){ super.f(); // dsigne la mthode f() de la classe anctre: classe ClassA System.out.println( "Et je suis aussi dans la class derive B : "+nom+ " " +super.nom); // super.nom dsigne le champ nom de la classe mre : classe A. } }
El Mostafa DAOUDI- p. 185
public class TestSuper { public static void main(String[] args) { B b = new B(); b.g(); } } Affiche : ?? Je suis dans la classe de base ClasseA Et je suis aussi dans la class derive B : Mohammed Ali
93
5. Sous-type
Le type B est un sous-type de A si on peut affecter une expression de type B dans une variable de type A. Les type primitifs - int est un sous type de float (int i; float x=i;) - float est un sous type de double (float y; double z=y;)
-
Les objets Les sous-classes dune classe A sont des sous types de A. Dans ce cas on peut crire: A a = new B(); // la variable a est de type A, alors que // lobjet rfrenc par a est de type B. A aa; B b=new B(); aa=b; // aa de type A, rfrence un objet de type B Par contre on ne peut pas avoir: A a=new A(); B b; b=a; // erreur: on ne peut pas convertir du type A vers le type B
El Mostafa DAOUDI- p. 187
Dfinitions: - La classe relle (ou le type rel) de lobjet est la classe du constructeur qui a cr lobjet Exemple: Soit B une sous classe de A A a = new B(); // B est la classe (type) relle de lobjet a - Le type dclar (ou la clase dclare) de lobjet est le type qui est donn au moment de la dclaration de la variable qui rfrence lobjet. Exemple: Soit B une sous classe de A A a = new B(); // A est le type dclar de lobjet a
94
95
public class TestPolymorphisme { public static void main(String [] args ) { ClasseA a=new ClasseA(); ClasseB b = new ClasseB(); a.f(); // appelle la mthode dfinie dans ClasseA a=b; // le type dclar de a est ClasseA. Le type rel de a est ClasseB a.f(); // appelle la mthode dfinie dans ClasseB a.g(); // appelle la mthode dfinie dans ClasseA b.g(); // appelle la mthode dfinie dans ClasseA b.h(): // appelle la mthode h() dfinie dans ClasseB } } Il faut noter que la mme criture a.f(); peut correspondre des appels diffrents de la mthode f(). Ceci est ralis grce au polymorphisme.
El Mostafa DAOUDI- p. 191
- Le Polymorphisme veut dire que le mme service peut avoir un comportement diffrent suivant la classe dans laquelle il est utilis. Cest un concept fondamental de la programmation objet, indispensable pour une utilisation efficace de lhritage - Quand on manipule un objet via une rfrence une classe mre, ce sont toujours les mthodes (non statiques) de la classe effective de l'objet qui sont appeles Soit f() une mthode non static redfinie dans la classe ClasseB . ClasseA objA = new ClasseB(); objA.f(); // Appel de f() redfinie dans ClasseB (classe effective=classe // relle de lobjet), mme si objA est une rfrence de type // ClasseA (Classe dclare de lobjet).
96
Attention cest important: Si on a: B b = new B(); b.h(); // appelle la mthode h() dfinie dans B A a=new B(); a.h(); /* erreur la compilation mme si la classe relle possde la mthode h(). En effet la classe dclare (classe A) ne possde pas la mthode h(). */
En effet, en Java, ds la compilation on doit garantir lexistence de la mthode appele typage statique) : la classe dclare de lobjet qui reoit le message (ici la classe A ou une de ces classes anctres (polymorphisme)) doit possder cette mthode ().
El Mostafa DAOUDI- p. 193
Le polymorphisme est obtenu grce au mcanisme de la liaison retarde (tardive) late binding : la mthode qui sera excute est dtermine seulement lexcution, et pas ds la compilation par le type rel de lobjet qui reoit le message (et pas par son type dclar)
97
II. Mcanisme de la liaison retarde: cas des mthodes redfinies Soit ClasseB la classe relle dun objet objB (ClasseB est la classe du constructeur qui a cr lobjet objB) et soit ClasseA la classe de dclaration de lobjet objB (ClasseA objB = new ClasseB();). Si on a linstruction: objB.f(); quelle mthode f() sera appele ? 1. Si la mthode f() nest pas dfinie dans une classe anctre de la classe de dclaration (la classe ClasseA) alors erreur de compilation. 2. Si non Si la mthode f() est redfinie dans la classe ClasseB, alors cest cette mthode qui sera excute Sinon, la recherche de la mthode f() se poursuit dans la classe mre de ClasseB, puis dans la classe mre de cette classe mre, et ainsi de suite, jusqu trouver la dfinition dune mthode f() qui sera alors excute.
La mthode appele ne dpend que du type rel de lobjet et non du type dclar. - Soit B une classe qui hrite de la classe A, et soit f() une mthode dfinie dans A et redfinie dans B. - Soit C une classe qui hrite de la classe B. A a = new B(); a.f(); // La mthode f() appele est celle dfinie dans B. Maintenant si on: A a = new C(); // ok car C hrite de B qui hrite de A a.f(); Si la mthode f() est redfinie dans C alors la mthode appele est celle dfinie dans C. Si la mthode f() nest redfinie dans C alors cest la mthode f() redfinie dans B qui est appele.
98
III. Utilits du Polymorphisme: Le polymorphisme permet dviter les codes qui comportent de nombreux embranchements et tests. Exemple Considrons une classe ClasseA. Supposons que les classes ClasseB et ClasseC hritent de la super classe ClasseA. Dans un tableau htrogne, on range des objets de type ClasseB et ClasseC. Ensuite on affiche le contenu du tableau. instanceof (voir plus loin): Soit b une instance d'une classe B alors - (b instanceof B) retourne true : signifie que b est une instance de B. - si B est une sous classe de A alors (b instanceof A) retourne true.
El Mostafa DAOUDI- p. 197
Exemple
class ClasseA { public void f() {} // mthode vide public void g() {} // mthode vide } class ClasseB extends ClasseA { public void f() { // traitement propre ClasseB System.out.println("traitement dans Classe B "); } } class ClasseC extends ClasseA{ public void g() { // traitement propre ClasseC System.out.println("traitement dans ClasseC "); } }
El Mostafa DAOUDI- p. 198
99
public class TestPolymorphisme { public static void main(String[] args) { ClasseA [] objA = new ClasseA[3]; // objA tableau dobjets objA[0]=new ClasseB(); // cration de lobjet objA[0] objA[1]=new ClasseC(); // cration de lobjet objA[1] objA[2]=new ClasseC(); // cration de lobjet objA[2] // Pour chaque lment du tableau, faire le traitement correspondant for (int i=0; i < objA.length; i++) { if (objA[i] instanceof ClasseB) objA[i].f(); else if (objA[i] instanceof ClasseC) objA[i].g(); } }}
El Mostafa DAOUDI- p. 199
Inconvnients dans le code prcdent: 1. Si on veut rajouter une nouvelle sous classe, par exemple ClasseD, dote de la mthode h() pour faire un traitement propre la sous classe ClasseD, alors on est oblig de: - changer le code source de la classe de base aux niveaux dfinition de la classe : rajouter la mthode vide public void h() {}. - Rajouter un branchement pour la sous classe ClasseD. 2. Si on traite plusieurs sous classes, alors le code comportera plusieurs tests. En exploitant le polymorphisme, on peut amliorer le code prcdent Eviter les tests Rendre le code extensible: rajouter de nouvelles sous-classes sans toucher au code source existant).
El Mostafa DAOUDI- p. 200
100
public class TestPolymorphisme { public static void main(String[] args) { ClasseA [] objA = new ClasseA[3]; objA[0] = new ClasseB(); objA[1] = new ClasseC(); objA[2] = new ClasseC(); for (int i=0; i < objA.length; i++) objA[i].f(); // On na pas besoin de faire des tests: la mthode appele // correspond la mthode de la classe effective de lobjet : // principe du polymorphisme. // } }
El Mostafa DAOUDI- p. 202
101
Considrons lexemple de la classe point qui a: - un constructeur a deux arguments qui permet de positionner le point dans le plan. Le programme doit sarrter si au moins une des coordonnes du point est ngative.
102
public class Point { private int x, y; public Point(int x, int y) { if ((x < 0) || (y < 0)) { // Dtection de lerreur (lException) System.out.println("Erreur de Construction"); /* traitement en cas derreur (traitement de lexception) */ System.exit(-1); } else { this.x = x ; this.y = y; // traitement normal } } }
Un 1er test public class TestException { public static void main(String[] argv) { private int i=3; // dbut du bloc susceptible de gnrer une exception Point a = new Point(6,1); Point b = new Point(3, 4); // Fin du bloc susceptible de gnrer une exception System.out.println (" Excution bien passe i= "+i); } } Sortie du programme: Excution bien passe i=3 Les appels de Point(6,1) et Point(3,4) nont gnr aucune exception..
103
Un 2me test public class TestException { public static void main(String[] argv) { private int i=3; // dbut du bloc susceptible de gnrer une exception Point a = new Point(6,1); Point b = new Point(-2, 4); // Fin du bloc susceptible de gnrer une exception System.out.println (" Excution bien passe i= "+i); } } Sortie du programme: Erreur de Construction Lappel de Point(6,1) na pas gnr dexception, donc il a t excut normalement. Par contre lappel de Point(-2,4) a gnr une exception et a provoqu larrt du programme (appel de System.exit(-1);). Par consquent linstruction System.out.printl() na pas t excute.
El Mostafa DAOUDI- p. 207
III. Gestion des erreurs en utilisant le mcanisme des exceptions Dans lexemple prcdent, le traitement normal, la dtection de lexception et son traitement ne sont pas spars. Java permet de sparer la dtection de lexception et de son traitement. Le traitement normal et le traitement des exceptions sont dissocis. Au lieu de compliquer le code du traitement normal, on traite les conditions anormales part. Le traitement normal apparat ainsi plus simple et plus lisible. Le traitement des exceptions (erreurs) seffectue dans une zone du programme spciale (bloc catch ).
104
Pratiquement:
Le code dans lequel une exception peut se produire est mis dans un bloc try, cest-dire on dlimite un ensemble dinstructions susceptibles de dclencher une exception par des blocs try {} try { /* Code dans lequel une exception peut se produire */ } La gestion des exceptions est obtenue par des blocs catch, o un bloc catch est associ une exception donne. Attention: Le bloc catch doit tre juste aprs le bloc try, sinon erreur de compilation. catch ( Type1Exception e) { // de type Type1Exception qui hrite de Exception /* code de la gestion des exceptions */ } catch ( Type2Exception e) { // de type Type2Exception qui hrite de Exception /* code de la gestion des exceptions */ } ..
Lorsquune exception se produit dans le bloc try, alors : un saut est effectu vers un bloc (s) catch les blocs catch sont vrifis un aprs lautre jusqu ce quon trouve un bloc correspondant lexception le code du bloc catch est excut
105
Un 1er Test public class Test { public static void main(String[] argv) { try { // dans ce bloc une exception peut se produire Point b = new Point(-2, 4); Point a = new Point(6, 1); } catch (ErrConst e) { // Erreur de type ErrConst qui hrite de Exception // dans ce bloc on traite les exceptions System.out.println("Erreur de Construction"); System.exit(-1); } System.out.println(" Excution bien passe"); } } Sortie du programme: Erreur de Construction Lappel de Point(-2,4); gnre une exception, donc un saut est effectu vers le bloc catch(). Lexcution du code du bloc catch() a provoqu larrt du programme (appel de System.exit(-1);), par consquent lappel de Point(6,1) et les instructions aprs le bloc try {} nont pas t excutes.
Un 2me Test
public class Test { public static void main(String[] argv) { try { Point a = new Point(9, 5); Point b = new Point(3, 7); } catch (ErrConst e) { // Erreur de type ErrConst qui hrite de Exception System.out.println("Erreur de Construction"); System.exit(-1); } System.out.println(" Excution bien passe"); } } Sortie du programme: Excution bien passe Les appels de Point(9,5) et Point(3,7) nont pas gnr dexceptions donc le code du bloc catch() { } na pas t excut par consquent lexcution est alle au-del du bloc try.
106
Un Premier exemple complet: class ErrConst extends Exception {} class Point { private int x, y; public Point(int x, int y) throws ErrConst {// dclare une exception if ((x < 0) || (y < 0)) throw new ErrConst(); // dclenche une exception this.x = x ; this.y = y; // traitement normal } } public class Test { public static void main(String[] argv) { try { Point a = new Point(6, 1); Point b = new Point(-2, 4); } catch (ErrConst e) { // Erreur de type ErrConst qui hrite de Exception System.out.println("Erreur de Construction"); System.exit(-1); } } }
El Mostafa DAOUDI- p. 214
107
Un Deuxime exemple complet: Supposons maintenant que la classe Point possde une mthode dplace() et que le point doit rester dans le plan positif. Dans ce cas, le constructeur Point() et la mthode deplace() doivent dclencher une exception. class ErrConstextends Exception {} class ErrDepl extends Exception {} class Point { private int x, y; public Point(int x, int y) throws ErrConst { // dclare une excption if ((x < 0) || (y < 0)) throw new ErrConst(); // dclenche une exception this.x = x ; this.y = y; } public void deplace(int dx, int dy) throws ErrDepl{ if ((x+dx < 0) || (y+dy < 0)) throw new ErrDepl(); x = x+dx ; y = y+dy; } }
El Mostafa DAOUDI- p. 215
public class Test { public static void main(String[] argv) { try { Point a = new Point(1,4); a.deplace(0,1); Point b = new Point(7, 4); b.deplace(3,-5); } catch (ErrConst e) { System.out.println("Erreur de Construction"); System.exit(-1); } catch (ErrDepl ed) { System.out.println("Erreur de Dplacement"); System.exit(-1); } } }
108
V. Bloc finally cest une instruction optionnelle qui est excute quelle que soit le rsultat du bloc try (cest dire quil ait dclench ou non une exception) Il permet de spcifier du code dont lexcution est garantie quoi quil arrive. try { ... } catch () { ... } finally { ... }
Exemple: public class TestFinally { public static void main(String[] argv) { try { Point a = new Point(6, 1); a = new Point(-2, 4); } catch (ErrConst e) { // Erreur de type ErrConst qui hrite de Exception System.out.println("Erreur de Construction"); } finally { System.out.println("Fin du Programme"); } } } Affichage: Erreur de Construction Fin du Programme Dans toutes les excutions (dclenchement ou non dexception), les instructions du bloc finally seront excutes.
El Mostafa DAOUDI- p. 218
109
VI. Constructeurs des exceptions La cration d'exception personnalise peut tre ralise en rajoutant des constructeurs et des membres supplmentaires. Par convention, toutes les exceptions doivent avoir au moins 2 constructeurs : un sans paramtre un autre dont le paramtre est une chane de caractres utilise pour dcrire le problme Mthodes de la classe Throwable Exception(): constructeur sans argument Exception(String): Constructeur avec Argument getMessage() retourne le message derreur dcrivant lexception printStackTrace() affiche sur la sortie standard la liste des appels de mthodes ayant conduit lexception
El Mostafa DAOUDI- p. 219
Mthode printStackTrace() class Point { private int x, y; public Point(int x, int y) throws Exception { if ((x < 0) || (y < 0)) throw new Exception(); this.x = x ; this.y = y; } }
110
public class ExceptionTestStack { public static void main(String[] argv) { try { Point a = new Point(6, 1); a = new Point(-2, 4); } catch (Exception e) { // Erreur de type Exception System.out.println("Erreur de Construction"); e.printStackTrace(); System.exit(-1); } } } Sortie du Programme: Erreur de Construction ErrConst at Point.<init>(ExceptionTestStack.java:5) at ExceptionTestStack.main(ExceptionTestStack.java:14)
El Mostafa DAOUDI- p. 221
Mthode printStackTrace(): (avec exeption personnalise) class ErrConst extends Exception{} // exception personnalise class Point { private int x, y; public Point(int x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(); this.x = x ; this.y = y; } }
111
public class ExceptionTestStack { public static void main(String[] argv) { try { Point a = new Point(6, 1); a = new Point(-2, 4); } catch (ErrConst e) { // Erreur de type ErrConst qui hrite de Exception System.out.println("Erreur de Construction"); e.printStackTrace(); System.exit(-1); } } } Sortie du Programme: Erreur de Construction ErrConst at Point.<init>(ExceptionTestStack.java:5) at ExceptionTestStack.main(ExceptionTestStack.java:14)
El Mostafa DAOUDI- p. 223
Mthode getMessage().
class Point { private int x, y; public Point(int x, int y) throws Exception { if ((x < 0) || (y < 0)) throw new Exception(" Erreur aux points x=" +x+" et y=" +y); this.x = x ; this.y = y; } }
112
public class Test { public static void main(String[] argv) { try { Point a = new Point(6, 1); a = new Point(-2, 4); } catch (Exception e) { System.out.println(e.getMessage()); System.exit(-1); } } } Sortie: Erreur au point x= -2 et y=4
Mthode getMessage(): Exception personnalise On dfinit dans l'exception personnalise, un constructeur qui a pour argument une chane de caractres:
class ErrConst extends Exception { // lexception personnalise public ErrConst() {} public ErrConst(String msg) { super(msg); } } class Point { private int x, y; public Point(int x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(" Erreur aux points x=" +x+" et y=" +y); this.x = x ; this.y = y; } }
El Mostafa DAOUDI- p. 226
113
public class Test { public static void main(String[] argv) { try { Point a = new Point(6, 1); a = new Point(-2, 4); } catch (ErrConst e) { System.out.println(e.getMessage()); System.exit(-1); } } } Sortie: Erreur au point x= -2 et y=4
114
Error
Exception
RuntimeException
Exceptions contrles
115
ArrayStoreException : Tentative de stocker dans un tableau un lment qui n'est pas du type des lments du tableau ou castable dans ce type. ArithmeticException: Une exception est survenue sur une opration arithmtique, comme une division d'un entier par zro. ) NegativeArraySizeException : Tentative de crer un tableau ou une chane avec une taille ngative. IllegalArgumentException : Une mthode a t appele avec un mauvais argument ou invoque sur un mauvais objet. Sa sous-classe NumberFormatException NumberFormatException : Tentative de convertir dans un type numrique une chane de caractres mal formate.
116
I. Classes abstraites
Une classe abstraite est une classe dclare avec le mot cl abstract. Elle est non instanciable . Elle sert uniquement de classe mre. Exemple: abstract class ClasseA { } Dans une classe abstraite on peut trouver: - des champs, - des mthodes , - des mthodes abstraites.
El Mostafa DAOUDI- p. 233
Une mthode abstraite est dclare avec le mot cl abstract. Dans ce cas on la dclare sans donner son implmentation (sans spcifier le corps de la mthode). On ne fournit que : - le type de la valeur de retour - et la signature (lentte de la mthode). Exemple: abstract public void f(int i, float x); abstract public double g(); Les mthodes abstraites peuvent tre implmentes par les classes filles.
117
Les rgles On ne peut pas instancier une classe abstraite (on ne peut pas crer une instance (un objet) dune classe abstraite).
Soit ClasseA une classe abstraite. - On peut crer une rfrence sur un objet de type ClasseA. - Mais on ne peut pas crer un objet de type ClasseA. ClasseA objA; // autoris ClasseA objA = new ClasseA(); // nest pas autoris.
Soit ClasseB une classe qui hrite de ClasseA. Si ClasseB nest pas abstraite alors on peut crire: ClasseA a = new ClasseB();
Une mthode static ne peut pas tre abstraite. Pourquoi ?? Une classe qui dfinit au moins une mthode abstraite doit tre obligatoirement dclare abstraite. Soit une classe fille qui hrite dune classe mre qui dfinit des mthodes abstraites. Alors la classe fille doit implmenter toutes ses mthodes abstraites sinon elle doit tre aussi dclare abstraite. Une mthode dclare abstraite doit obligatoirement tre dclare public.
118
Intrt des classe abstraites: Le principe est que la classe mre dfinit la structure globale dun algorithme et laisse aux classes filles le soin de dfinir des points bien prcis de lalgorithme. Par exemple quand on ne connat pas priori le comportement par dfaut dune opration commune plusieurs sous-classes
II. Interfaces
Une classe est purement abstraite si toutes ses mthodes sont abstraites. Une interface est une classe purement abstraite. Elle est dclare avec le mot cl interface, dont toutes les mthodes sont publiques. Une interface est une liste de noms de mthodes publiques. Dans linterface on dfinit la signature des mthodes qui doivent tre implmentes dans les classes qui les implmentent. Une interface est un modle pour une classe Exemple dinterfaces public interface Figure { public void dessineFigure(); public void deplaceFigure(int dx, int dy); }
El Mostafa DAOUDI- p. 238
119
Rgles Toutes les mthodes dune interface sont abstraites. Une interface nadmet aucun attribut. Une interface peut possder des constantes publics public interface NomInterface { public static final int CONST = 2; } Les interfaces ne sont pas instanciables. Soit I une interface: I obj; // Juste I a = new I(); // Erreur Tout objet instance dune classe qui implmente linterface peut tre dclar comme tant du type de cette interface. Supposons que la classe ClasseA implmente linterface I . Alors on peut avoir I obj = new ClasseA(); Les interfaces pourront se driver
El Mostafa DAOUDI- p. 239
Implmentation des Interfaces Les interfaces sont implmentes par des classes. Une classe implmente une interface I si elle dclare implements I dans son en-tte. Soit ClasseA qui implmente I . public class ClasseA implements I { } Une classe peut implmenter une ou plusieurs interface(s) donne(s) en utilisant une fois le mot cl implements. public class ClasseA implements I1, I2, { } Si une classe hrite dune autre classe elle peut galement implmenter une ou plusieurs interfaces public class ClasseB extends ClasseA implements I1, I3, ... {
120
Implmente partiellement une interface Soit une interface I et une classe ClasseA qui limplmente : public class ClasseA implements I { } ClasseA peut ne pas implmenter toutes les mthodes de I. Dans ce cas ClasseA doit tre dclare abstract (elle lui manque des implmentations). Les mthodes manquantes seront implmentes par les classes filles de ClasseA
121
Comparer deux objets Les oprateurs == et != Soient objA et objB deux objets, objA==objB retourne true si les deux objets rfrencent la mme chose. Attention: Les tests de comparaison (== et !=) entre objets ne concernent que les rfrences et non les attributs. Classe Object - equals() public boolean equals(Object obj) Par dfaut, retourne (this==obj). Cest--dire renvoie true si lobjet obj rfrence la mme chose que lobjet qui appelle la mthode equals (objet courant this ). Elle est prvue pour tre redfinie pour comparer les contenues.
El Mostafa DAOUDI- p. 243
Exemple dutilisation: Considrons la classe Point et pA et pB deux instances de Point. Point pA=new Point(5,8); Point pB = new Point(5,8); pA.equals(pB) renvoie false car pA et pB rfrencent deux objet diffrents (appel de la mthode dfinie dans la classe Object). Si on dfinie la mthode equals dans la classe Point comme suit: public boolean equals (Point p){ return ((this.x==p.x)&&(this.y==p.y)); } Dans ce cas pA.equals(pB) renvoie true car pA et pB ont le mme contenue (pA et pB coincident). Mais attention: Que se passe t-il si on a: Object pA = new Point(2,3); Object pB= new Point (2,3) Que vaut : pA.equals(pB) ???? Voir TD pour la redfinition de la mthode equals()
El Mostafa DAOUDI- p. 244
122
Classe Object mthode toString() public String toString(); Elle renvoie une description de lobjet sous la forme dune chane de caractres de la forme: nomDeLaClasse@AdresseMmoireDelObjet Elle est prvue pour tre redfinie pour afficher le contenu. Exemple : Soit pA une instance de la classe Point, alors linstruction: System.out.println(pA) ; Est quivalente System.out.println(pA.toString()) ; // affiche par exemple Point@1a16869
Maintenant on la redfinit dans la classe Point comme suit: public String toString (){ return ("abcisse = "+this.x+" et ordonne = " +this.y); } Dans ce cas, si on a: Point pA=new Point(10, 32); Alors: System.out.println(pA) ; System.out.println(pA.toString()) ;
// appel de la mthode toString() redfinie dans la classe Point
affiche :
abscisse = 10 et ordonne = 32
El Mostafa DAOUDI- p. 246
123
Mthode getClass() public Class getClass() Elle renvoie un objet de type Class qui dsigne le nom de la classe relle de lobjet. Exemple : soit objA une instance de la classe ClasseA, alors linstruction: objA.getClass(); Renvoie: class ClasseA System.out.println(objA.getClass()); Affiche: class ClasseA La mthode getName() de la classe Class renvoie le nom de la classe. On peut lutiliser pour imprimer le nom de la classe : System.out.println(objA.getClass(). getName()); Affiche: ClasseA
El Mostafa DAOUDI- p. 247
LOprateur instanceof Si objA est une instance d'une classe ClasseA alors linstruction: objA instanceof ClasseA ; renvoie true. Si objB est une instance d'une sous-classe ClasseB de ClasseA alors linstruction: objB instanceof ClasseA; renvoie true. En particulier : (objA instanceof Object) renvoie true car toutes les classes hritent de la classe Object.
El Mostafa DAOUDI- p. 248
124
Mthode clone() Pour dupliquer un objet: Soit on dfinie une mthode qui retourne une copie de lobjet en ayant cr une nouvelle instance et initialis les attributs (en utilisant le constructeur). Exemple: On dfinie la mthode duplique dans la classe Point public Point duplique(){ // renvoie une rfrence un Point return new Point(this.x, this.y); }
Soit on utilise linterface Cloneable pour garder la compatibilit avec les autres classes de Java. On implmente la mthode protected Object clone() de linterface Cloneable class Point implements Cloneable{ . public Object clone(){ // renvoie une rfrence un Point return new Point(this.x, this.y); } } Test: Point a=new Point(19,11); Object b=a.clone(); // a et b ont le mme contenu.
El Mostafa DAOUDI- p. 250
125
IV. Classes enveloppes (classes wrappers) des types primitifs Les classes enveloppe permettent dencapsuler les types primitifs dans des objets pour pouvoir les traites comme des objets. Le paquetage java.lang fournit des classes pour envelopper les types primitifs. Les classes enveloppes numriques: - Elles drivent toutes de la classe Number et elles sont : Byte, Short, Integer , Long, Float et Double. - Elles admettent un constructeur prenant pour argument la valeur du type primitif envelopper.
El Mostafa DAOUDI- p. 251
Exemple: Pour obtenir un objet Integer partir d'un int de valeur 12 il suffit de faire : Integer nObj = new Integer (12) ; /* nObj contient la rfrence un objet de type Integer encapsulant la valeur 12 */ Pour obtenir un objet Double partir d'un double de valeur 5.67 il suffit de faire : Double xObj= new Double (5.67) ; /* xObj contient la rfrence a un objet de type Double encapsulant la valeur 5.67 */
El Mostafa DAOUDI- p. 252
126
Les mthodes : byteValue(); // renvoient la valeur de type byte shortValue(); // renvoient la valeur de type short intValue(); // renvoient la valeur de type int longValue(); // renvoient la valeur de type long floatValue(); // renvoient la valeur de type float doubleValue() ; // renvoient la valeur de type double Exemple: Integer nObj = new Integer(5); int n = nObj.intValue(); // n vaut 5 Double xObj = new Double(5.8); double x = xObj.doubleValue();
// x vaut 5.8
Les mthodes statiques: parsXXX parseByte(String); parseShort(String); parseInt(String); parseLong(String); parseFloat(String); parseDouble(String) Renvoient une valeur d'un type primitif partir de sa reprsentation textuelle Exemple : Soit String ch = "3587" ; Pour convertir la chane ch (format textuel dun entier) en un entier de type int, alors on utilise la mthode statique parseInt de la classe enveloppe Integer , comme ceci : int n = Integer.parseInt(ch) ;
El Mostafa DAOUDI- p. 254
127
Attention: ces mthodes peuvent gnrer une exception du type NumberFormatException et doivent donc tre places dans un bloc try/catch. Exemple dutilisation: public class Parse{ public static void main(String args[]){ String nbreChaine="455"; int n; try{ n=Integer.parseInt(nbreChaine); // n vaut 455 } catch (NumberFormatException e) { System.out.println("nbreChaine n'est pas un vrai nombre"); } } }
El Mostafa DAOUDI- p. 255
Les mthodes statiques valueOf(String) Boolean.valueOf , Byte.valueOf() , Short.valueOf(), Integer.ValueOf() , Long.valueOf(), Float.valueOf(), Double.valueOf(). Elles renvoient un objet construit partir de sa reprsentation sous forme de texte. Par exemple:
128
V. Classe Math
La classe Math du paquetage java.lang reprsente la bibliothque mathmatique. Elle n'est pas destine avoir des instances : toutes ses mthodes sont statiques. On y trouve : static double E, static double PI Sytem.out.println(" Exp= " +Math.E + " et PI= "+Math.PI); affiche : Exp= 2:718281828459045 et PI = 3.141592653589793 type abs(type v) Valeur absolue ; type est un des types int, long, float ou double type max(type a, type b) Le plus grand de a et b ; type est un des types int, long, float ou double type min(type a, type b) Le plus petit de a et b ; type est un des types int, long, float ou double double floor(double v) Le plus grand entier infrieur ou gal v. double ceil(double v) Le plus petit entier suprieur ou gal v.
El Mostafa DAOUDI- p. 257
double rint(double v) L'entier le plus proche de v ; s'il y en a deux, celui qui est pair. int round(int v) L'entier le plus proche de v. La valeur de round(v) est la mme que celle de (int) floor(v + 0,5). double random() Un nombre pseudo-alatoire dans [0; 1[. double sqrt(double x) Calcul de la racine carre double exp(double x) Exponentielle double log(double x) logarithme nprien. double pow(double a, double b) Calcul de a la puissance b. double sin(double x), double cos(double x), double tan(double x) double asin(double x), double acos(double x), double atan(double x) Fonctions trigonomtriques habituelles.
El Mostafa DAOUDI- p. 258
129
Le package par dfaut : cest le package qui na pas de nom, et auquel appartiennent toutes les classes situes dans le mme rpertoire (ou dans les rpertoires accessibles dans la variable classpath) Exemple 1: class ClasseTest { public ClasseTest() { System.out.println(" Ceci est un exemple : "); } } public class TestPackage { public static void main(String[] args) { System.out.print("Entrer un entier nouvelle largeur : "); int i = Clavier.lireInt(); } }
El Mostafa DAOUDI- p. 260
130
Remarques:
- La compilation du fichier source TestPackage.java gnre deux fichiers .class savoir ClasseTest.class et TestPackage.class, ses deux fichiers appartiennent au mme package par dfaut (package sans nom) - La classe Clavier.class doit se trouver dans le mme rpertoire que le fichier TestPackage.class (ou dans un rpertoire dfini dans CLASSPATH), sinon le compilateur gnre une erreur.
Package java.lang Le package java.lang contient les classes standards telles que System, Math. Par dfaut, les classes du paquetage java.lang sont automatiquement importes. Dans un programme .java on peut faire appel toutes les classes de java.lang sans spcifier leur chemin. Exemple: On peut utiliser la classe Exception sans spcifier le chemin class SimpleException extends Exception {} qui est quivalent class SimpleException extends java.lang.Exception {} ou import java.lang.Exception; class SimpleException extends Exception {}
131
Pour pouvoir accder aux classes d'un package partir d'une classe ne faisant pas partie du package:
il suffit de donner le chemin d'accs relatif la classe lorsquon fait appel elle. Par exemple pour appeler la classe Button du package java.awt, il suffit d'crire java.awt.Button chaque appel de la classe Button Ou d'utiliser l'instruction import, suivie du chemin de la classe. Par exemple import java.awt.Button; dans ce cas, on peut appeler la classe Button sans spcifier le chemin. Ou dimporter toutes les classes d'un package. Par exemple on importe toutes les classes du package java.awt par la syntaxe : import java.awt.*;
El Mostafa DAOUDI- p. 263
Remarque: Un paquetage peut avoir des sous-paquetages, par exemple java.awt.event est un sous-paquetage de java.awt Attention: L'instruction import java.awt.*; ne permet pas dimporter les classes des sous-paquetages de java.awt Si on veut par exemple importer les classes de java.awt et aussi celles de java.awt.event alors on devra crire: import java.awt.*; import java.awt.event.*;
132
Quelques paquetages du SDK (Software Development Kit) java.lang : classes de base de Java java.util : utilitaires java.io : entres-sorties java.awt : interface graphique javax.swing : interface graphique avance java.applet : applets java.net : rseau java.rmi : distribution des objets java.math: Excution de calculs arithmtiques.
El Mostafa DAOUDI- p. 265
Cration de paquetage Un package est une unit regroupant des classes. Pour crer un tel package, il suffit de commencer le fichier source contenant les classes regrouper par l'instruction package suivi du nom que l'on dsire donner au package. Ds lors, toutes les classes contenues dans le fichier feront partie du package... Attention: - un package portant le nom Pack1 doit tre stock dans un rpertoire de nom Pack1. - Pour que le compilateur puisse trouver le package, il est essentiel qu'il "connaisse" l'emplacement du package. Pour cela Java utilise une variable d'environnement appele classpath donnant la liste des chemins d'accs aux classes. - Par dfaut le compilateur (ainsi que la machine virtuelle) recherchent les classes dans le rpertoire courant et le rpertoire des classes spcifis dans classpath.
El Mostafa DAOUDI- p. 266
133
Exemple import graphics.*; public class TestPackage1 { public static void main(String[] args) { Rectangle r=new Rectangle(); r.dessineRectangle(); Cercle.dessineCercle(); // mthode de classe Triangle t=new Triangle(); t.dessineTriangle(); } }
El Mostafa DAOUDI- p. 267
// dans un fichier Rectangle.java situ dans le rpertoire ./graphics package graphics; public class Rectangle{ public void dessineRectangle() { System.out.println(" Dessine un rectangle "); } } // dans un fichier Cercle.java situ dans le rpertoire ./graphics package graphics; public class Cercle { public static void dessineCercle() { System.out.println(" Dessine un cercle .... "); } } // dans un fichier Triangle.java situ dans le rpertoire ./graphics package graphics; public class Triangle { public void dessineTriangle() { System.out.println(" Dessine un triangle.... "); } }
134
I. La classe String : chanes non modifiables 1. Dclaration et cration: String ch; dclare que ch est une rfrence un objet de type String. Ici on a cr la rfrence mais pas lobjet. String nest pas un type primitif . Pour crer lobjet, il faut initialiser la rfrence ch. String ch; ch = new String ("bonjour"); //ch contient la rfrence un objet contenant la chaine "bonjour". On peut regrouper les deux instructions: String ch=new String ("bonjour");
bonjour
ch
El Mostafa DAOUDI- p. 270
135
On peut aussi crire tous simplement : String ch= "bonjour"; Mais: attention Java impose que si String ch1 = "bonjour"; String ch2 = "bonjour"; alors ch1 et ch2 rfrencent le mme objet (cration d un seul objet String rfrenc par les 2 variables ch1 et ch2 ) Par contre: si on a: String ch1 = "bonjour"; String ch2 = new String("bonjour"); // ou String ch2=new String (ch1) alors ch1 et ch2 rfrencent deux objets diffrents . La dclaration de ch2 provoque la cration d'un nouveau objet String (ch2 contient la rfrence un objet contenant la chaine "bonjour" ). La chaine vide: String ch= new String ( ); //ch contient la rfrence une chane vide
El Mostafa DAOUDI- p. 271
Caractristiques Un objet de type String nest pas modifiable : Il nexistera aucune mthode permettant de modifier le contenu dun objet de type String. Attention: laffectation ne modifie lobjet. Exemple : bonjour String ch; ch ch="bonjour";
bonjour ch="bonsoir";
ch
bonsoir
Lobjet na pas t modifi, mais cest la rfrence ch qui a t modifie. Aprs affectation, ch rfrence la chaine "bonsoir".
El Mostafa DAOUDI- p. 272
136
3.Mthodes dutilisation dune chaine de type String Longueur dune chaine La longueur dune chaine (le nombre de caractres que contient la chaine) est obtenue par la mthode length(). Exemple: String ch1="bonjour"; String ch2=""; // chaine vide int n1=ch1.length( ); // n1 = 7 int n2=ch2.length( ); // n2 = 0
Accs aux caractres dune chane : la mthode charAt() La mthode charAt( ) de la classe String permet daccder un caractre de rang donn dune chane. Le premier caractre dune chaine porte le rang 0. Exemple : String ch = "bonjour"; char c1= ch.charAt(0); char c2= ch.charAt(2);
// c1=b. // c2=n.
137
Concatnation de chanes On utilise la mthode concat(). Soient ch1 et ch2 deux objets de type String. String ch=ch1.concat(ch2). La chaine ch est obtenue aprs concatnation de la chaine ch1 suivi de la chaine ch2. Exemple : String ch1= "le langage"; String ch2= "java"; String ch=ch1.concat(ch2);
ch1 ch2 ch
El Mostafa DAOUDI- p. 275
Le langage java
le langage java
On peut aussi utiliser loprateur + de la manire suivante: Soient ch1 et ch2 deux objets de type String String ch = ch1+ch2; String ch=ch1.concat(ch2); Conversions des oprandes de loprateur + Java autorise le mlange de chanes et expressions dun type primitif. String s1= "bonjour" int n=26; String s=s1+ " " +n // s= "bonjour 26" Loprateur += String ch= " bonjour " ; ch+= " monsieur " ; // ch = "bonjour monsieur"
El Mostafa DAOUDI- p. 276
138
Recherche dans une chane La mthode indexOf( ) permet de rechercher, partir du dbut dune chane, la premire occurrence dun caractre donn en argument. Elle retourne La position du caractre donn en argument si une correspondance a effectivement t trouve, la valeur -1 sinon. Exemple: String ch="bonjour"; int n=ch.indexOf('j'); // n=3; int k=ch.indexOf(p'); // k=-1;
El Mostafa DAOUDI- p. 277
Comparaisons de chanes La mthode equals( ) permet de comparer les contenus de deux chanes. Attention: Les oprateurs == et != comparent les rfrences et non les contenus des objets. Exemple: String ch1="bonjour"; String ch2="bonjour"; String ch3=new String ("bonjour"); Alors, (ch1==ch2); // retourne true, car ch1 et ch2 rfrencent le mme objet. (ch1==ch3); //retourne false, car ch1 et ch2 rfrencent deux objets diffrents. ch1.equals(ch2); // retourne true. ch1.equals(ch3); //retourne true. La mthode equalsIgnoreCase( ) effectue la mme comparaison, mais sans faire de diffrence entre les majuscules et les minuscules.
El Mostafa DAOUDI- p. 278
139
La mthode compareTo( ) Permet deffectuer des comparaisons lexicographiques de chanes pour savoir laquelle des deux chanes apparat avant une autre en se basant sur lordre des caractres. Utilisation: Soient ch1 et ch2 deux chaines de type String ch1.compareTo(ch2); retourne: - un entier ngatif si ch1 arrive avant ch2; - un entier nul si ch1 et ch2 sont gales; - un entier positif si ch1 arrive aprs ch2;
Remplacement de caractres La mthode replace( ) cre une nouvelle chane en remplaant toutes les occurrences dun caractre donn par un autre. Exemple: String ch1="bonjour"; ch1=ch1.replace(o,a); Attention : La chaine ch1 nest pas modifie, mais cration dune nouvelle chaine qui contient "banjaur" rfrence par ch1.
140
Extraction de sous chane La mthode substring( ) permet de crer une nouvelle chane partir de la chane courante. String substring (int dbut) // retourne un nouveau string qui commence au caractre dindice dbut et allant jusquau dernier caractre de la chaine courante. String substring (int dbut , int fin) // retourne un nouveau String qui commence au caractre dindice dbut et allant jusquau caractre dindice (fin-1) de la chaine courante Si les indices dbut et fin sont hors les indices de la chaine qui appelle la mthode substring(), alors il y a gnration de lexception: java.lang.StringIndexOutOfBoundsException: Exemple : String ch = "bonjour"; String ch1 = ch.substring(3); // ch1 ="jour" String ch2 = ch.substring(1, 4); // ch2="onj"
El Mostafa DAOUDI- p. 281
281
12:19
141
Suppression des sparateurs de dbut et de fin La mthode trim( ) cre une nouvelle chane en supprimant les ventuels sparateurs de dbut et de fin (espace, tabulations, fin de ligne) String s= " \n\t separateurs avant, pendant \t\n, et aprs\n\t " ); String s1=ch.trim( ); // Suppression des sparateurs \n\t marqus au dbut et \n\t maqus // la fin de la chaine. //s1 contient la chaine "separateurs avant, pendant \t\n, et aprs");
12:19
Conversion dun type primitif en une chane La classe String dispose des mthodes statique pour les conversions: static String valueOf(int i) conversion int ----> String static String valueOf(long l) conversion long ----> String static String valueOf(float f) conversion float ----> String static String valueOf(double d) conversion double ----> String static String valueOf(boolean b) conversion boolean ----> String Static String valueOf(char c) conversion char ----> String Exemple: int n=427; String s1=String.valueOf(n); //s1= "427" boolean b=false; String s2=String.valueOf(b); // s2="false"
12:19
El Mostafa DAOUDI- p. 284
142
Conversions entre chanes et tableaux de caractres On peut construire une chane partir dun tableau de caractres. Exemple: char mot[]={'b','o','n','j','o','u','r'}; // tableau de 7 caractres String s=new String (mot); // s contient la chane : "bonjour" ;
143
Mthodes de la classe StringBuffer La mthode length() permet dobtenir la longueur de la chaine. Exemple: StringBuffer buf = new StringBuffer("Bonjour"); int n=buf.length(); // n=7 La mthode charAt(i); permet daccder au caractre de rang i. Exemple: StringBuffer buf = new StringBuffer("Bonjour"); char c=buf.charAt(2); // c=n La mthode setCharAt(r,c); permet de remplacer le caractre de rang r par le caractre c. Exemple: StringBuffer buf = new StringBuffer("Bonjour"); buf.setCharAt(2,'L'); // remplace dans buf le caractre n par L. buf="BoLjour"
El Mostafa DAOUDI- p. 288
144
La mthode insert(r,ch) permet dinsrer la chaine de caractres ch partir du rang r. Exemple: StringBuffer buf = new StringBuffer("Bonjour"); buf.insert(3,"gues"); // insre dans buf la chaine "gues" partir du rang 3. buf="Bonguesjour" La mthode append(ch) permet de rajouter la chaine de caractres ch la fin Exemple: StringBuffer buf = new StringBuffer("Bonjour"); buf.append("ne"); // insre la fin de buf, la chaine "ne". buf="Bonjourne" La mthode deleteCharAt(r); efface le caractre de rang r. Exemple: StringBuffer buf = new StringBuffer("Bonjour"); buf.deleteCharAt(2); // supprime de la chaine buf le caractre de rang 2. buf="Bojour"
La mhode toString() permet la conversion de StringBuffer en String Exemple: StringBuffer buf = new StringBuffer("Bonjour"); String ch = buf.toString(); // cr la chaine ch de type String partir de buf qui est de type StringBuffer. // ch ="Bonjour" La mthode substring() permet dextraire une chaine de type String partir dun StringBuffer Exemple: StringBuffer buf = new StringBuffer("Bonjour"); String ch = buf.substring(1,4); // cr la chaine ch de type String avec ch = "onj" Attention: On ne peut pas faire la concatnation avec loprateur + entre des StringBuffer. Par contre StringBuffer + String produit une nouvelle chaine de type String.
El Mostafa DAOUDI- p. 290
145
Ch. XIII. Introduction la programmation graphiques Cette partie du cours est essentiellement dvelopp partir du livre Titre: "Programmer en Java" Auteur: Claude Delannoy Edition : Eyrolles.
Les composant graphiques: Les interfaces graphiques sont souvent appels GUI (pour Graphical User Interface en Anglais) Il existe deux principaux types de composants susceptibles dintervenir dans une interface graphique :
les conteneurs qui sont destins contenir dautres composants, comme par exemple les fentres ; les composants atomiques qui sont des composants qui ne peuvent pas en contenir dautres, comme par exemple les boutons.
146
Java offre des facilits pour construire des interfaces graphiques grce aux deux bibliothques :
AWT (Abstract Window Toolkit, JDK 1.1) Swing (JDK/SDK 1.2).
Il est conseill dimporter systmatiquement toutes les classes des paquetages pour viter linterrogation sur la rpartition des classes utilises des diffrents paquetages import java.awt.*; import javax.swing.*;
El Mostafa DAOUDI- p. 293
Les fentres graphiques : la classe JFrame La classe standard Jframe , du paquetage javax.swing, permet de crer des fentres graphiques. Elle dispose de deux constructeurs : - et un constructeur avec un argument JFrame fen = new JFrame (" Ma Premiere fenetre " ); cre une fentre (un objet de type Jframe ) qui qui a pour titre " Ma Premiere fenetre " - et un constructeur sans argument JFrame fen = new JFrame (); cre une fentre sans titre.
Les instructions JFrame fen = new JFrame() ; fen.setTitle("Une fentre") ; Est quivalente l'instruction JFrame fen = new JFrame("Une fentre") ;
El Mostafa DAOUDI- p. 294
147
fen.setTitle("Ma Premiere fenetre "); // Affecte le titre Ma premiere fenetre la fentre et laffiche dans la barre des titres de la fentre). fen.setSize(300,150); // Modifie la taille d'un composant. La dimension de la fentre est 300*150 pixels (largeur =300 et hauteur=150 pixels). Elle sera place dans le coin suprieur gauche de lcran. Elle est place au pixel de coordonnes (0,0). fen.setBounds(200,300,400,200); // Modifie la position et la taille d'un composant Le coin suprieur gauche de la fentre est plac au pixel de coordonnes (200, 300) et ses dimensions seront de 400 *200 pixels. fen.setVisible(true); // rend visible la fentre de rfrence fen
El Mostafa DAOUDI- p. 296
148
Remarques Une fentre de type Jframe peut tre redimensionne, dplace, et rduite une icne (comme une fente Windows). La fermeture d'une fentre de type JFrame ne met pas fin au programme, mais rend simplement la fentre invisible. Pour mettre fin au programme lorsquon ferme la fentre, on peut appeler la mthode
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Exemple: fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // met fin au programme lorsque la fentre se ferme
El Mostafa DAOUDI- p. 297
Cration dune classe fentre personnalise On notre propre classe dfinir notre propre classe, par exemple MaFenetre qui drive de la classe JFrame et crer un objet de type MaFenetre Exemple: Afficher une fentre:
import java.awt.*; import javax.swing.*; class MaFenetre extends JFrame { // classe fentre personnalise public MaFenetre() { setTitle("Ma Premiere fenetre "); //initialisation du titre de la fentre setSize(300,150); // positione la fentre lcran } } public class TestFenetre { public static void main(String[] args) { JFrame fen = new MaFenetre(); fen.setVisible(true); // rend visible la fentre de rfrence fen } }
El Mostafa DAOUDI- p. 298
149
Programmation vnementielle
Dans la programmation squentielle les instructions du programme principal sont excutes les unes aprs les autres dans lordre de leurs criture. Dans la programmation vnementielle, le programme est dirig par les vnements Lutilisateur dirige lordre dexcution des instructions en cliquant o il veut. Le programme ragit aux actions de lutilisateur Ds que vous lancez un programme avec interface graphique : une boucle infinie est gnre le programme attend les vnements (enfoncer une touche du clavier, cliquer avec la souris etc.) Attrape et traite les vnements quand ils se produisent.
150
Evnement = Objet construit par le systme en rponse une action de lutilisateur et qui contient toutes les informations concernant cette action Exemples: Action de lutilisateur dans la fentre de lapplication clic souris : connaissances des coordonnes du point de clic frappe dun caractre : connaissance du caractre frapp
Traitement des vnements En Java tout vnement a une source. On appelle source dun vnement lobjet qui a gnr cet vnement (exemple bouton, fentre, ...). Exemple de type dvnements Lvnement mis suite un clic souris dans une fentre est de type MouseEvent Lvnement mis suite un clic souris sur un bouton est de type ActionEvent
151
Ecouteurs Pour traiter un vnement, on associe la source, des objets particuliers appels couteurs. Par exemple on associe au bouton un couteur qui va couter si le bouton est cliqu ou non. En fonction des vnements quils traitent, un couteur doit implmenter une interface particulire, drive de linterface EventListener, qui correspond une catgorie dvnements. Exemple: Linterface MouseListener correspond une catgorie dvnements souris. Elle comporte cinq mthodes correspondant chacune un vnement souris particulier.
El Mostafa DAOUDI- p. 303
public interface MouseListener extends EventListener { public void mousePressed(MouseEvent e) ; /* appel lorsquun bouton de la souris est press sur un composant largument e de type MouseEvent correspond lobjet vnement gnr */ public void mouseReleased(MouseEvent e) ; /* appel lorsquun bouton de la souris est relch sur un composant */ public void mouseClicked(MouseEvent e) ; /* appel lors dun clic souris sur un composant (la souris na pas t dplace entre lappui et le relchement du bouton) */ public void mouseEntered(MouseEvent e) ; /* appel lorsque la souris passe de lextrieur lintrieur dun composant */ public void mouseExited(MouseEvent e) ; /* appel lorsque la souris sort dun composant (la souris passe de lintrieur lextrieur du composant) */ }
152
Gestion de clics dans une fentre, chaque clic dans la fentre, le message clic dans la fenetre saffiche. Version 1: import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; import javax.swing.event.* ; class MaFenetre extends JFrame { public MaFenetre () { setTitle("Gestion des clics "); setBounds(10,20,300,100); addMouseListener(new EcouteurSouris()); // la fentre fait appel un couteur dvnements souris // pour traiter les clics souris } }
//Lcouteur dvnements souris doit implmenter linterface MouseListener qui correspond une catgorie dvnements souris. class EcouteurSouris implements MouseListener { //Redfinition de la mthode appele lors dun clic souris public void mouseClicked(MouseEvent e) { System.out.println("clic dans la fenetre"); } //La redfinition des autres mthodes est "vide" public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }
153
2me version: Largument e de type MouseEvent correspond lobjet vnement gnr dans la fentre lors dun clic souris. On peut connatre la position du click dans la fentre grce aux mthodes getX() et getY() class EcouteurSouris implements MouseListener { //Redfinition de la mthode appele lors dun clic souris public void mouseClicked(MouseEvent e) { System.out.println("clic au point :("+e.getX()+ "," +e.getY()+ ")" ); } //La redfinition des autres mthodes est "vide" public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }
El Mostafa DAOUDI- p. 307
Version 3: La classe fentre personnalise qui implmente MouseListner import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; import javax.swing.event.* ; class MaFenetre extends JFrame implements MouseListener { public MaFenetre () { setTitle("Gestion des clics "); setBounds(10,20,300,100); addMouseListener(this); // la fentre est son propre couteur dvnements souris } public void mouseClicked(MouseEvent e) { //Largument e correspond lobjet vnement gnr dans la fentre lors dun clic souris. int x = e.getX() ; int y = e.getY() ; //x et y coordonnes du curseur de la souris au moment du clic System.out.println("clic dans la fenetre au point de coordonnees "+x+","+y); } // La redfinition des autres mthodes est "vide" public void mousePressed(MouseEvent e) { } }
El Mostafa DAOUDI- p. 308
154
La notion dadaptateur Pour chaque interface XXXListener (par exemple MouseListener) possdant plusieurs mthodes, Java fournit une classe particulire XXXAdapter (par exemple MouseAdpter), appele adaptateur, qui implmente toutes les mthodes de linterface avec un corps vide. Pour dfinir un couteur dvnements de type XXXEvent (par exemple MouseEvent), il suffit alors de driver l'couteur de la classe XXXAdapter (par exempe MouseAdapter) et de redfinir uniquement les mthodes voulues.
Exemple: class MaFenetre extends JFrame { public MaFenetre () { super("Une fenetre qui traite les clics souris") ; setSize(300, 200) ; addMouseListener(new EcouteurSouris()); } } class EcouteurSouris extends MouseAdapter { //redfinition uniquement de la mthode appele lors dun clic souris public void mouseClicked(MouseEvent e) { System.out.println("clic dans la fenetre") ; } }
155
Ajout dun composant qui permet d'afficher du texte, on utilise la classe Jlabel qui reprsente un composant capable d'afficher un texte non modifiable. JLabel label = new JLabel ("Hello World !"); Container c = f.getContentPane(); c.add (label);
156
Afficher du text dans une fentre : On utilise le constructeur de la classe Jlabel pour afficher du texte dans une fentre . import javax.swing.*; import java.awt.*; class MaFenetre extends JFrame { public MaFenetre() { setTitle(" Fente avec du texte "); setSize(300,200); Container c=getContentPane(); c.setLayout(new FlowLayout()); monLabel = new JLabel ("Bonjour !"); Container cc = getContentPane(); c.add(monLabel); } private JLabel monLabel; }
El Mostafa DAOUDI- p. 313
public class TestFenetre { public static void main(String[] args) { JFrame fen = new MaFenetre(); fen.setVisible(true); } }
157
Lajout dun bouton dans le contenu dune fentre se passe en trois tapes 1. Crer une instance de la classe JButton : JButton monBouton = new JButton () ; 2. On utilise la mthode getContentPane() qui retourne une rfrence, de type Container, sur le contenu de la fentre. Par exemple: Container c= fen.getContentPane(); //ou fen est rfrence une fentre 3. On ajoute un composant dans le contenu dune fentre (un objet de type Container) en utilisant la mthode add de la classe Container. Par exemple : c.add(monBouton); // permet dajouter lobjet de rfrence monBouton dans le contenu de rfrence c.
El Mostafa DAOUDI- p. 315
4. On supprime composant dans le contenu dune fentre (un objet de type Container) en utilisant la mthode remove de la classe Container. Par exemple : c.remove(monBouton); // permet de supprimer lobjet de rfrence monBouton dans le contenu de rfrence c. 5. La mthode setPreferredSize permet d'imposer une taille un composant. Exemple: monBouton.setPreferredSize(new Dimension(10, 20)) ; //bouton de largeur 10 et de hauteur 20 6. Le gestionnaire de la classe FlowLayout permet de disposer les composants un cot de lautre et ligne par ligne. La mthode setLayout(new FlowLayout()); permet dutiliser ce gestionnaire Exemple: c.setLayout(new FlowLayout()) ; //c: rfrence un Container
158
Ajout dun bouton dans une fentre: On utilise le constructeur de la classe JButton pour crer un bouton. Le contenu de la clase fentre qui sera modifi. La classe de la mthode main() reste inchang. import javax.swing.*; import java.awt.*; class MaFenetre extends JFrame { public MaFenetre() { setTitle(" Premier Bouton "); setSize(300,200); Container c=getContentPane(); c.setLayout(new FlowLayout()); monBouton = new JButton("Un Bouton"); c.add(monBouton); // cration dun bouton de rfrence monBouton portant ltiquette Un bouton // ou tout simplement getContentPane().setLayout(new FlowLayout()); // getContentPane().add(monBouton); } private JButton monBouton; }
public class TestFenetre { public static void main(String[] args) { JFrame fen = new MaFenetre(); fen.setVisible(true); } }
159
Ajout de deux bouton dans une fentre: import javax.swing.*; import java.awt.*; class MaFenetre extends JFrame { public MaFenetre() { setTitle(" Plusieurs boutons "); setSize(300,200); boutJaune = new JButton("Bouton A"); boutVert = new JButton("Bouton B"); getContentPane().add(boutJaune); getContentPane().add(boutVert); getContentPane().setLayout(new FlowLayout()); boutJaune.setBackground(Color.yellow); // La couleur de fond du composant de label Bouton A devienne jaune boutVert.setBackground(Color.green); // La couleur de fond du composant de label Bouton A devienne verte } private JButton boutJaune, boutVert; }
Gestion des vnements sur des boutons Un bouton ne peut dclencher quun seul vnement de type ActionEvent. Linterface ActionListener ne comporte quune seule mthode actionPerformed.
Cest lintrieur de lactionPerformed que nous crirons le code qui sexcutera lors du click.
160
Exemple: Clic sur un bouton affiche Action sur Bouton Essai import javax.swing.*; import java.awt.*; import java.awt.event.*; class MaFenetre extends JFrame implements ActionListener{ public MaFenetre() { setTitle(" Premier Bouton "); setSize(300,200); monBouton = new JButton("Essai"); getContentPane().setLayout(new FlowLayout()); getContentPane().add(monBouton); monBouton.addActionListener(this); //gre laction de lutilisateur sur le bouton MonBouton } public void actionPerformed (ActionEvent ev){ System.out.println("Action sur Bouton Essai "); } private JButton monBouton; }
El Mostafa DAOUDI- p. 321
Exemple: Mme classe couteur pour tous les boutons, le clique sur un bouton affiche le mme message Action sur Bouton Essai import javax.swing.*; import java.awt.*; import java.awt.event.*; class MaFenetre extends JFrame implements ActionListener{ public MaFenetre() { setTitle(" Deux boutons "); setSize(300,200); getContentPane().setLayout(new FlowLayout()); monBoutonA = new JButton("Bouton A"); getContentPane().add(monBoutonA); monBoutonA.addActionListener(this); monBoutonB = new JButton("Bouton B"); getContentPane().add(monBoutonB); monBoutonB.addActionListener(this); } public void actionPerformed (ActionEvent ev){ System.out.println("Action sur un Bouton Essai"); } private JButton monBoutonA, monBoutonB; }
El Mostafa DAOUDI- p. 322
161
Exemple: Mme classe couteur pour tous les boutons. Laffiche personnalis. Laffichage dpend du bouton cliqu import javax.swing.*; import java.awt.*; import java.awt.event.*; class MaFenetre extends JFrame implements ActionListener{ public MaFenetre() { setTitle(" Premier Bouton "); setSize(300,200); monBoutonA = new JButton("Bouton A"); monBoutonB = new JButton("Bouton B"); Container contenu=getContentPane(); contenu.setLayout(new FlowLayout()); contenu.add(monBoutonA); contenu.add(monBoutonB); monBoutonA.addActionListener(this); monBoutonB.addActionListener(this); }
El Mostafa DAOUDI- p. 323
public void actionPerformed (ActionEvent ev){ //utilisation de la mthode getSource de la classe EventObject qui fournit une rfrence de type Object sur la source de lvnement concern if (ev.getSource()==monBoutonA) System.out.println("Action sur un BoutonA"); if (ev.getSource()==monBoutonB) System.out.println("Action sur un BoutonB"); } private JButton monBoutonA, monBoutonB; }
162
Exemple: Une classe couteur pour chaque bouton. Par exemple, le clic sur le bouton 1 ferme la fentre, le clic sur le bouton 2 affiche le message action sur le bouton 2 import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; import javax.swing.event.* ; class MaFenetre extends JFrame{ private JButton monBouton, boutonQuitter ; public MaFenetre () { super("Plusieurs boutons") ; setSize(300, 200) ; Container contenu = getContentPane() ; boutonQuitter = new JButton(" Quitter ") ; contenu.add(boutonQuitter) ; monBouton= new JButton("Bouton ") ; contenu.add(monBouton) ; contenu.setLayout(new FlowLayout()); monBouton.addActionListener(new EcouteurBouton()); boutonQuitter.addActionListener(new EcouteurQuitter()); } }
El Mostafa DAOUDI- p. 325
class EcouteurBouton implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Action sur le bouton") ; } } class EcouteurQuitterimplements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Vous avez appuyez sur le bouton Quitter") ; System.exit(0); } }
163
import javax.swing.*; import java.awt.*; import java.awt.event.*; class MaFenetre extends JFrame { // implements ActionListener{ public MaFenetre() { setTitle(" Bouton Dynamic "); setSize(300,200); Container contenu=getContentPane(); contenu.setLayout(new FlowLayout()); creeBouton=new JButton ("CREATION BOUTON"); contenu.add(creeBouton); EcouteCreeBouton e=new EcouteCreeBouton (contenu); creeBouton.addActionListener(e); } private JButton creeBouton; }
El Mostafa DAOUDI- p. 327
class EcouteCreeBouton implements ActionListener { public EcouteCreeBouton (Container contenu){ this.contenu=contenu; } public void actionPerformed(ActionEvent ev) { JButton nouvBout=new JButton("Bouton"); contenu.add(nouvBout); contenu.validate(); } private Container contenu; } public class TestFenetre { public static void main(String[] args) { JFrame fen = new MaFenetre(); fen.setVisible(true); // rend visible la fentre de rfrence fen } }
El Mostafa DAOUDI- p. 328
164
Exemple import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; import javax.swing.event.* ; class MaFenetre extends JFrame { private JCheckBox maCase1, maCase2, maCase3; public MaFenetre () { super("Une fenetre avec une case") ; setBounds(10,40,300,200) ; maCase1 = new JCheckBox( Case1") ;
// cration dune case cocher de rfrence maCase1 portant ltiquette Case1
getContentPane().add(maCase1) ;
maCase2 = new JCheckBox( Case2") ; getContentPane().add(maCase2) ; maCase3 = new JCheckBox( Case3") ; getContentPane().add(maCase3) ;
getContentPane().setLayout(new FlowLayout()); } }
165
Exemple:
import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; class FenCoches extends JFrame implements ActionListener{ public FenCoches (){ setTitle ("Exemple de cases a cocher") ; setSize (400, 100) ; Container contenu = getContentPane() ; contenu.setLayout (new FlowLayout()) ; coche1 = new JCheckBox ("case 1") ; contenu.add(coche1) ; coche1.addActionListener (this) ; tat = new JButton ("tat") ; contenu.add(tat) ; tat.addActionListener (this) ; } public void actionPerformed (ActionEvent ev){ Object source = ev.getSource() ; if (source == coche1) System.out.println ("action case 1") ; if (source == tat) System.out.println ("tat CASES : " + coche1.isSelected()) ; } private JCheckBox coche1 ; private JButton tat ; }
El Mostafa DAOUDI- p. 331
public class TestGraphique { public static void main(String[] args) { JFrame fen = new FenCoches(); fen.setVisible(true); fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
166
tat dun bouton radio Ltat dun bouton radio un instant donn sobtient exactement comme celui dune case cocher, par la mthode isSelected. De mme, on peut imposer un bouton un tat donn en recourant la mthode setSelected : L encore, pour attribuer un tat initial un bouton radio, il est prfrable dutiliser le constructeur plutt que setSelected.
167
import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; class MaFenetre extends JFrame implements ActionListener{ public MaFenetre (){ setTitle ("Exemple de boutons radio") ; setSize (400, 400) ; Container contenu = getContentPane() ; contenu.setLayout (new FlowLayout()) ; ButtonGroup groupe = new ButtonGroup() ; radio1 = new JRadioButton ("Radio 1", true) ; groupe.add(radio1) ; contenu.add(radio1) ; radio1.addActionListener (this) ; radio2 = new JRadioButton ("Radio 2") ; groupe.add(radio2) ; contenu.add(radio2) ; radio2.addActionListener (this) ; radio3 = new JRadioButton ("Radio 3") ; groupe.add(radio3) ; contenu.add(radio3) ; radio3.addActionListener (this) ; tat = new JButton ("tat") ; contenu.add(tat) ; tat.addActionListener (this) ; }
public void actionPerformed (ActionEvent ev){ Object source = ev.getSource() ; if (source == radio1) System.out.println ("action radio 1") ; if (source == radio2) System.out.println ("action radio 2") ; if (source == radio3) System.out.println ("action radio 3") ; if (source == tat) System.out.println ("tat RADIOS : " + radio1.isSelected() + " " + radio2.isSelected() + " " + radio3.isSelected()) ; } private JRadioButton radio1, radio2 ,radio3 ; private JButton tat ; }
168
public class TestGraphique { public static void main(String[] args) { JFrame fen = new FenCoches(); fen.setVisible(true); fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
L'utilisateur peut choisir une valeur dans la bote de liste qui s'affiche
169
Exemple: String[] couleurs = {"rouge", "bleu", "gris", "vert", "jaune", "noir" }; Container contenu = getContentPane() ; contenu.setLayout (new FlowLayout() ) ; JComboBox combo = new JComboBox(couleurs) ; contenu.add(combo) ; L'utilisateur peut alors y entrer soit une valeur de la liste (en la slectionnant), soit une valeur de son choix (en la saisissant). On peut limiter le nombre dlments afficher laide de la mthode setMaximumRowCount () ; Exemple: combo. setMaximumRowCount (4) ; limite le nombre dlments afficher 4. on peut forcer la slection dun lment de rang donn par la methode setSelectedIndex () Exemple: ; combo. setSelectedIndex (2) // slection pralable de llment de rang 2
El Mostafa DAOUDI- p. 339
La mthode getSelectedItem() fournit la valeur slectionne. Elle fournit un rsultat de type Object quil faudra souvent convertir en ch Object valeur = combo.getSelectedItem() ; System.out.println ((String) valeur) ; volution dynamique de la liste dune bote combo: La bote combo dispose de mthodes appropries sa modification. La mthode addItem permet dajouter une nouvelle valeur la fin de la liste : combo.addItem ("orange") ; // ajoute orange en fin de la liste combo La mthode removeItem permet de supprimer une valeur existante: combo.removeItem ("gris") ; // supprime orange de la liste combo
El Mostafa DAOUDI- p. 340
170
Exemple: import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; class MaFenetre extends JFrame implements ActionListener, ItemListener{ public MaFenetre(){ setTitle ("Essais boite combinee") ; setSize (300, 200) ; Container contenu = getContentPane() ; contenu.setLayout (new FlowLayout() ) ; combo = new JComboBox(couleurs) ; contenu.add(combo) ; combo.setMaximumRowCount(4) ; combo. setSelectedIndex (5); combo.addActionListener (this) ; combo.addItemListener (this); }
El Mostafa DAOUDI- p. 341
public void actionPerformed (ActionEvent e){ System.out.print ("action combo : ") ; Object valeur = combo.getSelectedItem() ; System.out.println ((String) valeur) ; } public void itemStateChanged (ItemEvent e){ System.out.print ("item combo : ") ; Object valeur = combo.getSelectedItem() ; System.out.println ((String) valeur) ; } private String[] couleurs = {"rouge", "bleu", "gris", "vert", "jaune", "noir" }; private JComboBox combo ; }
El Mostafa DAOUDI- p. 342
171
public class TestGraphique { public static void main(String[] args) { JFrame fen = new MaFenetre(); fen.setVisible(true); fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
172
Exemple: import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; class MaFenetre extends JFrame implements ActionListener{ public MaFenetre () { setTitle ("Saisie de texte") ; setSize (300, 120) ; Container contenu = getContentPane() ; contenu.setLayout (new FlowLayout() ) ; saisie = new JTextField (20) ; contenu.add(saisie) ; saisie.addActionListener(this) ; bouton = new JButton ("COPIER") ; contenu.add(bouton) ; bouton.addActionListener(this) ; copie = new JTextField (20) ; copie.setEditable(false); contenu.add(copie) ; }
El Mostafa DAOUDI- p. 345
public void actionPerformed (ActionEvent e){ if (e.getSource() == bouton){ String texte = saisie.getText() ; copie.setText(texte) ; } } private JTextField saisie, copie ; private JButton bouton ; }
173
174
Map<K,V
SortedSet
El Mostafa DAOUDI- p. 349
175
3. Les Classes concrtes - ArrayList: hrite de AbstractList, implmente linterface List (tableau de taille variable) - LinkedList: hrite de AbstractSequentialList, implmente linterface List (Liste chaine) - HashSet: hrite de AbstractSet, implmente linterface Set (table de hachage) - TreeSet: hrite de AbstractSet, implmente linterface Set (arbre balance) - HashMap<K,V>: hrite de AbstractMap<K,V>,implmente linterface Map<K,V> (table de hachage) - TreeMap<K,V>, implmente linterface Map<K,V> (arbre balance)
4. Les classes tudies Nous tudierons essentiellement les classes ArrayList comme classe d'implmentation de Collection LinkedList comme classe d'implmentation de Collection
176
III. L' interface Collection Linterface Collection , correspond un objet qui contient un groupe dobjets. Ces objets ne sont pas ncessairement de mme type. Elle permet de manipuler toutes les collections de faon unifie, et regroupe les mthodes communes toutes les collections : Aucune classe du JDK nimplmente directement cette interface N.B. Toutes les collections peuvent tre parcourues l'aide d'un itrateur (interface Iterator ), un objet qui assure que tous les lments de la collection soient atteints.
El Mostafa DAOUDI- p. 353
177
A partir du JDK 5, les conversions entre les types primitifs et les classes enveloppantes peuvent tre implicite. Lexemple prcdent peut scrire de manire plus simple:
int j=10; l.add(new Integer(10)); l.add(j); l.add(10); int i = l.get(0).intValue(); int i = l.get(0);
178
V. Linterface List
Linterface List, hrite de Collection. Elle dfinie la notion de squence: c'est--dire chaque lment de la collection a un rang. Les objets sont indexs par des numros (en commenant par 0). Les Classes qui implmentent linterface List : Vector, ArrayList; tableau taille variable (tableau dynamique) LinkedList; liste chane Choix des classes: On utilise le plus souvent Vector/ArrayList Mais si les insertions/suppressions au milieu de la liste sont frquentes, dans ce cas LinkedList est plus utile car elle vite les dcalages.
Les Nouvelles mthodes de List Object get(int i); // retourne llment dindice i . Object set(int i, Object o); // modifie llment en position i . void add(int i, Objet o); // insertion de lobjet o lindice i avec // dcalage vers la droite. Object remove(int index); // supprime llment dindice i avec // dcalage vers la gauche. int indexOf(Object o); // retourne lindice du 1er lment gal o // au sens de equals (ou -1). int lastIndexOf(Object obj); // retourne lindice du dernier lment gal o // au sens de equals (ou -1). ListIterator listIterator(); // construction dun itrateur pour parcourir la // liste (litrateur est positionn au dbut de la liste). ListIterator listIterator(int i); // i = indice du dbut de litrateur. List subList(int dbut, int fin); // Extraction dune sous liste allant de // debut jusqu (fin-1). dbut est inclut mais fin est exclut
179
import java.util.*; class Personne { // on dfini la classe Personne) private String nom; public Personne(String nom) { this.nom=nom; } public String getObjet(){ return "Personne "+nom; } }
180
public class TestCollection { public static void main(String[] args) { ArrayList liste = new ArrayList(); Personne p = new Personne("Mohamed"); liste.add(p); // on ajoute dautres objets de type Personne for (int i=0; i<liste.size();i++) System.out.println((liste.get(i)).getObjet()); } } Ne passe pas la compilation. Pourquoi ?? liste.get(i) retourne un objet de type Object
El Mostafa DAOUDI- p. 361
Pour que a marche on doit faire des casts public class TestCollection { public static void main(String[] args) { ArrayList liste = new ArrayList(); Personne p1 = new Personne(" Mohamed"); liste.add(p1); // . on ajoute dautres objets de type Personne for (int i=0; i<liste.size();i++) { System.out.println(((Personne)liste.get(i)).getObjet()); } }
El Mostafa DAOUDI- p. 362
181
Exemple2 dArrayList: la liste contient plus quun type: Dans cette exemple, on suppose que la collection contient deux types dobjets: Personne et Livre .
import java.util.*; class Personne { private String nom; public Personne(String nom) { this.nom=nom; } public String getObjet(){ return "Personne "+nom; } } class Livre { private int inv; public Livre(int inv) { this.inv=inv; } public String getObjet(){ return "Livre "+inv; } }
public class TestCollection { public static void main(String[] args) { ArrayList liste = new ArrayList(); Personne p = new Personne(" Mohamed"); liste.add(p); Livre liv = new Livre(12); liste.add(liv); for (int i=0; i<liste.size();i++) { System.out.println((liste.get(i)).getObjet()); } } } Ne passe pas la compilation. Pourquoi ?? liste.get(i) retourne un objet de type Object
182
Pour que a marche on doit faire des casts public class TestCollection { public static void amain(String[] rgs) { ArrayList liste = new ArrayList(); Personne p = new Personne(" Mohamed"); liste.add(p); Livre liv = new Livre(12); liste.add(liv); for (int i=0; i<liste.size();i++) { if (liste.get(i) instanceof Personne) System.out.println(((Personne)liste.get(i)).getObjet()); if (liste.get(i) instanceof Livre) System.out.println(((Livre)liste.get(i)).getObjet()); } } }
El Mostafa DAOUDI- p. 365
V.2 Les listes chaines La classe LinkedList La classe LinkedList permet de manipuler des listes dobjets doublement chaines: chaque lment de la collection, on associe les rfrences aux lments prcdent et suivant. Une telle collection peut tre parcourue laide dun itrateur bidirectionnel de type ListIterator. La taille d'une LinkedList n'est pas fixe : on peut ajouter et enlever des lments.
183
Constructeurs La classe LinkedList possde: - un constructeur sans paramtre: cration dune liste vide LinkedList liste= new LinkedList () - un constructeur qui demande en paramtre une collection: cration dune liste qui sera initialise avec les lments de la collection fournie en paramtre. Exemple: Soi c une collection de type ArrayList LinkedList liste= new LinkedList (c); Cration de la liste liste forme de tous les lments de la collection c.
184
12:19
Exemple : public class TestCollection { public static void main(String[] args) { LinkedList liste = new LinkedList(); Personne p = new Personne(" Mohamed"); liste.add(p); p = new Personne("Ali"); liste.add(p); Livre v = new Livre(123); liste.add(v); p = new Personne("Fatima"); liste.add(p); v = new Livre(542); liste.add(v); System.out.println((liste.getFirst()).getObjet()); System.out.println((liste.getLast()).getObjet()); } }
185
Pour que a marche on doit faire des casts public class TestCollection { public static void main(String[] args) { LinkedList liste = new LinkedList(); Personne p = new Personne("Mohamed"); liste.add(p); p = new Personne("Ali"); liste.add(p); Livre v = new Livre(123); liste.add(v); p = new Personne("Fatima"); liste.add(p); v = new Livre(542); liste.add(v); v = new Livre(222); liste.add(v); System.out.println(((Personne)liste.getFirst()).getObjet()); System.out.println(((Livre)liste.getLast()).getObjet()); } }
El Mostafa DAOUDI- p. 371
Une liste chane gre une collection de faon ordonne : l'ajout d'un lment peut se faire au dbut ou la fin de la collection. L'ajout d'un lment aprs n'importe quel lment est li la position courante lors d'un parcours : Pour rpondre ce besoin, l'interface qui permet le parcours de la collection est une sous classe de l'interface Iterator : l'interface ListIterator.
186
12:19
187
Exemple: parcours dune liste de type ArrayList sans itrateur : On reprend lexemple avec la classe Personne public class TestCollection { public static void main(String[] args) { ArrayList liste = new ArrayList(); Personne p = new Personne("Mohamed"); liste.add(p); // on ajoute dautres objets de type Personne int i=0; for ( Object e:liste) { // java 5 System.out.println(((Personne)liste.get(i)).getObjet()); i++; } }
El Mostafa DAOUDI- p. 376
188
Exemple: parcours dune liste de type ArrayList avec un itrateur: On reprend lexemple avec la classe Personne public class TestCollection { public static void main(String[] args) { ArrayList liste = new ArrayList(); Personne p = new Personne("Mohamed"); liste.add(p); // on ajoute dautres objets de type Personne Iterator it = liste.iterator(); // on cre un itrateur pour la collection liste int i=0; while (it.hasNext()){ System.out.println(((Personne)liste.get(i)).getObjet()); it.next(); i++; } } Remarque : Pour le parcours des tableaux, on utilise laccs direct par les mthodes get() ou set() au lieu des itrateurs .
Exemple: parcours dune liste de type LinkedList avec un itrateur: On reprend lexemple avec la classe Personne public class TestCollection { public static void main(String[] args) { LinkedList liste = new LinkedList(); Personne p = new Personne("Mohamed"); liste.add(p); // on ajoute dautres objets de type Personne Iterator it = liste.iterator(); // on cre un itrateur pour la collection liste int i=0; while (it.hasNext()){ System.out.println(((Personne)liste.get(i)).getObjet()); it.next(); i++; } }
El Mostafa DAOUDI- p. 378
189
Remarque 2:
Comme les iterator sont utiliss pour faire des mises jour dans la liste, une exception de type CurrentModificationException leve si un iterator parcours la liste alors qu'un autre fait des mises jour (ajout ou suppression d'un lment dans la liste). Pour grer facilement cette situation, il est prfrable si l'on sait qu'il y a des mises jour faire de n'avoir qu'un seul iterateur qui soit utilis. Une exception de type CurrentModificationException est aussi leve si une mise jour intervient lors du parcours de la collection.
190
Les mthodes ajoutes dans cette interface sont les suivantes : boolean hasPrevious() ; // teste s'il existe un lment avant le curseur. Object previous(); // renvoie l'lment avant le curseur, s'il existe. void add(Object o); // ajoute un lment avant le curseur. int nextIndex(); // revoie l'index (le rang) de l'lment avant le curseur. int previousIndex(); // renvoie l'index (le rang) de l'lment aprs le curseur. - void set(Object o); // remplace le dernier lment, retourn par previousIndex() ou nextIndex(), par lobjet o .
Exemple: Parcours dune liste chaine - voici comment nous pourrons la parcourir lenvers :
ListIterator iter ; iter = l.listIterator (l.size()) ; /* position courante : fin de liste*/ while (iter.hasPrevious()) { Object o = iter.previous () ; // utilisation de lobjet courant o } - voici comment nous pourrons la parcourir du dbut vers la fin : ListIterator iter ; iter = l.listIterator () ; /* position courante : dbut de la liste */ while (iter.hasNext()) { Object o = iter.next() ; // utilisation de lobjet courant o }
El Mostafa DAOUDI- p. 382
191
VIII. Classes Gnriques La gnricit permet de rendre un programme plus stable en dtectant certaines erreurs ds la compilation. La gnricit est trs utilise avec les collections mais peut tre aussi utilise sans les collections. Exemple : une boite dans laquelle on peut mettre un objet. class Boite{ private Object o; public void add(Object o) { this.o = o; } public Object get() { return o; } }
El Mostafa DAOUDI- p. 383
Test 1: On veut se restreindre aux objets de type Personne . public class TestBoite { public static void main(String[] args) { Personne p=new Personne("Mohamed"); Boite b= new Boite(); b.add(p);
192
public class TestBoite { public static void main(String[] args) { Personne p=new Personne("Mohamed"); Boite b= new Boite(); b.add(p);
Test 2: Que se passe til si on fait cast non correcte. Par exempe public class TestBoite { public static void main(String[] args) { Personne p=new Personne("Mohamed"); Boite b= new Boite(); b.add(p);
193
- La gnricit permet de dtecter certaines erreurs ds la compilation. - La gnricit est trs utilise avec les collections. - Si la classe Boite est conue avec la gnricit, cette erreur peut tre dtecte la compilation .
- On peut dclarer une classe gnrique comme suit (cest utilisable aussi pour dfinir des interfaces gnriques) (Java 5). class Boite <T> { private T t; // T stands for "Type" public void (T t) { this.t = t; } public T get() { return t; } }
194
T est une variable qui peut reprsenter une classe ou une interface. Cest un paramtre formel de type. Chaque occurrence de Object a t remplace par T. La variable T dclare dans lentte peut tre utilise nimporte o dans la classe. Dclaration Boite<Personne> b; // Cette dclaration indique que b contiendra une rfrence une boite contenant des objets instances de Personne . // on parle de type paramtr Cration de lobjet b= new Boite<Personne>();
Dans ce cas peut appeler les mthodes sans faire de cast : public class TestBoite { public static void main(String[] args) { Personne p = new Personne("Mohamed"); Boite<Personne> b = new Boite<Personne>(); b.add(p); System.out.println((b.get()).getObjet()); } }
195
La gnricit permet de paramtrer une classe avec un ou plusieurs types de donnes On peut par exemple donner en paramtre le type des lments dun Arraylist : ArrayList<E> E est un paramtre de type formel Il pourra tre remplac par un argument de type concret pour typer des expressions ou crer des objets : ArrayList<Integer> l = new ArrayList<Integer>();
les collections pouvait contenir nimporte quel objet. Il tait impossible dindiquer quune liste ne contenait que des instances dun certain type, par exemple des Livres Certaines erreurs ne pouvaient tre dtects la compilation mais seulement pendant lexcution. Il faire des castes pour pouvoir utiliser les mthodes qui ne sont pas dfinies dans la classe Object Si on veux viter ces problmes (viter les casts et vrifier les types la compilation), on utilise la gnricit.
196
Remarques: Avant le JDK 5.0, les collections peuvent contenir des objets de nimporte quel type. Mais partir du JDK 5.0, on peut indiquer le type des objets contenus dans une collection grce la gnricit : Exemple: List <Livre> c; // dclare que c est une collection (List) dobjets de type Livre.
L' interface Collection et drives Linterface Collection<E> , o E est le type des lments, correspond un objet qui contient un groupe dobjets de type E.
197
Linterface List<E> List <E>, hrite de Collection <E>, Il s'agit de la notion de squence, c'est--dire une collection o chaque lment a un rang. Les objets sont indexs par des numros (en commenant par 0) Les Classes qui implmentent cette interface : ArrayList<E>; tableau taille variable LinkedList<E>; liste chane Choix des classes: On utilise le plus souvent ArrayList<E> Mais si les insertions/suppressions au milieu de la liste sont frquentes, dans ce cas LinkedList<E> est plus utile car elle vite les dcalages.
Les Nouvelles mthodes de List<E> void add(int i, E e); // insertion de llment e lindice i avec dcalage vers la droite. E get(int i); // retourne llment dindice i E set(int i, E elt); // modifie llment en position i E remove(int i); // suppression de llment dindice i avec dcalage vers la gauche. int indexOf(E e); // indice du 1er lment gal e (au sens // de equals) (ou -1) int lastIndexOf(E e); // indice du dernier lment gal e (au sens // de equals) (ou -1) ListIterator<E> listIterator(); // parcours de la liste ListIterator<E> listIterator(int i); // i = indice du dbut List<E> subList(int dbut, int fin); // Extraction dune sous liste allant de debut jusqu (fin-1). dbut est inclut mais fin est exclut
El Mostafa DAOUDI- p. 396
198
vecteur dynamique vide: un constructeur sans paramtres ArrayList <E> v1 = new ArrayList <E> () ; vecteur dynamique en fixant la taille initiale ArrayList <E> v2 = new ArrayList <E> (n) ;
vecteur dynamique contenant les lments de la collection c
Exemple: public class TestCollection { public static void main(String[] args) { ArrayList<Personne> liste = new ArrayList<Personne>(); Personne p = new Personne("Mohamed"); liste.add(p); // on ajoute dautres objets de type Personne for (int i=0; i<liste.size();i++) { System.out.println((liste.get(i)).getNom()); } } } Ici on na pas besoin de faire le caste, car lobjet retourn est de type Personne .
El Mostafa DAOUDI- p. 398
199
- un constructeur sans paramtre: cration dune liste vide LinkedList<E> liste = new LinkedList <E>() - un constructeur qui demande en paramtre une collection: cration dune liste qui sera initialise avec les lments de la collection fournie en paramtre. LinkedList <E> liste = new LinkedList<E> (c); Cration de la liste l1 forme de tous les lments de la collection c.
Exemple : LinkedList <E> listeChainee = new LinkedList<E> (); listeChainee.add("element 1"); listeChainee.add("element 2"); listeChainee.add("element 3"); listeChainee.add("element 4"); System.out.println(Premier element = "+listeChainee. getFirst()); // affiche element 1 System.out.println(dernier element = "+listeChainee. getLast()); // affiche element 4 listeChainee. removeFirst() ; listeChainee. removeLast() ; System.out.println(Premier element = "+listeChainee. getFirst()); // affiche element 2 System.out.println(dernier element = "+listeChainee. getLast()); // affiche element 3
El Mostafa DAOUDI- p. 400
200
Linterface Collection<E> contient la mthode Iterator<E> iterator() qui renvoie un itrateur pour parcourir les lments de la collection Linterface List<E> contient en plus la mthode ListIterator<E> listIterator() qui renvoie un ListIterator (offre plus de possibilits que Iterator pour parcourir une liste et la modifier)
12:19
Exemple : parcours d'une ArrayList avec un itrateur. ArrayList<Integer> list = new ArrayList<Integer>(); list.add (5); list.add (9); //cration dun arrayList contenant deux objet Integer Iterator<Integer> it = list.iterator(); /* cration de litrateur it qui point sur le premier lment de la collection list: le curseur est plac avant le premier lment de la collection list. */ while (it.hasNext()){ // tant quil existe un lment parcourir System.out.println (it.next()); // affiche llment courant // lment courant= lment juste aprs le curseur } Remarque 1: Pour le parcours des tableau, on utilise plus laccs direct par les mthode get() ou set() au lieu des itrateurs (voir avant).
201
Exemple: Parcours dune liste chaine - voici comment nous pourrons la parcourir lenvers :
ListIterator <E> iter ; iter = l.listIterator (l.size()) ; /* position courante : fin de liste*/ while (iter.hasPrevious()) { E o = iter.previous () ; // utilisation de lobjet courant o } - voici comment nous pourrons la parcourir du dbut vers la fin : ListIterator <E> iter ; iter = l.listIterator () ; /* position courante : dbut de la liste */ while (iter.hasNext()) { E o = iter.next() ; // utilisation de lobjet courant o }
El Mostafa DAOUDI- p. 403
202
Le package java.io contient les classes pour grer les entres/sorties en fonction des types des flux. On distingue les flux de caractres et les flux doctets (flux binaires). Etapes suivre pour la lecture ou lcriture dun flot de donnes: Ouvrir un flux qui pointe sur une source de donne. Lire ou crire des donnes dans ce flux: Tant quil y a des donnes lire ( ou crire) on lit (ou on crit) la donne suivante dans le flot Fermer le flux.
II. Les flux doctets Les flux sont utiliss pour lire ou crire des octets bruts qui reprsentent des donnes codes. Les classes abstraites InputStream et OutputStream fournissent les fonctions pour les entres/sorties (lecture/criture) orientes byte. - Pour la lecture des octets, on utilise les mthodes de la sousclasse FileInputStream de la classe InputStream - Pour lcriture, on utilise les mthodes de la sous-classe FileOutputStream de la classe OutputStream savoir
203
Principe de lecture:
La lecture des donnes partir dun flux, se droule de la faon suivante: - Ouverture du flux : cration dun objet de la classe InputStream. Lors de la cration, on doit prciser la source de donnes connecter au flux (par exemple un nom de fichier). Pour la sparation des noms des rpertoires et des fichiers, on utilise \\, au lieu de \. - Lecture de donnes : Elle est ralise au moyen de la mthode read(). - Fermeture du flux : Quand le flux nest plus ncessaire, il doit tre ferm par la mthode close().
El Mostafa DAOUDI- p. 408
204
Exemple: Considrons le fichier fichier_test.jpg qui reprsente une image situe dans le rpertoire D:\\Images . Le but est dafficher les pixels (des octets: des valeurs entires positives comprises entre 0 et 255) qui reprsente limage. N.B. La lecture se termine quand la mthode read() retourne la valeur -1.
205
Dans cette version on attrape les exceptions Il ne faut pas appeler la mthode close() l'intrieur du bloc try/catch , mais il faut lappeler dans le bloc finally (pour tre sre quon ferme le flux) . En effet, en cas d'exception, on risque de ne pas fermer le flux. import java.io.*; public class LecteurOctets { public static void main(String[] args) throws IOException { FileInputStream in = null; try { // Ouvre un flux pointant sur le fichier in = new FileInputStream("D:\\fichier_test.jpg"); int n; while ((n= in.read()) != -1) { // Lecture partir du fichier System.out.print(" " + n); } // Fin de la boucle while // ne pas mettre cet endroit linstruction in.close();
El Mostafa DAOUDI- p. 411
} catch (IOException e) { System.out.println("Impossible de lire le fichier : "+ e); System.exit(-1); } finally { try { in.close(); } catch (IOException e){ e.printStackTrace() ; } System.out.println("Lecture du fichier termine."); } } }
206
2. Flux d'octets: En Ecriture Pour lcriture, on utilise les mthodes de la sous-classe FileOutputStream de la classe OutputStream savoir : void write(int b) throws IOException void flush() throws IOException void close() throws IOException Remarque : avec la mthode write(int b), seul l'octet de poids faible (les 8 bits de poids faibles) de b qui est crit dans le flot.
Principe dEcriture: Lcriture de donnes dans flux se droule de la mme faon que la lecture dun flux dentre : - Ouverture du flux : cration dun objet de la classe OutputStream. Lors de la cration, on doit prciser la source de donnes connecter au flux (par exemple un nom de fichier ou un autre flux). - Ecriture de donnes : les donnes sont crites vers le flux au moyen de la mthode write(). - Fermeture du flux : quand le flux nest plus ncessaire, il doit tre ferm par la mthode close(). Exemple: crire des entiers de type byte (octet) dans le fichier D:\\donnees.dat.
El Mostafa DAOUDI- p. 414
207
import java.io.*; public class TestEcritOctet { public static void main(String[] argv) throws IOException { int tab[] = {56, 257, 123, 43, 256, 37};
Remarque: - Si le fichier "D:\\donnees.dat" nexiste pas alors il sera cr. - Si le fichier "D:\\donnees.dat" existe alors il sera cras. Si on veut rajouter la fin du fichier, on utilise un autre constructeur de la classe FileOutputStream. Syntaxe: FileOutputStream(String nom, boolean append) Si append vaut true alors on rajoute la fin du fichier. Exemple:
FileOutputStream out = new FileOutputStream("D:\\donnees.dat", true);
208
209
Lecture des donnes: Les donnes sont tout d'abord transportes du FileInputStream dans le BufferedInputStream, ensuite on utilise la mthode read() pour lire les donnes partir du tampon. Remarque: Les flux tampon ne modifient pas le type de lecture ; ils la rendent seulement plus rapide.
//le dbut du programme reste inchang par rapport au programme prcdent FileInputStream in = null; BufferedInputStream tampon = null; try { in = new FileInputStream("D:\\fichier_test.jpg"); // Connecte les flux avec le tampon tampon = new BufferedInputStream(in); /* on peut lcrire tout simplement BufferedInputStream tampon = new BufferedInputStream( new FileInputStream("D:\\fichier_test.jpg")); */ int n; while ( ( n = tampon.read()) != -1 ) { System.out.print(" " + n); } // Fin de la boucle while // in.close(); ne pas la mettre ici }
El Mostafa DAOUDI- p. 420
210
catch (IOException e) { System.out.println( Lecture impossible :"+ e.toString()); System.exit(-1); } finally { try { tampon.close(); in.close(); } catch (IOException e){ e.printStackTrace() ; } System.out.println("Lecture du fichier termine."); } } }
Principe dcriture de flux tampon doctets. Les tapes sont identiques la lecture. Ouverture du flux : cration dun objet de la classe OutputStream. Lors de la cration, on doit prciser la source de donnes connecter au flux . Exemple: FileOutputStream out = new FileOutputStream("D:\\fichier_test.jpg"); Connexion du flux avec le tampon: La classe BufferedOutputStream permet de remplir la mmoire tampon avec des donnes de FileOutputStream. Exemple: BufferedOutputStream tampon = new BufferedOutputStream(out);
211
Ecriture des donnes: Les donnes sont tout d'abord transportes du FileOutputStream dans le BufferedOutputStream, ensuite on utilise la mthode write() pour crire les donnes partir du tampon. Remarque: Pour s'assurer que tous les octets du tampon sont envoys au fichier, on appelle la mthode flush() (vider) lorsque l'criture dans le BufferedOutputStream est termine. Exemple: Ecrire un tableau dentiers dans un fichier
int tab[] = {56, 257, 123, 43, 256, 37}; FileOutputStream out = null; BufferedOutputStream tampon = null; try { out = new FileOutputStream( D:\\donnes.dat"); // Connecte les flux tampon = new BufferedOutputStream(out); for (int i = 0; i < tab.length; i++) { tampon.write(tab[i]); } } catch (IOException e) { e.printStackTrace(); } finally { try { tampon.flush(); tampon.close(); out.close(); } catch (IOException e1) { e1.printStackTrace(); } }
El Mostafa DAOUDI- p. 424
212
Exemple: Lire des donnes doubles partir dun fichier test.data et les afficher.
FileInputStream in = new FileInputStream("D:\\test1.data"); BufferedInputStream tampon = new BufferedInputStream(in); DataInputStream dis= new DataInputStream(tampon); double d; while(dis.available()!=0){ // tant quil reste des octets lire d = dis.readDouble(); System.out.println("d= "+d); } dis.close();
El Mostafa DAOUDI- p. 426
213
criture des types primitifs dans un fichier FileOutputStream out = new FileOutputStream( nom_du_fichier"); BufferedOutputStream tampon = new BufferedOutputStream(out); DataOutputStream dos = new DataOutputStream (tampon); Ou DataOutputStream dos = new DataOutputStream( new BufferedOutputStream( new FileOutputStream("fichier"))); dos.writeDouble(103.7); dos.writeUTF("Mohammed"); dos.writeInt(769); dos.close(); Pour crire des types primitifs la fin dun fichier on utilise le constructeur FileOutputStream(String nom, boolean append); Qui permet d'ajouter la fin du fichier si append est true , sinon le contenu du fichier sera cras la cration du flot
El Mostafa DAOUDI- p. 427
Les flux de caractres sont utiliss pour lire ou crire des caractres Unicode. Les classes abstraites Reader et Writer fournissent les mthodes pour les entres/sorties orientes caractres. - La classe Reader et ses sous classes FileReader lit des caractres (char) dans un flot. - La classe Writer et ses sous classes FileWriter crite (envoie) des caractres dans un flot. Ces classes peuvent lire un fichier texte, soit caractre par caractre l'aide de la mthode read(), soit ligne par ligne l'aide de la mthode readLine().
214
1. Lecture caractre par caractre Pour la lecture, on utilise la classe Reader et ses sous classes FileReader, et on utilise la mthode read() pour lire un caractre (char) dans un flot. La mthode read() renvoie un byte qui reprsente le code du caractre lu en codage unicode. Exemple: Soit Donnes.txt un fichier texte. On dfinit la classe LecteurCaracteres qui lit le fichier Donnes.txt caractre par caractre et le programme se termine quand on arrive la fin du fichier (la mthode read() renvoi -1).
import java.io.*; public class LecteurCaracteres { public static void main(String[] arguments) throws IOException { FileReader monFichier = new FileReader("D:\\Donnees.txt"); int c; // c reprsente le code unicode du caractre lu while ((c= monFichier.read())!=-1) { System.out.println((char)c); // on affiche la caractre lu } // Fin du while monFichier.close(); } // Fin de la mthode main() } Question: refaire la mme classe en attrapant les exceptions
El Mostafa DAOUDI- p. 430
215
2. Flux tampon de caractre: La classe BufferedReader permet de remplir rapidement la mmoire tampon avec des donnes de FileReader. Les donnes sont d'abord transport du FileReader dans le BufferedReader, puis on utilise la mthode read() pour lire les donnes partir du buffer. La classe BufferedWriter permet dcrire rapidement partir de la mmoire tampon avec des donnes de FileWriter. Les donnes sont d'abord transport du FileWriter dans le BufferedWriter, puis on utilise la mthode write() pour crire les donnes dans le buffer. Exemple: On reprend lexemple prcdent, dans ce cas la classe LecteurCaracteres lit le fichier Donnes.txt ligne ligne et le programme se termine quand la mthode readLine() renvoie null, ce qui signifie la fin de fichier.
El Mostafa DAOUDI- p. 431
import java.io.*; public class LecteurScores { public static void main(String[] arguments) throws IOException { FileReader monFichier = null; BufferedReader tampon = null; monFichier = new FileReader("D:\\Donnees.txt"); tampon = new BufferedReader(monFichier); String ligne; while ((ligne = tampon.readLine())!=null) { // Lit une ligne de Donnees.txt et vrifie la fin de fichier System.out.println(ligne); } // Fin du while tampon.close(); monFichier.close(); } // Fin de la mthode main() } Question: refaire la mme classe en attrapant les exceptions
El Mostafa DAOUDI- p. 432
216
3. Ecriture dun fichier texte Si on (le programme) veut criure un fichier texte sur un disque, utilise la mthode write() surcharge de la classe FileWriter et lun des constructuers de la classe FileWriter Constructeur un seul argument de la classe FileWriter Syntacxe: FileWriter(Nom du fichier Fichier) - Si le fichier dont le nom est donn en argument nexiste pas, alors il sera cr. - Si le fichier dont le nom est donn en argument existe, alors il sera remplac par les nouvelles donnes chaque exuction du programme. Constructeurs deux arguments de la classe FileWriter Syntacxe: FileWriter(Nom du fichier Fichier, boolean append) Si append vaut true, alors on ajoute des donnes la fin d'un fichier existant.
El Mostafa DAOUDI- p. 433
Exemple: La classe EcrireFichierTexte crit trois lignes dans le fichier D:\Donnees.txt partir dun tableau.
import java.io.* public class EcrireFichierTexte { public static void main(String[] arguments) throws IOException { FileWriter fichierSortie = null; BufferedWriter tampon = null; String[] tab = new String[3]; // Saisi des lments du tableau tab tab[0]="Mohammed 25-12_1959"; tab[1]="Ali 30-01-2001"; tab[2]="Fatima 26-08-1940";
217
try { fichierSortie = new FileWriter( D:\\Donnees.txt"); tampon = new BufferedWriter(fichierSortrie); for (int i=0; i < tab.length; i++) { // Ecrit le tableau de chanes dans Donnees.txt tampon.write(tab[i]); } System.out.println("Ecriture du fichier termine."); } catch (IOException exception) { exception.printStackTrace(); } finally { try { tampon.flush(); tampon.close(); monFichier.close(); } catch (IOException e1) { e1.printStackTrace(); } } } // Fin de la mthode main() }
El Mostafa DAOUDI- p. 435
218
Fonctionnalits Cre un nouveau fichier, vide, du nom utilis pour l'instanciation de la classe File. Ne cre un nouveau fichier que s'il n'existe pas dj un fichier du mme nom. Supprime un fichier ou un rpertoire. Renomme un fichier. Retourne la longueur d'un fichier en octets. Retourne true si le fichier existe. Retourne un tableau de chanes contenant les noms des fichiers/rpertoires contenus dans un rpertoire donn. Retourne l'heure et la date de dernire modification du fichier. Cre un rpertoire.
El Mostafa DAOUDI- p. 437
Exemple : Ecrire un programme qui enregistre des donnes dans un fichier. Le programme affiche un message pour avertir l'utilisateur si le fichier existe dj. Etapes: - crer une instance de la classe File en lui donnant le nom du fichier. - appeler la mthode exists(). Cette mthode retourne true, si le fichier existe. File monFichier = new File( smi.txt"); if (monFichier.exists()) { // Affiche un message davertissement. }
El Mostafa DAOUDI- p. 438
219
L'extrait des instructions suivantes permet de renommer le fichier Donnees.txt en Donnees_v1.txt . File fichier = new File(" Donnees.txt"); File fichierNouveau = new File(" Donnees_v1.txt"); if (fichier.exists()) { fichier.renameTo(fichierNouveau); }
L'extrait des instructions suivantes permet renomme le fichier clients.txt en clients.txt.bak. Si le fichier .bak existe dj, il est remplac. File fichier = new File("clients.txt"); File sauvegarde = new File("clients.txt.bak"); if (sauvegarde.exists()) { sauvegarde.delete(); } fichier.renameTo(sauvegarde);
220