Vous êtes sur la page 1sur 273

Programmation Oriente Objet : JAVA

2012/2013

VINCI 2012-2013- T.HAJJI- 1

Sommaire
Les bases de java Les constricteurs Gnralits sur les structures lexicales de Java Hritage La gestion des Exceptions Complment Introduction aux Interfaces graphiques

VINCI 2012-2013- T.HAJJI- 2

Ch I. JAVA: les bases I. Gnralits sur les objets Un objet est une variable amliore: il stocke les donnes, mais on peut effectuer des requtes sur cet objet (on demande lobjet de faire des oprations sur lui-mme), en envoyant un message cet objet. Ceci est quivalent un appel de fonction. Chaque objet son espace mmoire: la simplicit des objet mis en uvre, cache la complexit des programme. Chaque objet a un type prcis: cest--dire chaque objet est une instance (variable) dune class (type) Un programme est ensemble dobjets qui senvoient des messages.
VINCI 2012-2013- T.HAJJI- 3

II. Les bases connatre


Java est un langage orient objet: l'entit de base de tout code Java est la classe Sa syntaxe est proche du langage C Il est fourni avec le JDK (Java Developpment Kit)
Outils de dveloppement Ensemble de paquetages trs riches et trs varis

Multi-tches (threads) Portable grce lexcution par une machine virtuelle


VINCI 2012-2013- T.HAJJI- 4

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 dclarations de variables globales, que l'on appelle 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).
VINCI 2012-2013- T.HAJJI- 5

III. Mon premier programme en Java Considrons le code source du programme qui affiche lcran Mon premier programme Java // Fichier source MonPremProg.java public class MonPremProg { // dclaration de donnes globales //dfinition des mthodes public static void main(String args[]) { // dclaration des donnes locales; System.out.println(" Mon premier programme Java " ); } }
VINCI 2012-2013- T.HAJJI- 6

De manire gnrale, dans tout programme autonome 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 nest pas utilis mais, il est exig par le compilateur Java. La classe contenant la mthode main() doit obligatoirement tre public afin que la machine virtuelle y accs. Dans lexemple, le contenu de la classe MonPremProg est rduit la dfinition dune mthode main().
VINCI 2012-2013- T.HAJJI- 7

Un fichier source peut contenir plusieurs classes mais une seule doit tre public(ici PremProg). Le nom du fichier source est identique au nom de la classe publique qu'il contient, suivi du suffixe .java, dans lexemple MonPremProg.java

VINCI 2012-2013- T.HAJJI- 8

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.
VINCI 2012-2013- T.HAJJI- 9

Sun fournit le compilateur javac avec le JDK. Dans notre exemple on excute: javac MonPremProg.java Cette compilation cre un fichier nomm MonPremProg.class qui contient le bytecode On peut dsigner le fichier compiler par un chemin absolu ou relatif : javac home/user2/MonPremProg.java

Si un systme possde une JVM il peut excuter tous les bytecodes (fichiers .class) compils sur nimporte quele autre systme.
VINCI 2012-2013- T.HAJJI- 10

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

VINCI 2012-2013- T.HAJJI- 11

Excution avec java Dans le cas de lenvironnement JDK de SUN. Pour compiler il suffit dutiliser la commande javac: javac MonPremProg.java Pour excuter, Sun fournit le programme java qui simule une JVM. Il suffira dutiliser la commande: java MonPremProg qui interprte le bytecode de la mthode main() de la classe MonPremProg

VINCI 2012-2013- T.HAJJI- 12

Lexcution du programme MonPremProg affiche lcran, comme rsultat, la chane de caractres: Mon premier programme Java, grce linstruction: System.out.println(" Mon premier programme Java "); Dans le programme, une ligne qui commence avec // est un commentaire jusqu la fin de la ligne Une ligne qui commence avec /* est un commentaire qui peut tre tal sur plusieurs lignes, et doit terminer avec */
VINCI 2012-2013- T.HAJJI- 13

III. Les classes en Java


Une classe dcrit un ensemble dobjets qui partagent des caractristiques communes. On dfinit une classe pour reprsenter un problme au lieu dutiliser un type de donnes pour reprsenter une unit de stockage dans lordinateur. Crer des classes (des types de donnes abstraites) est un concept fondamental dans la POO. On utilise les classes exactement de la mme manire que les types de donnes prdfinies. On peut crer des variables (objets ou instance) dun type particulier.
VINCI 2012-2013- T.HAJJI- 14

Pour crer un nouveau type dobjets de on utilise le mot cl class. Le canevas de base pour dfinir un nouveau type de nom NomDuType est la suivante: class NomDuType { /* Corps de la classe: instructions de dfinitions des mthodes et des champs */ }

VINCI 2012-2013- T.HAJJI- 15

Dans la dfinition de la classe (corps de la classe), on met deux types dlments: - des donnes membres de la classe (appeles champs) qui sont des objets de nimporte quel type. - des fonctions membres de la classe (appeles mthodes).

VINCI 2012-2013- T.HAJJI- 16

Exemple: UnTest est une classe (un nouveau type) qui a 3 champs : float, int et boolean. class UnTest { float x; int i; boolean b; }
VINCI 2012-2013- T.HAJJI- 17

Dfinition des mthodes La dfinition de base dune mthode ressemble la dfinition dune fonction en C. typeRetour nomMethode (/* Liste des parametres */) { /* corps de la mthode */ } - nomMethode est le nom de la mthode - Liste de paramtre (arguments de la mthode) donne les types et les noms des informations quon souhaite passer la mthode lors de son appel. - typeRetour est le type de la valeur qui est retourne par la mthode aprs son appel. Si la mthode ne fourni aucun rsultat, alors typeRetour est remplac par le mot cl void.
VINCI 2012-2013- T.HAJJI- 18

Le mode de passage des paramtres dans les mthodes dpend de la nature des paramtres : par rfrence pour les objets par copie pour les types primitifs
Exemple class C { void methode1(int i){ i+=12; } void methode2() { int i = 3; methode1(i); System.out.println(i=" + i); // i=3 } }
VINCI 2012-2013- T.HAJJI- 19

IV. Cration et manipulation dObjets Une fois la classe est dfinie, on peut crer des objets de la mme manire que la dclaration des types primitif: Considrons la classe ClasseTest class ClasseTest { // corps de la classe ClasseTest } linstruction: ClasseTest a;
VINCI 2012-2013- T.HAJJI- 20

// dclare a comme objet (variable) de type ClasseTest

Attention: - La dclaration dune variable de type primitif rserve un emplacement mmoire pour stocker la variable - La dclaration dun objet de type A, ne rserve pas une place mmoire pour un objet de type A, mais seulement un emplacement pour une rfrence un objet de type A. les objets sont manipuls avec des rfrences. Exemple classique de la tlcommande et la Tl. Tl = objet Tlcommande = rfrence.
Objet Rfrence
Tlcommande
VINCI 2012-2013- T.HAJJI- 21

Tl

- Pour modifier lobjet (par exemple augmenter le son, ) on utilise la rfrence (la tlcommande). - Avoir une rfrence ne veut pas dire avoir lobjet (on peut avoir la tlcommande sans avoir la tl).

VINCI 2012-2013- T.HAJJI- 22

Lemplacement pour lobjet doit tre demand explicitement dans le programme en faisant appel loprateur new. Lexpression new NomClasse cre un emplacement pour un objet de type NomClasse. class NomClasse { /* Corps de la classe */ } NomClasse a = new NomClasse(); En gnrale: 1. Chaque objet met ses donnes membres dans sa propre zone mmoire. 2. Les donnes membres ne sont partages entre les objets.
VINCI 2012-2013- T.HAJJI- 23

Exemple 1:
class UnTest { float x; int i; boolean b; }

UnTest data = new UnTest(); // crer un objet data

VINCI 2012-2013- T.HAJJI- 24

Exemple 2: Supposons quon veut avoir une chane de caractres alors on cre une rfrence sur String: String s; Ici on a cr la rfrence mais pas lobjet. Pour crer lobjet, il faut initialiser la rfrence s. String s=new String ("cours Java"); ou String s; s = new String ("cours Java"); Ou tout simplement ( Cest un cas particulier en Java pour les objets string) par: String s= " cours Java "
VINCI 2012-2013- T.HAJJI- 25

Accs aux donnes membres


Exemple 1:
class UnTest { float x; int i; boolean b; }

UnTest data = new UnTest(); // crer un objet data Maintenant lobjet dont la rfrence data existe. Pour accder une donne membre on indique le nom de la rfrence lobjet suivi par un point, suivi par le nom du membre dans lobjet de la manire suivante: data.i=2; // affecte 2 au membre i data.b=true; // affecte true au membre b data.x=1.2f; // affecte 1.2 au membre x.
VINCI 2012-2013- T.HAJJI- 26

Appels des mthodes Les mthodes ne peuvent tre crer que comme des composante dune classe. Une mthode ne peut tre appele que pour un objet. Lappel dune mthode pour un objet se ralise en nommant lobjet suivi dun point suivi du nom de la mthode et de sa liste darguments: nomObjet.nomMethode(arg1, .). o nomObjet: nom de la rfrence lobjet nomMethode: nom de la mthode.
VINCI 2012-2013- T.HAJJI- 27

Exemple: soit f () une mthode qui ne prend aucun paramtre et qui retourne une valeur de type int. Alors si on a une rfrence un objet appel a pour lequel f() peut tre appele, on peut crire: int x = a.f()
class UnTest { float x; int i; boolean b; int f() { return 10; } }

UnTest a = new UnTest(); // crer un objet a; int x = a.f(); // affecte x la valeur retourne par f
VINCI 2012-2013- T.HAJJI- 28

Cas particulier des types primitifs Les types primitifs ont un traitement particulier: 1. on nutilise pas new, 2. les variables (non les rfrences) sont cres au moment de leurs dclaration.
-----------------------------------------------------------------------------Type | Taille | Classe Wrapper | --------- |--------------------------------|--------------------------------- | Boolean | | Boolean | char | 16 bits, Unicode | Character | byte | 8 bits | Byte | short | 16 bits | Short | int | 32 bits | Integer | long | 64 bits | Long | float | 32 bits IEEE 754 | Float | double | 64 bits IEEE 754 | Double | void | | Void |

VINCI 2012-2013- T.HAJJI- 29

On peut traiter les type primitif comme des objet en utilisant les classe wrapper qui leurs sont associes. Exemple: char c=x; // type primitif directement dclar Character car = new Character(c); // classe wrapper ou Character car = new Character (x);

VINCI 2012-2013- T.HAJJI- 30

Remarque : Quand une donne dun type primitif est membre dune classe on est assur quelle a une valeur par dfaut mme si on ne linitialise pas:
---------------------------------------------------------------Type primitifs | Valeur par dfaut | ---------------------------- |----------------------------------- | boolean | false | char | \u0000 (null) | byte | (byte)0 | short | (short)0 | int | 0 | long | 0L | float | 0.0f | double | 0.0d | ----------------------------------------------------------------VINCI 2012-2013- T.HAJJI- 31

Attention: Cette garanti dinitialisation par dfaut ne sapplique pas aux variables locales (dfinition dune fonction (mthode)).

VINCI 2012-2013- T.HAJJI- 32

V. Notion de porte et de dure de vie des objets Le concept de porte fixe simultanment la visibilit et la dure de vie des noms dfinis dans cette porte. La porte est fixe par les accolades { }. Exemple: { int x=12; // seul x est accessible { int q=96; // x et q tous les deux sont accessibles } // seul x est accessible // q est hors de porte }
VINCI 2012-2013- T.HAJJI- 33

Attention: Ceci nest pas permis en Java { int x=12; { int x=96; // illgale en Java, valable en C, C++ } }

VINCI 2012-2013- T.HAJJI- 34

Porte des objet: Considrons une classe nomme A { A a=new A(); } // fin de porte La rfrence a disparat la fin de la porte, par contre lobjet qui t rfrenc par a 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.
VINCI 2012-2013- T.HAJJI- 35

Il nexiste aucun oprateur explicite pour dtruire lobjet dont on na pas besoin, mais il existe un mcanisme de gestion automatique de la mmoire connu sous le nom de ramasse miettes (en anglais Garbage Collector). Son principe est le suivant: - A tout instant on connat le nombre de rfrences un objet donn. - Lorsquil nexiste plus aucune rfrence sur un objet, on est certains que le programme ne peut pas y accder, donc lobjet devient candidat au ramasse miette.
VINCI 2012-2013- T.HAJJI- 36

VI. Champs de classe Considrons la dfinition simpliste suivante: class A { int n; float y; } Chaque objet de type A possde ses propres champs n et x. Par exemple avec les dclarations A a1=new A(), a2= new A(); a1.n et a2.n dsignent deux champs diffrents. a1.y et a2.y dsignent aussi deux champs diffrents.
VINCI 2012-2013- T.HAJJI- 37

On peut dfinir des champs qui nexistent quen un seul exemplaire (ce quon nomme des champs de classe ou champs statiques), en les dclarant avec lattribut static. Par exemple si nous dfinissons: class A { static int n; float y; } A a1=new A(), a2=new A(); a1.n et a2.n dsignent donc le mme champs. Il est possible de sy rfrer en le nommant simplement A.n // champs (statique) de la classe A
VINCI 2012-2013- T.HAJJI- 38

VII. Quelques prcisions Identificateur: Cest une suite de caractres pour dsigner les diffrentes entits manipuls par un programme: variables, mthode, classe, objet, Il est form de lettre et/ou de chiffres. Le premier caractre est une lettre ou le caractre soulign (_). Remarque: - Tous les caractres sont significatifs. - On fait la diffrence entre les majuscules et les minuscules. - Mots cls: certains mots sont rservs par le langage et ne peuvent pas tre utiliss comme identificateur.
VINCI 2012-2013- T.HAJJI- 39

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.
VINCI 2012-2013- T.HAJJI- 40

Style de programmation non standard - Mettre en Majuscule la premire lettre des noms des classes. Exemple: class A () { // } - Si le nom de la classe est compose de plusieurs mots, ils sont accols (on ne les spare pas par un trait bas) et la premire lettre de chaque mot est mise en majuscule. Exemple:
class PremProg() { //. }

- Pour le reste, mthodes, variables membres, noms des rfrences dobjets, le style retenu comme classe sauf que la premire lettre de lidentificateur est miniscule.
VINCI 2012-2013- T.HAJJI- 41

Spcificateurs daccs: Il existe 3 mots cls pour spcifier laccs au sein dune classe: public, private et protected. public: veut dire tout le monde private : veut dire que personne ne peut accder ces dfinitions part les mthodes interne de ce type. protected: se comporte comme private avec moins de restriction. Une classe drive a un accs aux membres protected mais pas aux membres private Accs par dfaut, lorsquaucun de ces spcificateurs nest mentionn.

VINCI 2012-2013- T.HAJJI- 42

Exemple:
class A { public int x; private int y; public void initialise (int i, int j){ x=i; y=j; } } public class TestA{ // fichier source de nom TestA.java public static void main (String args[]) { A a; a=new A(); // On peut aussi dclarer A a=new A(); a.initialise(1,3); // x vaut 1 et y vaut 3 a.x=2; // x vaut maintenant 2. On peut accder x car il est public a.y=3; // ne compile pas car y est prive } }

VINCI 2012-2013- T.HAJJI- 43

Ch. II. Les constructeurs

I. Introduction Un objet a une adresse en mmoire (identifie lobjet) un comportement (ou interface) un tat interne (les valeurs des variables) Ltat interne est donn par des valeurs de variables Le comportement est donn par des fonctions ou procdures, appeles mthodes
VINCI 2012-2013- T.HAJJI- 44

Nous supposons quun objet de type Point est reprsent par: Un tat interne : deux coordonnes entires labscisse (x) et lordonne (y). Un Comportement: nous supposons que la classe dispose des trois mthodes: - initialise pour attribuer des valeurs aux coordonnes dun points - dplace pour modifier les coordonnes dun point - affiche pour afficher les coordonnes dun point

VINCI 2012-2013- T.HAJJI- 45

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); } }
VINCI 2012-2013- T.HAJJI- 46

Pour manipuler un objet, on dclare une rfrence sur la classe de cet objet : Exemple: Point a; Pour crer un objet (instance de la classe), on applique l'oprateur new.

Exemple: a = new Point(); Quand une instance est cre, - son tat est conserv dans les variables dinstance (son propre tat interne) - partage le code qui dtermine son comportement (les mthodes) avec les autres instances de la classe.
VINCI 2012-2013- T.HAJJI- 47

Ainsi a=new Point(); // crer un objet de type Point et place sa rfrence dans a. Les objets interagissent en senvoyant des messages: Les mthodes dun objet correspondent aux messages quon peut lui envoyer : quand un objet reoit un message, il excute la mthode correspondante. De manire gnrale on a: objetQuiReoitLeMessage.messageEnvoy(paramtres); Exemple des objets de type point: a.initialise(1,1); a.deplace(0,2);
VINCI 2012-2013- T.HAJJI- 48

public class TstPoint{ public static void main (String args[]) { Point a; a=new Point(); a.initialise(1,1); a.deplace(2,0); Point b=new Point(); b.initialise(2,3); b.affiche(); } }
VINCI 2012-2013- T.HAJJI- 49

Remarque: - Pour chaque instance on appelle la mthode initialise pour initialiser lobjet ainsi crer. - Si on nappelle pas la mthode initialise, lobjet de type Point ainsi crer ne sera pas initialis. Crer un objet, ne garanti pas son initialisation

VINCI 2012-2013- T.HAJJI- 50

II. Dfinitions de Constructeur


On peut garantir linitialisation dun objet grce une mthode spciale appele constructeur qui permet dautomatiser le mcanisme dinitialisation dun objet. Quand une classe possde un constructeur, Java lappel automatiquement toute cration dobjet avant quil ne puisse tre utilis. La cration et linitialisation sont deux concepts unifis

VINCI 2012-2013- T.HAJJI- 51

Chaque classe a un ou plusieurs constructeurs qui servent crer les instances initialiser ltat de ces instances Un constructeur est une mthode qui: porte le mme nom que la classe na pas de type retour peut disposer dun nombre quelconque darguments (ventuellement aucun). Exemple: Prenons lexemple de la classe point et transformons la mthode initialise en un constructeur en la nommant Point.

VINCI 2012-2013- T.HAJJI- 52

public class Point{ private int x; // abscisse private int y; // ordonne 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); } }

VINCI 2012-2013- T.HAJJI- 53

Les instructions: Point a=new Point(); a.initialise(1,1) Sont remplaces par Point a = new Point(1,1); // cre linstance et linitialise On peut aussi crire: Point a; a=new Point(1,1); Attention. Dans la dernire version de la dfinition de la classe Point, linstruction Point a = new Point(); ne convient plus car le constructeur a besoin de deux arguments

VINCI 2012-2013- T.HAJJI- 54

Un autre exemple public class Etudiant { private String nom, prenom; // Variables dinstance private int codeNatEtudiant; // Constructeur public Etudiant(String n, String p) { nom = n; prenom = p; } public void setCNE (int cne) { codeNatEtudiant = cne; } public static void main(String[] args) { Etudiant e1; e1 = new Etudiant("Mohammed", "Ali"); // cration d'une instance de la classe Etudiant e1.setCNE(23456765); } }

VINCI 2012-2013- T.HAJJI- 55

III. Quelques rgles concernant les constructeurs 1. Aucun type, mme void, ne doit figurer devant son nom. 2. Lorsque le code dune classe ne comporte pas de

constructeur, un constructeur par dfaut sera automatiquement ajout par Java. Dans ce cas on peut crer des instances (objets) de la classe
par des instructions telles que: Point a=new Point(); //ok si Point na pas de constructeur Etudiant e=new Etudiant(); //ok si Etudiant na pas de constructeur

VINCI 2012-2013- T.HAJJI- 56

De manire gnrale: Si pour une classe A donne, linstruction suivante est accepte A a=new A(); Cela signifie que: - Soit A ne possde pas de constructeur - Soit A possde un constructeur sans arguments.

VINCI 2012-2013- T.HAJJI- 57

3.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 e1.Etudiant(("Mohammed", "Ali"); // Interdit car Etudiant possde // un constructeur.

4. Un constructeur peut tre dclar private. Dans ce cas il ne pourra plus tre appel de lextrieur, cest--dire il ne pourra pas tre utiliser pour instancier des objet. Exemple: class A{ private A() { } // constructeur prive sans arguments } A a=new A(); // erreur, le constructeur correspondant A() est priv
VINCI 2012-2013- T.HAJJI- 58

Dans les exemples prcdents, le constructeur initialise les champs privs de lobjet. Remarque: les champs dun objet sont toujours initialiss par dfaut, contrairement ce qui se passe pour les variables locales, . La cration dun objet entrane toujours, par ordre chronologique, les oprations suivantes:
- Initialisation par dfaut de tous les champs de lobjet - Une initialisation explicite lors de la dclaration du champ - Lexcution des instructions du corps du constructeur

VINCI 2012-2013- T.HAJJI- 59

Initialisation par dfaut des champs dun objet: ------------------------------------ |--------------------------------Type du 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 ---------------------------------------------------------------------

VINCI 2012-2013- T.HAJJI- 60

Initialisation explicite des champs dun objet: Une variable locale peut tre initialiser lors de sa dclaration. Il en va de mme pour un champs. Considrons: class A{ public A () { } // Constructeur A private int n=10; private int p; }

VINCI 2012-2013- T.HAJJI- 61

Linstruction suivante A objA=new A(); Entrane successivement - linitialisation implicite des champs n et p de lobjet objA 0 - Linitialisation (explicite) du champ n la valeur figurant dans sa dclaration, soit 10 - Lexcution des instruction du constructeur

VINCI 2012-2013- T.HAJJI- 62

Appel du constructeur

Le corps du constructeur nest excut quaprs linitialisation par dfaut et linitialisation explicite.

VINCI 2012-2013- T.HAJJI- 63

class A { public A() { // ici n vaut 20, p vaut 10 et np vaut 0 np=n*p; n=5; } public void affiche(){ System.out.println("n="+n+" p="+p+" np= " + np) } private int n=20, p=10; private int np; } public class Init { public static void main (String args[]) { A a=new A(); // ici a.n vaut 5, a.p vaut 10, mais a.np vaut 200 a.affiche(); } } Rsultat de lappel de la mthode affiche: n=5 p=10 np = 200
VINCI 2012-2013- T.HAJJI- 64

IV. 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 a+b, la signification du symbole + dpend du type des variables a et b.

En Java et C++, on peut surcharger une mthode, cest--dire, ajouter une mthode qui a le mme nom mais pas la mme signature quune autre mthode :
VINCI 2012-2013- T.HAJJI- 65

Considrons lexemple suivant ou la classe Etudiant est dote de 2 mthodes calcMoyenne: - La premire a deux arguments de ype float - La deuxime a quatre arguments de type float

VINCI 2012-2013- T.HAJJI- 66

class Etudiant { private String nom, prenom; // Variables dinstance private int codeNatEtudiant; // Constructeur public Etudiant(String n, String p) { nom = n; prenom = p; } public void setCNE (int cne) { codeNatEtudiant = cne; } public float calcMoyenne(float m1, float m2) { return (m1+m2)/2; } public float calcMoyenne(float m1, float m2, float m3, float m4) { return (m1+m2+m3+m4)/4; } }
VINCI 2012-2013- T.HAJJI- 67

public class TestEtudiant { public static void main(String[] args) { Etudiant e1; e1 = new Etudiant("Mohammed", "Ali"); // e1.setCNE(23456765); System.out.println(Moy1="+e1.calcMoyenne(10, 12)); System.out.println(Moy2="+e1.calcMoyenne(10, 12, 8, 13)); } }

VINCI 2012-2013- T.HAJJI- 68

Considrons maintenant lexemple suivant ou la classe Point est dote de 3 mthodes dplace: - La premire a deux arguments de type int - La deuxime a un seul argument de type int - La troisime a un seul argument de type short

VINCI 2012-2013- T.HAJJI- 69

class Point { public Point (int abs, int ord){ // Constructeur x=abs; y=ord; } pubic void deplace (int dx, int dy) { x+=dx; y+=dy; } pubic void deplace (int dx) { x+=dx; } pubic void deplace (short dx) { x+=dx; } private int x,y; }
VINCI 2012-2013- T.HAJJI- 70

public class Surdef1 { public static void main(String arg[]) { Point a=new Point(1,2); a.deplace(1,3); // appel deplace (int,int) a.deplace(2); // appel deplace (int) short p=3; a.deplace(p); // appel deplace (short) byte b=2; a.deplace(b); /* appel deplace(short) aprs conversion de b en short */ } }
VINCI 2012-2013- T.HAJJI- 71

Il peut y avoir ambigut


Supposons que la classe Point est dote des deux mthodes deplace suivantes: public void deplace(int dx, byte dy) { x+=dx; y+=dy; } public void deplace(byte dx, int dy) { x+=dx; } Considrons alors les instructions suivantes: Point a =new Point(2,4) int n; byte b; a.deplace(n,b); // ok appel de deplace (int,byte) a.deplace(b,n); // ok appel de deplace (byte,n) a.deplace(b,b); // erreur, ambiguit
VINCI 2012-2013- T.HAJJI- 72

En Java, il est interdit de surcharger une mthode en changeant le type de retour uniquement: cest--dire ne diffrencier les 2 mthodes que par leur type retour Par exemple, one peut pas avoir les 2 mthodes suivante dans une classe : int moyenne(int, int); // division entire par 2 float moyenne(int,int); // moyenne relle

VINCI 2012-2013- T.HAJJI- 73

Surcharge des constructeurs (Plusieurs constructeurs) En Java et C++, une classe peut avoir plusieurs constructeurs. Comme le nom du constructeur est identique du nom de la classe, il ne peut y avoir quun seul nom de constructeur. Par contre on peut avoir diffrentes initialisations. class Etudiant { private String nom, prenom; // Variables dinstance private int codeNatEtudiant; public Etudiant(String n, String p) { // Constructeur nom = n; prenom = p; } public Etudiant(String n, String p, int cne) {// Constructeur nom = n; prenom = p; codeNatEtudiant = cne; } }
VINCI 2012-2013- T.HAJJI- 74

public class TestEtudiant { public static void main(String[] args) { Etudiant e1, e2; e1 = new Etudiant("Mohammed", "Ali"); e2 = new Etudiant("Ouardi", " fatima", 22564321); } }

VINCI 2012-2013- T.HAJJI- 75

V. Autorfrences: emploi de this Il se peut quau seine dune mthode, on ait besoin de faire rfrence lobjet ayant appel cette mthode. class A { . public void f(.) { // ici lemploi de this dsigne la rfrence lobjet
// ayant appel la mthode f

} }
VINCI 2012-2013- T.HAJJI- 76

Exemple 1: class Point { public Point (int abs, int ord){ x=abs; y=ord; } private int x, y; } Comme les identificateurs abs et ord sont des arguments muets pour la mthode Point, alors on peut les noter x et y qui nont rien avoir avec les champs private x et y. Dans ce cas la classe Point peut scrire comme suit:
VINCI 2012-2013- T.HAJJI- 77

class Point { public Point (int x, int y){ this.x=x; //this.x permet daccder au champs x de lobjet courant this.y=y; //this.y permet daccder au champs y de lobjet courant } private int x,y; }

VINCI 2012-2013- T.HAJJI- 78

Exemple 2:
class Etudiant { private String nom, prenom; public Etudiant(String nom, String prenom) { this.nom = nom; this.prenom = prenom; }

}
VINCI 2012-2013- T.HAJJI- 79

Exemple 3: Deux objets de mme classe Point concident si leurs coordonnes sont identiques. On peut crire la mthode concide de la faon suivante: pubic boolean coincide (Point pt) { return ((pt.x==this.x) && (pt.y==this.y)) } Point a=new Point(x1,y1); Point b=new Point(x2,y2); Les point a est b sont identiques si: a.coincide(b) est TRUE
VINCI 2012-2013- T.HAJJI- 80

Utilisation du mot cl this dans un constructeurs 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.
VINCI 2012-2013- T.HAJJI- 81

Version 1: La classe Point peut tre dfinie de la faon suivante: class Point { public Point (int abs, int ord){ x=abs; y=ord; } public Point( ) { x=0; y=0; } private int x,y; } Point a = new Point (); // crer lobjet a et linitialise lorigine, // au point (0,0). Point b = new Point (2,3); // crer lobjet b et linitialise au point (2,3).
VINCI 2012-2013- T.HAJJI- 82

Version 2: la classe Point peut tre dfinie de la faon suivante: class Point { public Point (int abs, int ord){ x=abs; y=ord; } public Point( ) { this (0,0); } private int x,y; } Point a = new Point (); // crer lobjet a et linitialise lorigine, // au point (0,0). Point b = new Point (2,3); // crer lobjet b et linitialise au point (2,3).
VINCI 2012-2013- T.HAJJI- 83

public class feuille { int i=0; feuille increment () { i++; return this; } public static void main (String[] args ) { feuille x=new feuille ();
System.out.println("ii = " + x.increment().increment().increment().i );

} } Sortie: i= 3
VINCI 2012-2013- T.HAJJI- 84

public class feuille { int i=0; feuille increment () { i++; return this; } void print () { System.out.println(" i = " + i); } public static void main (String[] args ) { feuille x=new feuille (); x.increment().increment().increment().print( ) } } Sortie: i= 3

VINCI 2012-2013- T.HAJJI- 85

Ch. III. Gnralits sur les structures lexicales de Java

Types de variables
Les variables dinstances
sont dclares en dehors de toute mthode conservent ltat dun objet, instance de la classe sont accessibles et partages par toutes les mthodes de la classe

Les variables locales


sont dclares lintrieur dune mthode conservent une valeur utilise pendant lexcution de la mthode ne sont accessibles que dans le bloc dans lequel elles ont t dclares

VINCI 2012-2013- T.HAJJI- 86

Identificateurs
Un identificateur Java est une chane de caractres de

longueur quelconque:
Le premier caractre est une lettre Unicode Le reste de la chane peut contenir des lettres et/ou des chiffres et/ou le caractre soulign _ Les minuscules et les majuscules sont diffrencis Un identificateur Java ne doit pas tre un mot-cl ou les constantes true, false ou null

VINCI 2012-2013- T.HAJJI- 87

Laffectation
Laffectation est ralise au moyen de loprateur = . Signifie prendre la valeur du cot droit et la copier du cot gauche. La partie droite est une constante, une variable ou une expression qui retourne une valeur. La partie gauche est une variable. variable = constante ou variable ou expression

VINCI 2012-2013- T.HAJJI- 88

Soient A et B de type primitif A=B; signifie que le contenu de B est copi dans A. Si ensuite on modifie le contenu de A, alors le contenu de B ne sera pas modifi. Soient A est B deux objets, A=B; signifie quon copie la rfrence de B dans A. (A et B pointeront vers le mme objet rfrenc par B). Si ensuite le contenu de A ou de B sont modifis alors le contenu de A et de B sont modifis.

VINCI 2012-2013- T.HAJJI- 89

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 et a.i valent 20 b.i=13; // a.i et b.i valent 13. } }
VINCI 2012-2013- T.HAJJI- 90

Types de donnes en Java


2 grands groupes de types de donnes sont manipuls par Java: types primitifs objets (instances de classe)

VINCI 2012-2013- T.HAJJI- 91

Types primitifs
Boolean: prend deux valeurs true ou false Nombres entiers : byte: reprsent sur 1 octet, short: reprsent sur 2 octets, int : reprsent sur 4 octets, long : reprsent sur 8 octets Nombres virgule flottante : float : reprsent sur 4 octets), double : reprsent sur 8 octets Caractre (un seul caractre) : char : cod sur 2 octet par le codage Unicode
VINCI 2012-2013- T.HAJJI- 92

Nombres entiers byte : compris entre 128 et 127 short : compris entre 32 768 et 32 767 int : compris entre 2.147 483 648 et 2 147 483 647 long : compris entre -923 372 036 854 775 808 et 923 372 036 854 775 807

VINCI 2012-2013- T.HAJJI- 93

Constantes nombres
Une constante entire - est de type int - Si elle est suffixe par L alors elle est de type long Exemple: 108 // constante de type int 89L // constante de type long 014 // 14 en octal (base 8)= 12 en dcimal 0xA7 // A7 en hexadcimal (base 16) = 167 en dcimal

VINCI 2012-2013- T.HAJJI- 94

Types des rsultats des calculs


avec des nombres entiers Tout calcul entre entiers donne un rsultat de type int si au moins un des oprandes est de type long, alors le rsultat est de type long Exemple byte b1 = (byte)20; byte b2 = (byte)15; byte b3 = b1 + b2; provoquera une erreur car b1 + b2 est de type int (cod sur 32 bits) alors que b3 est de type byte (cod sur 8 bits seulement)
VINCI 2012-2013- T.HAJJI- 95

Les nombres flottants


float : environ 7 chiffres significatifs ;
valeur absolue (arrondie) maximal 3,4 x 1038 ( constante prdfinie Float.MAX_VALUE) valeur absolue (arrondie) minimal 1,4 x 10-45 (constante prdfinie Float.MIN_VALUE)

double : environ 15 chiffres significatifs ;


valeur absolue maximal (arrondie) 1,8 x 10308 (constante prdfinie Double.MAX_VALUE) valeur absolue minimal (arrondie) 4,9 x 10-324 (constante prdfinie Double.MIN_VALUE)

VINCI 2012-2013- T.HAJJI- 96

Constantes nombres Une constante relle est de type float si elle est suffixe par F et de type double sinon Exemple: .567e2 5.123E-2F

// 5,67 de type double // 0,05123 type float

VINCI 2012-2013- T.HAJJI- 97

Type caractre
permet de manipuler des caractres: Java reprsente un caractre sur 2 octets Une variable de type caractre est dclar par: char c1,c2; Constante de type caractre: a , 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

VINCI 2012-2013- T.HAJJI- 98

Type boolen
Sert reprsenter une valeur logique du type vrai/faux Une variable de type boolen est dclar par: boolean b; b prend une des deux valeurs false ou true

VINCI 2012-2013- T.HAJJI- 99

Constante null Rfrence inexistante (indique quune variable de type non primitif ne rfrence rien) ; convient pour tous les types non primitifs
null

VINCI 2012-2013- T.HAJJI- 100

Transtypage Java est un langage fortement typ Dans certains cas, il est ncessaire de forcer le programme considrer une expression comme tant dun type qui nest pas son type rel ou dclar On utilise pour cela le cast (transtypage) : (type-forc) expression int x = 10, y = 3; double z; z=x/y; // donne z=3.0; car x/y donne 3 // sin on veut que z=3.3333.. et pas 3.0 z = (double)x / y; // cast de x suffit
VINCI 2012-2013- T.HAJJI- 101

Casts autoriss En Java, 2 seuls cas sont autoriss pour les casts : entre types primitifs, entre classes mre/anctre et classes filles.

VINCI 2012-2013- T.HAJJI- 102

Casts entre types primitifs Un cast entre types primitifs peut occasionner une perte de donnes :
conversion d'un int vers un short

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

VINCI 2012-2013- T.HAJJI- 103

Casts entre types primitifs Une affectation entre types primitifs peut utiliser un cast implicite si elle ne provoque aucune perte De mme, on peut affecter un entier une variable de type nombre virgule flottante Sinon, elle doivent comporter un cast explicite Loubli de ce cast explicite provoque une erreur la compilation

VINCI 2012-2013- T.HAJJI- 104

Exemples de Casts short s = 1000000; // erreur ! Cas particulier dune affectation statique (reprable par le compilateur) dun int petit : short s = 65; // pas derreur Pour une affectation non statique, le cast est obligatoire : int i = 60; short b = (short)(i + 5); Les casts de types flottants vers les types entiers tronquent les nombres : int i = (int)1.99; // i = 1, et pas 2

VINCI 2012-2013- T.HAJJI- 105

Casts entre entiers et caractres Ils font correspondre un entier et 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

VINCI 2012-2013- T.HAJJI- 106

Lattribut 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 constante pour chaque objet. Attention: elle 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
VINCI 2012-2013- T.HAJJI- 107

Variable locale final Si la variable est dun type primitif, sa valeur ne peut changer Si la variable rfrence un objet, elle ne pourra rfrencer un autre objet mais ltat de lobjet pourra tre modifi final Etudiant e = new Etudiant("Mohammed", "Ali"); ... e.nom = "Ahmed"; // ok, changement de ltat e lobjet e.setCNE(32211452); // ok, changement de ltat e lobjet e = new Etudiant("Ahmed"); // Interdit, rfrence un // autre objet
VINCI 2012-2013- T.HAJJI- 108

Instructions de contrle

VINCI 2012-2013- T.HAJJI- 109

Structure Alternative if else if (expressionBoolenne) bloc-instructions ou instruction else bloc-instructions ou instruction int x = y + 5; if (x % 2 == 0) { type = 0; x++; } else type = 1; Un bloc serait prfrable, mme sil ny a quune seule instruction

VINCI 2012-2013- T.HAJJI- 110

Expression conditionnelle
expressionBoolenne ? expression1 : expression2 Est quivalent if (expressionBoolenne) expression1; else expression2; Exemple: int y = (x % 2 == 0) ? x + 1 : x; est quivalent int y; if (x % 2 == 0) y = x + 1; else y = x; Parenthses pas indispensables
VINCI 2012-2013- T.HAJJI- 111

Distinction de cas suivant une valeur


switch(expression) { case val1: instructions; break; // Attention, sans break, les instructions du cas suivant // sont excutes ! ... case valn: instructions; break; default: instructions; } expression est de type char, byte, short, ou int, ou de type numration Sil ny a pas de clause default, rien nest excut si expression ne correspond aucun case
VINCI 2012-2013- T.HAJJI- 112

Exemple de switch char lettre; int nbVoyelles = 0, nbA = 0, nbT = 0, nbAutre = 0; ... switch (lettre) { case 'a' : nbA++; case 'e' : // pas dinstruction ! case 'i' : nbVoyelles++; break; case 't' : nbT++; break; default : nbAutre++; }
VINCI 2012-2013- T.HAJJI- 113

Rptitions tant que while(expressionBoolenne) bloc-instructions ou instruction do bloc-instructions ou instruction while(expressionBoolenne) Le bloc dinstructions est excut au moins une fois

VINCI 2012-2013- T.HAJJI- 114

Rptition for for(init; test; incrment){ instructions; } est quivalent init; while (test) { instructions; incrment }
VINCI 2012-2013- T.HAJJI- 115

Exemple de for int somme = 0; for (int i=0; i < n; i++) { somme += tab[i]; } System.out.println(somme);

VINCI 2012-2013- T.HAJJI- 116

Instructions lies aux boucles break sort de la boucle et continue aprs la boucle continue 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)

VINCI 2012-2013- T.HAJJI- 117

Etiquette de boucles boucleWhile: while (pasFini) { ... for (int i=0; i < n; i++) { ... if (t[i] < 0) continue boucleWhile; ... } ... }
VINCI 2012-2013- T.HAJJI- 118

Les tableaux

En Java les tableaux sont considrs comme des objets. les variables de type tableau contiennent des rfrences aux tableaux les tableaux sont crs par loprateur new ils ont une variable dinstance (final) pour dsigner taille du tableau: final int length
VINCI 2012-2013- T.HAJJI- 119

Dclaration et cration des tableaux


Dclaration : La taille nest pas fixe la dclaration int[] tabNotes; Ou int tabNotes[]; // possible, mais non recommand Attention: En java il n'est pas possible de dfinir des tableaux de taille statique la dclaration. int[10] tab; // ne compile pas Cration : Cest pendant la cration quil faut donner la taille du tableau tabNotes = new int[5]; Remarques: Chaque lment du tableau reoit la valeur par dfaut du type de base du tableau La taille ne pourra plus tre modifie par la suite Les lments dun tableau peuvent tre dun type primitif ou dun type objet
VINCI 2012-2013- T.HAJJI- 120

Initialisation On peut lier la dclaration, la cration et linitialisation dun tableau; Sa longueur est alors calcule automatiquement daprs le nombre de valeurs donnes. Attention : cette syntaxe n'est autorise que dans la dclaration) : int[] tab = {10, 3*6, 4}; Etudiant [] etudiantsSMI = { new Etudiant("Mohammed", "Ali"), new Etudiant("Fatima", "Zahra") } On peut affecter en bloc tous les lments d'un tableau avec un tableau anonyme int[] t; t = new int[] {1, 2, 3};
VINCI 2012-2013- T.HAJJI- 121

Indices du tableau: Les indices du tableau commence 0 et se termine tab.length - 1 Taille du tableau int[] tab = {10, 3*6, 4}; tabNotes = new int[8]; int l1 = tab.length; // l1 = 3 int l2 = tabNots.length; // l2 = 8 int e = tabNotes[8]; /* La compilation produit le message suivant : ArrayIndexOutOfBoundsException */

VINCI 2012-2013- T.HAJJI- 122

Exemple de tableau de chanes: Paramtres de la ligne de commande class TestArguments { public static void main(String[] args) { for (int i=0; i < args.length; i++) System.out.println(args[i]); } } $javac TestArguments $ java TestArguments arg1 arg2 affichera arg1 arg2
VINCI 2012-2013- T.HAJJI- 123

Tableaux dobjets
Les lments dun tableau peuvent tre dun type objet. Attention: Il faut crer les objets avant de les utiliser. Considrons lexemple de la classe Etudiant. Etudiants [] etudiantSMI = new Etudiant[100];
// Chaque lment du tableau contient une rfrence vers un objet de type Etudiant

etudiantSMI[0].setCNE(11225467);
// setCNE(int cne) est une mthode de la classe Etudiant.

etudianSMI[0].codeNatEtudiant = cne;
// Erreur: etudiantSMI[0] est objet de type Etudiant, donc il faut le crer avant de lutiliser

Etudiant [] etudiantSMI = new Etudiant[100];


// Chaque lment du tableau est une rfrence un objet de type Etudiant

etudiantSMI[0] = new Etudiant(); // Cration de lobjet etudiantSMI[0] etudiantSMI[0].setCNE(11225467);

VINCI 2012-2013- T.HAJJI- 124

Affectation de Tableaux: Java permet de manipuler globalement les tableaux par affectation de leurs rfrences Soient t1 et t2 deux tableaux t1=t2; // La rfrence contenue dans t2 est affecte t1 Maintenant t1 et t2 dsignent le mme objet tableau qui tait initialement rfrenc par t2 t1[2]=3; // t2[2] vaut aussi 3 t2[2]=3. t2[4]=6; // t1[4] vaut aussi 6 t1[4]=6; Attention: Si on veut copier uniquement les valeurs de t2 dans t1, alors dans ce cas on peut faire une copie lment par lment
VINCI 2012-2013- T.HAJJI- 125

Les tableaux en argument dune mthode:


Le passage des tableaux comme paramtres des mthodes se fait par rfrence (comme les objets) et non par copie (comme les types les types primitifs) La mthode agit directement sur le tableau et non sur sa copie

VINCI 2012-2013- T.HAJJI- 126

Tableaux plusieurs dimensions Dclaration int[][] notes; // cest un tableau de tableaux Chaque lment du tableau contient une rfrence vers un tableau Cration: Il faut donner au moins les premires dimensions notes = new int[30][3]; // Tableau de 30 tudiants, chacun // des 30 tudiants a au plus 3 notes notes = new int[30][]; // Chacun des 30 tudiants a un // nombre de notes variable

VINCI 2012-2013- T.HAJJI- 127

Dclaration, cration et initialisation int[][] notes = { {10, 11, 9}, // 3 notes {15, 8}, // 2 notes ... }; Affectation notes[10][2] = 12;

VINCI 2012-2013- T.HAJJI- 128

Exemple 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(); }
VINCI 2012-2013- T.HAJJI- 129

Ch. IV. Hritage


L'hritage est une notion fondamentale en Java et de manire gnrale dans les langages de programmation par Objets. Il permet de crer des classes drives (classes qui hritent) par combinaison de classes dj existantes (classes de base) sans toucher au code source de la classe de base (on a seulement besoin du code compil de la classe de base).
VINCI 2012-2013- T.HAJJI- 130

La classe drive: se comporte comme la classe de base mais avec quelques diffrences. on a seulement besoin du code compil de la clase de base. On peut par exemple: ajouter de nouvelles mthodes adapter (modifier) certaines mthodes

VINCI 2012-2013- T.HAJJI- 131

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. Elle s'appelle 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 une classe fille ou une sousclasse Remarque: - Par dfaut il ny a pas de extends dans la dfinition dune classe: une classe hrite de la classe Object - Un objet de la classe drive ClassDerivee accde aux membres publics de sa classe de base ClasseDeBase

VINCI 2012-2013- T.HAJJI- 132

Exemple class FormeGeometrique{ // classe mre // Dfinition des attributs et des mthodes } class Point extends FormeGeometrique { // classe drive // Dfinition de nouveaux attributs (propres la classe Point) // Dfinition de nouvelles mthodes (propres la classe Point) // Modification des mthodes qui sont dj dfinies dans la classe mre // Point hrite des mthodes et attributs de la superclasse FormeGeometrique } class Cercle extends Point { Dfinition de nouveaux attributs (propres la classe Cercle) // Dfinition de nouvelles mthodes (propres la classe Cercle) // Modification des mthodes qui sont dj dfinies dans la classe mre // Cercle hrite des mthodes et attributs de la superclasse Point }
VINCI 2012-2013- T.HAJJI- 133

Une instance (un objet) dune classe drive peut faire appelle (accs depuis lextrieur) - Aux mthodes et aux membres publics de la classe drive - Aux mthodes et membres publics de la classe de base De mme (pour laccs depuis lintrieur) - Une mthode dune classe drive a accs aux membres publics de sa classe de base - Une mthode dune classe drive na pas accs aux membres prives de sa classe de base
VINCI 2012-2013- T.HAJJI- 134

Quand on crit la classe <ClasseDerivee> 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.

VINCI 2012-2013- T.HAJJI- 135

Lorsqu'une classe hrite d'une autre classe Elle bnficie automatiquement des dfinitions des attributs et des mthodes de la classe mre. Elle peut y ajouter ses propres dfinitions. ajouter des variables, des mthodes et des constructeurs. redfinir des mthodes: exactement le mme nom et la mme signature. surcharger des mthodes: mme nom mais pas les mmes arguments (signature).
VINCI 2012-2013- T.HAJJI- 136

Remarques2: - Java ne permet pas lhritage multiple: chaque classe a une et une seule classe mre dont elle hrite les variables et les mthodes. - C++ permet lhritage multiple.

VINCI 2012-2013- T.HAJJI- 137

Construction des classes drive


- Lorsqu'on construit une instance de ClasseDerivee, on obtient un objet dont une partie est construite grce la dfinition de ClasseDerivee et une partie grce la dfinition de la superclasse ClasseDeBase. - En Java, le constructeur de la classe drive doit prendre en charge lintgralit de la construction de lobjet. Le constructeur de la classe drive doit faire appel au constructeur de la classe de base en appelant explicitement la mthode super() ainsi que la liste des paramtres appropris. Remarque: lappel du constructeur de la super classe (appel de la mthode super()) doit tre la premire instruction dans la dfinition du constructeur de la classe drive.
VINCI 2012-2013- T.HAJJI- 138

Exemple 1: class ClasseDeBase{ public ClasseDeBase(int i) { // constructeur de la classe de base


System.out.println(" Classe de Base: " + i);

} } 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); // appel du constructeur ClasseDerivee1
System.out.println(" Classe drive2: " + i);

} }

VINCI 2012-2013- T.HAJJI- 139

public class TestHeritage{ public static void main (String args[]) { ClasseDerivee2 a=new ClasseDerivee2(7); } } Sortie:

Classe de Base : 14 Classe drive1: 7 , 7 Classe drive2: 7

VINCI 2012-2013- T.HAJJI- 140

Exemples des cas possibles:


Exemple 1: class ClasseDeBase{ ClasseDeBase(arguments) {

} class ClasseDerivee extends ClasseDeBase { // Pas de constructeur . } On obtient une erreur de compilation. Un constructeur de la classe drive doit tre dfini est qui doit appeler le constructeur de la classe de base.

VINCI 2012-2013- T.HAJJI- 141

Exemple2: class ClasseDeBase{ ClasseDeBase(arguments) { // constructeur de la classe de base

} } class ClasseDerivee extends ClasseDeBase { ClasseDerivee(arguments) { // constructeur de la classe de base // lappel de super () est obligatoire sinon une erreur . } }

VINCI 2012-2013- T.HAJJI- 142

Exemple 3: class ClasseDeBase{ ClasseDeBase(arguments) { // constructeur de la classe de base

} ClasseDeBase() { // constructeur sans paramtre de la classe de base

} } class ClasseDerivee extends ClasseDeBase { ClasseDerivee(arguments) {// constructeur de la classe drive // lappel de super () nest pas obligatoire. // si super() nest pas appel explicitement, // le constructeur par dfaut de ClasseDeBase est appel . } }
VINCI 2012-2013- T.HAJJI- 143

Exemple 4: class ClasseDeBase{ // Pas de constructeur

} 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 ClasseDeBase.

VINCI 2012-2013- T.HAJJI- 144

Exemple pratique: class ClasseDeBase{ ClasseDeBase() {


System.out.println(" Classe de Base: ");

} } class ClasseDerivee1 extends ClasseDeBase { ClasseDerivee1() { // Appel implicite du constructeur par dfaut de ClasseDeBase
System.out.println(" Classe drive1: ");

} } class ClasseDerivee2 extends ClasseDerivee1{ ClasseDerivee2() { // Appel implicite du constructeur par dfaut de ClasseDerivee1
System.out.println(" Classe drive2: " );

} }

VINCI 2012-2013- T.HAJJI- 145

public class TestHeritage{ public static void main (String args[]) { ClasseDerivee2 a=new ClasseDerivee2(); } } Sortie:

Classe de Base : Classe drive1: Classe drive2:

VINCI 2012-2013- T.HAJJI- 146

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

VINCI 2012-2013- T.HAJJI- 147

Notion de la Redfinition Ne pas confondre redfinition et surcharge des mthodes : on redfinit une mthode quand une nouvelle mthode a le mme nom et la mme signature quune mthode hrite de la classe mre. on surcharge une mthode quand une nouvelle mthode a le mme nom, mais pas la mme signature, quune autre mthode de la mme classe

VINCI 2012-2013- T.HAJJI- 148

Lorsqu'un attribut ou une mthode ont t dfinis dans une classe et sont redfinis dans une classe drive (qui en hrite), les lments visibles sont ceux redfinis dans la classe drive. Les lments de la classe de base (hrite) sont alors masqus. class Rect extends ObjetGraphique { void move(int dx, int dy); ... } class Cercle extends ObjetGraphique{ void move(int dx, int dy); ... }
VINCI 2012-2013- T.HAJJI- 149

On peut avoir les mmes mthodes move() 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.

VINCI 2012-2013- T.HAJJI- 150

A*

*: signifie la dfinition ou la redfinition dune mthode f.

Class A: mthode de A

B C*

Classe B: mthode de A Classe D: mthode de D Classe E: mthode de A Classe C: mthode de C Classe F: mthode de C

D*

VINCI 2012-2013- T.HAJJI- 151

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 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 un sens uniquement dans une mthode (comme le motcl this).

VINCI 2012-2013- T.HAJJI- 152

class Point { public void afficher(){ System.out.pritln(" je suis en "+ x +" et " +y); } private int x,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; }
VINCI 2012-2013- T.HAJJI- 153

Soit une classe B qui hrite d'une classe A. Soit f une mthode dfinie dans A. Dans une mthode d'instance g() de B, super. sert dsigner un membre de A. par exemple: super.f() dsigne la mthode f() de A Attention: On ne peut remonter plus haut que la classe mre pour rcuprer une mthode redfinie : pas de super.super.

VINCI 2012-2013- T.HAJJI- 154

Exemple: class A { public void f(){ System.out.println("Je suis dans la classe de base A"); } } class B extends A { public void g(){ super.f(); // dsigne la mthode f() de la classe mre A System.out.println("je suis aussi dans la class derivee B"); } } public class TestRedefinition { public static void main (String args[]) { B b = new B(); b.g(); } }

VINCI 2012-2013- T.HAJJI- 155

Hritage (Suite) Une Classe 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

VINCI 2012-2013- T.HAJJI- 156

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 - float est un sous type de double
-

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
VINCI 2012-2013- T.HAJJI- 157

Dfinitions: - La classe (ou le type) relle 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 (la clase) dclar 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

VINCI 2012-2013- T.HAJJI- 158

Cas des tableaux


Soit B une classe qui hrite de la classe A, alors on peut crire : A[] tab = new B[5]; Attention: Dans tab[] il faut les valeurs de type rel et non celles du type dclar (cest dire des valeur de type B et non de type A). Par exemple, si on a les instructions suivantes:

A[] tab = new B[5]; A a = new A(); tab[0] = a; Passe la compilation mais provoquera une erreur lexcution car tab[0] reoit une valeur de type A et non une valeur de type B
VINCI 2012-2013- T.HAJJI- 159

Polymorphisme
Exemple introductif: Considrons lexemple suivant o B est une classe qui hrite de la classe A. Soient f() une mthode qui redinie dans B et g une mthode dfinie dans A. On suppose que class A { public void f(){ System.out.println("Methode f(): Classe de base A"); } public void g(){ System.out.println("Methode g(): Classe de base A"); } } class B extends A { public void f(){ System.out.println("Methode f(): Classe B derivee de A"); public void h(){ System.out.println("Methode h(): Classe B derivee de A"); } }

VINCI 2012-2013- T.HAJJI- 160

A a=new A(); B b = new B(); a.f(); // appelle la mthode dfinie dans A a=b; // A a = new(B); a.f(); // appelle la mthode dfinie dans B a.g(); // appelle la mthode dfinie dans A b.g(); // appelle la mthode dfinie dans A Il faut noter que la mme criture a.f(); peut correspondre des appels diffrents de la mthode f(). Ceci est ralis grce au polymorphisme. 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

VINCI 2012-2013- T.HAJJI- 161

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 ossde 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 ().

VINCI 2012-2013- T.HAJJI- 162

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)

VINCI 2012-2013- T.HAJJI- 163

Mcanisme de la liaison retarde: cas des mthodes redfinies Soit D la classe relle dun objet d (D est la classe du constructeur qui a cr lobjet d) et soit A la classe de dclaration de lobjet d (A d = new D();). Si on a linstruction: d.f(); quelle mthode f() sera appele ? 1. Si la mthode f() nest pas dfinie dans une classe anctre de la classe de dclaration (classe A) alors erreur de compilation. 2. Si non Si la mthode f() est redfinie dans la classe D, alors cest cette mthode qui sera excute Sinon, la recherche de la mthode f() se poursuit dans la classe mre de D, puis dans la classe mre de cette classe mre, et ainsi de suite, jusqu trouver la dfinition dune mthode f() qui sera alors excute.

VINCI 2012-2013- T.HAJJI- 164

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. Si on a: A a = new B(); a.f(); Alors la mthode f() appele est celle dfinie dans B. Si C hrite de B et si la mthode f() est redfinie dans C, alors si on a: A a = new C(); // Ok car C hrite de B qui hrite de A a.f(); La mthode appele est celle dfinie dans C.

VINCI 2012-2013- T.HAJJI- 165

Utilits du Polymorphisme: Le polymorphisme permet dviter les codes qui comportent de nombreux embranchements et tests. Exemple Considrons une classe FormeGeometrique. Supposons que les classes Rectangle et Cercle hritent de la super classe FormeGeometrique. Dans un tableau htrogne, on ranges des objets de type Rectangle, Cercle. Ensuite on affiche le contenu du tableau

VINCI 2012-2013- T.HAJJI- 166

Exemple
class FormeGeometrique { public void dessineRectangle() {} // mthode vide public void dessineCercle() {} // mthode vide } class Rectangle extends FormeGeometrique { public void dessineRectangle() { System.out.println("Je suis un rectangle "); } } class Cercle extends FormeGeometrique { public void dessineCercle() { System.out.println("Je suis un cercle .... "); } }

VINCI 2012-2013- T.HAJJI- 167

public class TestFigPoly { public static void main(String[] args) { FormeGeometrique [] figures = new FormeGeometrique[3]; figures[0]=new Rectangle(); figures[1]=new Cercle(); figures[2]=new Cercle(); for (int i=0; i < figures.length; i++) { if (figures[i] instanceof Rectangle) figures[i].dessineRectangle(); else if (figures[i] instanceof Cercle) figures[i].dessineCercle(); } } } instanceof: Soit b est une instance d'une classe B alors (b instanceof A) retourne true si B est une sous classe de A. En particulier (b instanceof B) retourne true.
VINCI 2012-2013- T.HAJJI- 168

Inconvnients dans le code prcdent: 1. Si on veut rajouter une nouvelle forme gomtrique par exemple, triangle alors on est obliger de:
changer dans le code source aux niveaux dfinition de la classe (rajouter la mthode vide public void dessineTriangle() {}) Rajouter un branchement pour la forme Triangle

2. Si on traite plusieurs formes gomtrique, 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 existant)

VINCI 2012-2013- T.HAJJI- 169

Lexemple peut tre rcrit de la manire suivante en exploitant le polymorphisme


class FormeGeometrique { public void dessineFigure() {} // mthode vide } class Rectangle extends FormeGeometrique { public void dessineFigure() { System.out.println("Je suis un rectangle "); } } class Cercle extends FormeGeometrique { public void dessineFigure() { System.out.println("Je suis un cercle .... "); } }
VINCI 2012-2013- T.HAJJI- 170

public class TestFigPoly { public static void main(String[] args) { FormeGeometrique [] figures = new FormeGeometrique[3]; figures[0] = new Rectangle(); figures[1] = new Cercle(); figures[2] = new Cercle(); for (int i=0; i < figures.length; i++) figures[i].dessineFigure(); // pas besoin de spcifier quelle forme } }

VINCI 2012-2013- T.HAJJI- 171

Un autre exemple dexploitation du Polymorphisme: Considrons lexemple prcdent, en supposant que le rectangle et le cercle sont caractriss par des champs privs qui dsignent:
- La position dans le plan (position du centre) - La longueur et la largeur pour le rectangle - Le rayon pour le Cercle.

Considrons un tableau htrogne qui contient des formes gomtriques diffrentes: rectangles, cercles, ... Le but et dafficher le type de la forme gomtrique et ses caractristiques

VINCI 2012-2013- T.HAJJI- 172

1re solution:
class FormeFigure { public void dessineFigure() {} } class Rectangle extends FormeFigure { public Rectangle(int x, int y, int longueur, int largeur) { // centre (x,y) this.x=x; this.y=y; this.largeur=largeur; this.longueur=longueur; } public void dessineFigure() {
System.out.println(" Je suis un Rectangle de longueur " +longueur +" et de largeur " + largeur);

System.out.println("

ma position dans le plan est (" + x + " ," + y + ")" );

} private int x,y; private int largeur, longueur; }

VINCI 2012-2013- T.HAJJI- 173

class Cercle extends FormeFigure { public Cercle(int x, int y, int rayon){ // centre (x,y) this.x=x; this.y=y; this.rayon=rayon; } public void dessineFigure(){ System.out.println(" Je suis un cercle de Rayon " + rayon); System.out.println(" ma position dans le plan est (" + x + " ," + y + ")" ); } private int x,y; private int rayon; }

VINCI 2012-2013- T.HAJJI- 174

public class TestFigPolySuite { public static void main(String[] args) { FormeFigure [] figures = new FormeFigure[2]; figures[0]=new Rectangle(1,2,15,6); figures[1]=new Cercle(0,0,4); for (int i=0; i < figures.length; i++) figures[i].dessineFigure(); } }

VINCI 2012-2013- T.HAJJI- 175

2me solution : on ne redfinie pas la position dans le plan qui est la mme pour toutes les formes gomtrique. class FormeFigure { public FormeFigure(int x, int y) { // constructeur this.x=x; this.y=y; } public void dessineFigure() { afficheMonIdentite(); System.out.println(" ma position dans le plan est (" + x + " ," + y + ")" ); } public void afficheMonIdentite(){}; // mthode vide private int x,y; }

VINCI 2012-2013- T.HAJJI- 176

class Rectangle extends FormeFigure { public Rectangle(int x, int y, int longueur, int largeur) { // centre (x,y) super(x,y); this.largeur=largeur; this.longueur=longueur; } public void afficheMonIdentite() {
System.out.println(" Je suis un Rectangle de longueur " +longueur +" et de largeur " + largeur);

} private int largeur, int longueur; } class Cercle extends FormeFigure { public Cercle(int x, int y, int rayon){ // centre (x,y) super(x,y); this.rayon=rayon; } public void afficheMonIdentite() { System.out.println(" Je suis un cercle de Rayon " + rayon); } private int rayon; }
VINCI 2012-2013- T.HAJJI- 177

public class TestFigPolySuite { public static void main(String[] args) { FormeFigure [] figures = new FormeFigure[2]; figures[0]=new Rectangle(1,2,15,6); figures[1]=new Cercle(0,0,4); for (int i=0; i < figures.length; i++) figures[i].dessineFigure();
// la mthode afficheMonIdentite() appele est celle dfinie dans la classe //relle de lobjet et non celle dfinie dans la classe de dclaration

} }
VINCI 2012-2013- T.HAJJI- 178

Cast (transtypage): conversions de classes Le cast est le fait de forcer le compilateur considrer un objet comme tant dun type qui nest pas le type dclar ou rel de lobjet En Java, les seuls casts autoriss entre classes sont les casts entre classe mre et classes filles

VINCI 2012-2013- T.HAJJI- 179

Syntaxe Pour caster un objet en classe A :


(C) o;

Exemple : FormeFigure a = new FormeFigure(); Rectangle r = (Rectangle) a; FormeFigure b; (Rectangle) b = r;

VINCI 2012-2013- T.HAJJI- 180

UpCast : classe fille classe mre Upcast : un objet est considr comme une instance dune des classes anctres de sa classe relle Il est toujours possible de faire un upcast car tout objet peut tre considr comme une instance dune classe anctre Le upcast est souvent implicite

VINCI 2012-2013- T.HAJJI- 181

DownCast : classe mre classe fille Downcast : un objet est considr comme tant dune classe fille de sa classe de dclaration Toujours accept par le compilateur Mais peut provoquer une erreur lexcution ; lexcution il sera vrifi que lobjet est bien de la classe fille Un downcast doit toujours tre explicite

VINCI 2012-2013- T.HAJJI- 182

Classes abstraites
Une classe abstraite (abstract class) est une classe dclare avec le mot cl abstract class. Par exemple: abstract class A { } Dans une classe abstraite on peut trouver: des champs, des mthodes et des mthodes abstraites
VINCI 2012-2013- T.HAJJI- 183

Une mthode est abstraite, lorsquon la dclare sans donner son implmentation: on ne fournit que le type de la valeur de retour et la signature (lentte de la mthode). Les mthodes abstraite sont dclare avec le mot cl abstract. Exemple: abstract void f(int i, float x); abstract double g(); La mthode peut tre implmente par les classes filles.
VINCI 2012-2013- T.HAJJI- 184

- On peut crer une rfrence sur un objet de type A (une classe abstraite) mais il est interdit de crer une instance (un objet) dune classe abstraite A a; // autoris A a = new A(); // nest pas autoris. - Si B hrite de A alors on peut crire: A a = new B(); - Une mthode static ne peut tre abstraite (car on ne peut redfinir une mthode static) - Une classe qui contient au moins une mthode abstraite est automatiquement abstraite - Une mthode dclare abstraite doit obligatoirement tre dclare public.
VINCI 2012-2013- T.HAJJI- 185

Intrt des classe abstraites:


la classe mre dfinit la structure globale dun algorithme elle laisse aux classes filles le soin de dfinir des points bien prcis de lalgorithme.

VINCI 2012-2013- T.HAJJI- 186

Interfaces Dfinition des interfaces Une classe est purement abstraite si toutes ses mthodes sont abstraites. Une interface est une classe purement abstraite dclare avec le mot cl interface, dont toutes les mthodes sont publiques. Une interface est une liste de noms de mthodes publiques.
VINCI 2012-2013- T.HAJJI- 187

Exemples dinterfaces public interface Figure { public abstract void dessineFigure(); public abstract void deplaceFigure(int dx, int dy); } Les interfaces sont implmentes par des classes
Une classe implmente une interface I si elle dclare implements I dans son en-tte

VINCI 2012-2013- T.HAJJI- 188

Ch. V La gestion des Exceptions


Dfinition Une exception est un signal indiquant que quelque chose dexceptionnelle (comme une erreur) sest produit. Elle interrompt le flot dexcution normal du programme Plutt que de compliquer le code du traitement normal, on traite les conditions anormales part Le traitement normal apparat ainsi plus simple et plus lisible
VINCI 2012-2013- T.HAJJI- 189

Exemple: Considrons la classe point qui a un constructeur deux arguments (position du oint dans le plan) et une mthode deplace qui permet de dplacer le point dans le plan. Le programme doit sarrter si au moins une des coordonnes du point est ngatif.

VINCI 2012-2013- T.HAJJI- 190

public class Point { private int x, y; public Point(int x, int y) { if ((x < 0) || (y < 0)) { // Dtection de lException System.out.println("Erreur de Construction"); // traitement de lexception System.exit(-1); } else { this.x = x ; this.y = y; // traitement normal } } public void deplace(int dx, int dy) { if ((x+dx < 0) || (y+dy < 0)) { // Dtection de l Exception System.out.println("Mauvais Dplacement"); // traitement de lexception System.exit(-1); } else { x = x+dx ; y = y+dy; // traitement normal } } }

VINCI 2012-2013- T.HAJJI- 191

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); a.deplace(-1,2); a = new Point(3, 4); a.deplace(3,-2); // 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), deplace(-1, 2) , Point(3,4) et deplace(3,-2) nont gnr aucune exception..

VINCI 2012-2013- T.HAJJI- 192

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); a.deplace(-1,2); a = new Point(-2, 4); a.deplace(3,-6); // Fin du bloc susceptible de gnrer une exception System.out.println (" Excution bien passe i= "+i); } } Sortie du programme: Erreur de Construction Les appels de Point(6,1) et deplace(-1, 2) nont pas gnr dexception, donc ils sont excuts normalement. Par contre lappel de Point(-2,4) a gnr une exception et a provoqu larrt du programme (appel de System.exit(-1);). Lappel de deplace(3,-6) et linstruction System.out.printl() nont pas t excuts.
VINCI 2012-2013- T.HAJJI- 193

Dans cet exemple 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.
Plutt que 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 )

VINCI 2012-2013- T.HAJJI- 194

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 */ } 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 */ } catch ( Type2Exception e) { // de type Type2Exception qui hrite de Exception /* code */ } ..

VINCI 2012-2013- T.HAJJI- 195

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 l autre jusqu ce quon trouve un bloc correspondant l exception le code du bloc catch est excut

VINCI 2012-2013- T.HAJJI- 196

Exemple1: Un 1er Test public class Test { 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"); 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 deplace(3,-6) et les instructions a prs le bloc try nont pas t excuts.

VINCI 2012-2013- T.HAJJI- 197

Exemple1: Un 2me Test public class Test { 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"); System.exit(-1); } System.out.println(" Excution bien passe"); } } Sortie du programme: Excution bien passe

Lappel de Point(6,1) et Point(2,4) nont pas gnr dexception donc le code catch() na pas t excut par consquent lexcution est alle au-del du bloc try.

VINCI 2012-2013- T.HAJJI- 198

Exemple2:
public class Test { public static void main(String[] argv) { try { Point a = new Point(1,4); a.deplace(-3,1); a = new Point(7, 4); } catch (ErrConst e) { System.out.println("Erreur Construction"); System.exit(-1); } catch (ErrDepl ed) { System.out.println("Erreur de Dplacement"); System.exit(-1); } } } Sortie du programme: Erreur de Dplacement Lappel de deplace(-3,1) a gnr une exception, donc un saut est effectu vers le bloc catch(ErrDepl). Lexcution du code du bloc catch(ErrDepl) a provoqu larrt du programme (appel de System.exit(-1);).
VINCI 2012-2013- T.HAJJI- 199

Comment lancer (dclencher) une exception


Une mthode dclare quelle peut lancer une exception par le mot cl throws Par exemple: public void deplace(int dx, int dy) throws ErrDepl {
// Dclare que la mthode depalce() peut gnrer une exception

... } Ensuite la mthode lance une exception, en crant une nouvelle valeur (un objet) dexception en utilisant le mot cl throw public void deplace (int dx, int dy) throws ErrDepl { if ((x+dx <0) || (y+dy<0)) throw new ErrDepl(); x= }
// Dtection de lexception et Cration dune nouvelle valeur dexception x+dx ; y = y+dy; // traitement normal

VINCI 2012-2013- T.HAJJI- 200

ErrDepl et ErrConst sont deux classes qui hrite de la classe Exception. Elles peuvent tre dfinie de la manire suivante: class ErrDepl extends Exception{ } class ErrConst extends Exception{ }

VINCI 2012-2013- T.HAJJI- 201

Un Premier exemple complet: class ErrConst extends Exception {} class Point { private int x, y; public Point(int x, int y) throws ErrConst { 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); a = new Point(-2, 4); } catch (ErrConst e) { // Erreur de type ErrConst qui hrite de Exception System.out.println("Erreur de Construction"); System.exit(-1); } } }
VINCI 2012-2013- T.HAJJI- 202

Un Deuxime exemple complet: class ErrConst extends Exception {} class ErrDepl extends Exception {} public 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; } public void deplace(int dx, int dy) throws ErrDepl{ if ((x+dx < 0) || (y+dy < 0)) throw new ErrConst(); x = x+dx ; y = y+dy; } }
VINCI 2012-2013- T.HAJJI- 203

public class Test { public static void main(String[] argv) { try { Point a = new Point(1,4); a.deplace(0,1); a = new Point(7, 4); a.deplace(3,-5); a.deplace(-1,-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); } } }
VINCI 2012-2013- T.HAJJI- 204

Les classes derreurs/exceptions


La classe java.lang.Throwable (classe fille de Object) est la superclasse de toutes les erreurs et exceptions rencontres dans le langage de programation Java. Java.lang est un package qui rassemble les classes de base de Java. Toutes les classes et interfaces de java.lang sont automatiquement importes par le compilateur.

VINCI 2012-2013- T.HAJJI- 205

Arbre dhritage des exceptions


Throwable

Error

Exception

RuntimeException

Exceptions contrles

VINCI 2012-2013- T.HAJJI- 206

Quelques sous-classes de RuntimeException (Exceptions non contrles par le compilateur)


NullPointerException: Tentative d'utiliser une rfrence null ClassCastException : Tentative de cast d'un objet dans un type incorrecte. IndexOutOfBoundsException : Un indice (sur un tableau, une chane) ou un intervalle dfini par deux indices ont dpass les limites infrieures ou suprieures. Ses sous-classes : ArrayIndexOutOfBoundsException, pour les tableaux (indice ngatif ou suprieur ou gal la taille du tableau). StringIndexOutOfBoundsException, pour les chanes de caractres.

VINCI 2012-2013- T.HAJJI- 207

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.

VINCI 2012-2013- T.HAJJI- 208

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 getMessage() retourne le message derreur dcrivant lexception printStackTrace() affiche sur la sortie standard la liste des appels de mthodes ayant conduit lexception Exception(): constructeur sans argument Exception(String): Constructeur avec Argument

VINCI 2012-2013- T.HAJJI- 209

Un premier exemple: dfinir un constructeur personnalis qui a pour argument une chane de caractres:
class ErrConst extends Exception { 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; } }

VINCI 2012-2013- T.HAJJI- 210

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

VINCI 2012-2013- T.HAJJI- 211

Un deuxime exemple: dfinir un constructeur personnalis qui a 2 arguments de type int :


class ErrConst extends Exception { private int x, y; public ErrConst(int x, int y) { this.x=x; this.y=y; } public int getX() { return x;} public int getY() { return y;} } class Point { private int x, y; public Point(int x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(x,y); this.x = x ; this.y = y; } }
VINCI 2012-2013- T.HAJJI- 212

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(" Erreur aux points" +e.getX()+" et " +e.getY()); System.exit(-1); } } } Sortie: Erreur aux points -2 et 4

VINCI 2012-2013- T.HAJJI- 213

Mthode printStackTrace(): class ErrConst extends Exception{} 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; } }

VINCI 2012-2013- T.HAJJI- 214

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)
VINCI 2012-2013- T.HAJJI- 215

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 { ... }

VINCI 2012-2013- T.HAJJI- 216

Exemple: 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(); } finally { System.out.println("Fin du Programme"); System.exit(-1); } } } Dans toutes les excutions (dclenchement ou non dexception), les instructions du bloc finally seront excutes.
VINCI 2012-2013- T.HAJJI- 217

Ch. VI Complment

I. Interface Classe qui implmente partiellement une interface


Soit une interface I1 et une classe C qui limplmente : public class C implements I1 { } C peut ne pas implmenter toutes les mthodes de I1 Mais dans ce cas C doit tre dclare abstract (il lui manque des implmentations) Les mthodes manquantes seront implmentes par les classes filles de C

VINCI 2012-2013- T.HAJJI- 218

Implmentation de plusieurs interfaces Une classe peut implmenter une ou plusieurs interfaces (et hriter d'une classe) : public class CercleColore extends Cercle implements Figure, Coloriable {

VINCI 2012-2013- T.HAJJI- 219

II. Champs de classe Certaines variables sont partages par toutes les instances dune classe. Ce sont les variables de classe (modificateur static) - Si une variable de classe est initialise dans sa dclaration, cette initialisation est excute une seule fois quand la classe est charge en mmoire

VINCI 2012-2013- T.HAJJI- 220

Exemple class A { static int n; float y; } A a1=new A(), a2=new A(); a1 et a2 deux instances diffrentes mais qui partagent la mme variable n a1.n et a2.n dsignent donc le mme champs. Il est possible de sy rfrer en le nommant simplement a1.n=5; // automatiquement on a : a2.n =5 On peut crire A.n=5; // champs (statique) de la classe A, dans ce cas a1.n=5 et a2.n=5

VINCI 2012-2013- T.HAJJI- 221

Exemple: public class Etudiant { private String nom, prenom; private static int nbEtudiants = 0; public Etudiant(String n, String p) { nom = n; prenom = p; nbEtudiants++; // chaque cration dun nouveau tudiant, le // nombre dtudiant augment de 1. } ... }

VINCI 2012-2013- T.HAJJI- 222

III. 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. Une mthode de classe ne pourra pas accder des champs usuels (champs non statiques).

VINCI 2012-2013- T.HAJJI- 223

Exemple

class A { private float x; // champs usuel static int n; // champs de classe public static void f() { // mthode de clase //ici, on ne pas accder au champs x, champs usuel // ici on peut accder au champs n } }
VINCI 2012-2013- T.HAJJI- 224

class Etudiant { private String nom, prenom; private static int nbEtudiants; public Etudiant(String nom, String Prenom){ this.nom=nom; this.prenom=prenom; nbEtudiants++; } public static int getNbEtudiants(){ return nbEtudiants; } }

VINCI 2012-2013- T.HAJJI- 225

public class MethodeStatic{ public static void main(String[] argv) { Etudiant e1= new Etudiant("Mohammed","Ali"); Etudiant e2 =new Etudiant("Fatima","Zahra"); // les trois instructions suivante font la mme chose System.out.println("Nb etudiants = "+Etudiant.nbEtudiants); System.out.println("Nb etudiants = "+e1.nbEtudiants); System.out.println("Nb etudiants = "+e2. Etudiant.nbEtudiants); } }

VINCI 2012-2013- T.HAJJI- 226

IV. Mthodes daccs aux valeurs des variables depuis lextrieur Comment peut on accder la valeur dune variable protge ?? Exemple: class Etudiant { private String nom, prenom; public Etudiant(String nom, String Prenom){ this.nom=nom; this.prenom=prenom; } } public class MethodeStatic{ public static void main(String[] argv) { Etudiant e= new Etudiant("Mohammed","Ali"); // comment afficher le nom de letudiant e; ?? // System.out.println("Nom = "+e.nom); ne marche pas car nom est priv } }

VINCI 2012-2013- T.HAJJI- 227

Un accesseur 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 class MethodeStatic{ public static void main(String[] argv) { Etudiant e= new Etudiant("Mohammed","Ali"); System.out.println("Nom = "+e.getNom()); } }

VINCI 2012-2013- T.HAJJI- 228

Comment peut on peut on modifier (depuis lextrieur) 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.cne=23541654; ne marche pas car cne est un champ protg (private)

} }

VINCI 2012-2013- T.HAJJI- 229

Un modificateur (mutateur) 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); } }

VINCI 2012-2013- T.HAJJI- 230

V. Package (paquetage)
Les classes Java sont regroupes en paquetages (packages en anglais) comparables aux bibliothques des autres langages comme le langage C,... Le langage Java est fourni avec un grand nombre de paquetages Dans un fichier .java, on doit indiquer quels packages appartiennent les classes quon utilise laide de la clause import, elle se place en dbut de fichier avant la dclaration de la premire classe ou interface du fichier : import nomClasse; // Importe une classe sans package import nomPackage.nomClasse; // Importer une classe d'un package import nomPackage.*; // Importer toutes les classes d'un package
VINCI 2012-2013- T.HAJJI- 231

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(); } }
VINCI 2012-2013- T.HAJJI- 232

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.

VINCI 2012-2013- T.HAJJI- 233

Package java.lang Le package java.lang contenant les classes standards telles que System Par dfaut, les classes du paquetage java.lang (contenant les classes standards tel que System) sont automatiquement importes. Dans un programme .java on peut faire appel toutes les classes de java.lang sans spcifier leur chemin. Exemple: On peut utliser la classe Exception sans spcifier le chemin class SimpleException extends Exception {} qui est quivalent class SimpleException extends java.lang.Exception {} ou import java.lang.Eception; class SimpleException extends Exception {}

VINCI 2012-2013- T.HAJJI- 234

Accs aux package

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.*;
VINCI 2012-2013- T.HAJJI- 235

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.*;

VINCI 2012-2013- T.HAJJI- 236

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

VINCI 2012-2013- T.HAJJI- 237

Dfinition: Pour crer un 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. Attention: un package portant le nom Pack1 doit tre stock dans un rpertoire de nom Pack1. De plus, 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 standards.

VINCI 2012-2013- T.HAJJI- 238

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(); } }
VINCI 2012-2013- T.HAJJI- 239

// dans un fichier Rectangle.java situ dans le rpertoire ./grahics package graphics; public class Rectangle{ public void dessineRectangle() { System.out.println(" Dessine un rectangle "); } } // dans fichier Cercle.java situ dans le rpertoire ./grahics package graphics; public class Cercle { public static void dessineCercle() { System.out.println(" Dessine un cercle .... "); } } // dans fichier Triangle.java situ dans le rpertoire ./grahics package graphics; public class Triangle { public void dessineTriangle() { System.out.println(" Dessine un triangle.... "); } }
VINCI 2012-2013- T.HAJJI- 240

Ch. VII. Introduction aux Interfaces graphiques Cette partie du cours est essentiellement dvelopp partir du livre "Programmer en Java" de Claude Delannoy, Edition Eyrolles.

VINCI 2012-2013- T.HAJJI- 241

Les applications informatiques ncessitent des changes dinformations entre lutilisateur et la machine. Cet change dinformations peut seffectuer avec une interface utilisateur (UI en anglais) en mode texte (ou console) ou en mode graphique. Une interface graphique est compose de plusieurs fentres qui contiennent divers composants graphiques (widgets) tels que
boutons listes droulantes menus champ texte etc.

Les interfaces graphiques sont souvent appels GUI (pour Graphical User Interface en Anglais)
VINCI 2012-2013- T.HAJJI- 242

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.

VINCI 2012-2013- T.HAJJI- 243

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).

Les packages principaux pour chaque bibliothque:


AWT : java.awt et java.awt.event Swing : javax.swing, javax.swing.event

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.*;
VINCI 2012-2013- T.HAJJI- 244

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); // situ dans le coin suprieur gauche de dimension 300*150 pixels // On peut utiliser setBounds(100,40,300,200); le coin suprieur gauche de // la fentre est plac au pixel de coordonnes 100, 40 et ses dimensions // seront de 300 *200 pixels } }
VINCI 2012-2013- T.HAJJI- 245

public class TestFenetre { public static void main(String[] args) { JFrame fen = new MaFenetre(); fen.setVisible(true); // rend visible la fentre de rfrence fen
// on peut utiliser linstruction // fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // qui mis fin au programme lorsque la fentre se ferme

} }

VINCI 2012-2013- T.HAJJI- 246

Attention:
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, on peut par exemple faire un Ctrl C. On peut appeler la mthode JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) qui permet de dfinir le comportement de la fentre lors de sa fermeture. Le paramtre JFrame.EXIT_ON_CLOSE indique la fin du programme lorsque la fentre se ferme.

VINCI 2012-2013- T.HAJJI- 247

Ajout dun composant dans une fentre:


Lajout dun bouton dans le contenu dune fentre se passe en 3 tapes 1. Crer une instance de la classe JButton : JButton monBouton = new JButton () ; 2. On utilise la mthode getContentPane() de la classe JFrame qui retourne une rfrence, de type Container, sur le contenu de la fentre. Par exemple: Container c= getContentPane(); 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 lappel c.add(monBouton); permet dajouter lobjet de rfrence monBouton dans le contenu de rfrence c. La disposition des composants dans le contenu peut tre gre automatiquement par un gestionnaires de disposition (Layout Manger en anglais) associ chaque container. 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
VINCI 2012-2013- T.HAJJI- 248

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(); // cration dun bouton de rfrence monBouton portant ltiquette Un bouton monBouton = new JButton("Un Bouton"); c.add(monBouton); c.setLayout(new FlowLayout()); // ou tout simpolement getContentPane().setLayout(new FlowLayout()); // getContentPane().add(monBouton); } private JButton monBouton; }

VINCI 2012-2013- T.HAJJI- 249

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; }

VINCI 2012-2013- T.HAJJI- 250

Programmation vnementielle
Dans la programmation squentielle cest le programme qui garde le contrle des oprations(les instructions du programme principal sont excutes les unes aprs les autres dans lordre de leurs dcriture). Dans la programmation vnementielle, le programme est dirig par les vnements Lutilisateur pilote lordre dexcution des instructions en cliquant o il veut. Le programme ne fait que ragir 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.
VINCI 2012-2013- T.HAJJI- 251

Une interface graphique est base sur 2 grandes composantes diffrentes :


L'aspect visuel qui comprend les cadres et les composants d'interfaces qui sont placs dessus L'interaction avec les utilisateurs (action de la souris, du clavier) c'est dire en fait la gestion des vnements.

VINCI 2012-2013- T.HAJJI- 252

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

VINCI 2012-2013- T.HAJJI- 253

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 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

VINCI 2012-2013- T.HAJJI- 254

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.

VINCI 2012-2013- T.HAJJI- 255

Linterface MouseListener correspond une catgorie dvnements souris. Elle comporte cinq mthodes correspondant chacune un vnement souris particulier. 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) }

VINCI 2012-2013- T.HAJJI- 256

Exemple 1: Gestion de clics dans une fentre, chaque clic dans la fentre, le message clic dans la fenetre saffiche. 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 } }

VINCI 2012-2013- T.HAJJI- 257

//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) { } }

VINCI 2012-2013- T.HAJJI- 258

Exemple 2: 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) { } }
VINCI 2012-2013- T.HAJJI- 259

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 Mouse Adapter) et de redfinir uniquement les mthodes voulues.

VINCI 2012-2013- T.HAJJI- 260

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") ; } }
VINCI 2012-2013- T.HAJJI- 261

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 la actionPerformed que nous crirons le code qui sexcutera lors du click.

VINCI 2012-2013- T.HAJJI- 262

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; }
VINCI 2012-2013- T.HAJJI- 263

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; }
VINCI 2012-2013- T.HAJJI- 264

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); }
VINCI 2012-2013- T.HAJJI- 265

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; }

VINCI 2012-2013- T.HAJJI- 266

Exemple: Un 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 MonBouton1, MonBouton2 ; public MaFenetre () { super("Plusieurs boutons") ; setSize(300, 200) ; Container contenu = getContentPane() ; MonBouton1 = new JButton("Bouton 1") ; contenu.add(MonBouton1) ; MonBouton2 = new JButton("Bouton 2") ; contenu.add(MonBouton2) ; contenu.setLayout(new FlowLayout()); MonBouton2.addActionListener(new EcouteurBouton2()); MonBouton1.addActionListener(new EcouteurBouton1()); } }
VINCI 2012-2013- T.HAJJI- 267

class EcouteurBouton2 implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("action sur le bouton 2") ; } } class EcouteurBouton1 implements ActionListener { public void actionPerformed(ActionEvent e) { System.exit(0); } }

VINCI 2012-2013- T.HAJJI- 268

Cration dynamique de plusieurs boutons

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()); crBouton=new JButton ("CREATION BOUTON"); contenu.add(crBouton); EcouteCr ecouteCr=new EcouteCr(contenu); crBouton.addActionListener(ecouteCr); } private JButton crBouton; }
VINCI 2012-2013- T.HAJJI- 269

class EcouteCr implements ActionListener { public EcouteCr(Container contenu){ this.contenu=contenu; } public void actionPerformed(ActionEvent ev) { JButton nouvBout=new JButton("Bouton"); contenu.add(nouvBout); contenu.validate(); } private Container contenu; }

VINCI 2012-2013- T.HAJJI- 270

Les cases cocher : La case cocher de type JCheckBox permet lutilisateur deffectuer un choix de type oui/non. Exemple import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; import javax.swing.event.* ; class MaFenetre extends JFrame { private JCheckBox MaCase; public MaFenetre () { super("Une fenetre avec une case") ; setBounds(10,40,300,200) ; MaCase = new JCheckBox("Une case") ;
// cration dune case cocher de rfrence MaCase portant ltiquette Une case

getContentPane().add(MaCase) ; } }
VINCI 2012-2013- T.HAJJI- 271

Par dfaut, une case cocher est construite dans ltat non coch (false). La mthode isSelected de la classe AbstractButton permet de connatre ltat (true ou false) dune case cocher un moment donn. La mthode setSelected de la classe AbstractButton permet de modifier ltat dune case cocher. Exemple: MaCase.setSelected(true) ; //coche la case de rfrence MaCase

VINCI 2012-2013- T.HAJJI- 272

Quelques Rfrences: Livre: - Titre: Programmer en JAVA , AuteurClaude Delnoy, Editeur: Eyrolles - Thinking in Java, Bruce Eckel Ressources Internet: - http://www.java.sun.com, - http://metarisk.inapg.inra.fr/content/download, Cours Interface graphique en Java API swing, Juliette Dibie-Barthlemy mai 2005

VINCI 2012-2013- T.HAJJI- 273