Vous êtes sur la page 1sur 88

121643316.

doc ______________________________________________________________________________

Programmation Oriente Objets en JAVA


Cours du Cycle dApprofondissement

class { public private

Cours dispens par B. Chaulet

CNAM ANGOULEME 2000-2001 ___________________________________________________________________


DI GALLO Frdric Page 1 24/12/2012

121643316.doc ______________________________________________________________________________

PROGRAMMATION

ORIENTEE OBJETS : Gnralits sur JAVA

___________________________________________________________________
DI GALLO Frdric Page 2 24/12/2012

121643316.doc ______________________________________________________________________________

PROGRAMMATION JAVA: GNRALITS.....5


I. PROGRAMMATION CLASSIQUE ET ORIENTE OBJETS..........................................................................5 II. CLASSE ET OBJET.....................................................................................................................6 III. LES DONNES DUNE CLASSE....................................................................................................8 IV. LES MTHODES DUNE CLASSE................................................................................................11 4.1) Mthodes publiques de type Constructeur ...........................................................14 4.2) Mthodes publiques de type Accesseur ...............................................................17 4.3) Les mthodes de type binaire.....................................................................................21 4.4) La transmission de paramtres.................................................................................26 4.5) Le mot cl this ......................................................................................................27 V. LES VARIABLES ET MTHODES DE CLASSE..................................................................................28 VI. TRAVAUX PRATIQUES...........................................................................................................29 6.1) Utilisation de la classe String....................................................................................29 6.2) Cration dune classe................................................................................................32 VII. ANNEXE : LES TAPES DE DVELOPPEMENT EN JAVA.................................................................33

LES COLLECTIONS EN JAVA...........................37


I. INTRODUCTION..............................................................................................................37 II. LES TABLEAUX.............................................................................................................39 III. LES VECTEURS............................................................................................................42 3.1) La classe gnrique Object .................................................................................42 3.2) Les mthodes de la classe Vector ........................................................................45 3.3) La classe Enumeration ........................................................................................47 3.4) Les packages..............................................................................................................48 IV. LES DICTIONNAIRES..............................................................................................................49 V. LES FLUX.............................................................................................................................51 5.1) Oprations sur un fichier...........................................................................................51 5.2) La gestion des erreurs...............................................................................................53

L'HERITAGE EN JAVA........................................63
I. INTRODUCTION..............................................................................................................63 II. DFINITION DE L'HRITAGE......................................................................................................65 2.1) Le constructeur d'une classe drive.........................................................................66 2.2) Les proprits d'une classe drive...........................................................................67 2.3) Les mthodes d'une classe drive............................................................................68 III. MANIPULATIONS D'OBJETS ISSUS DE CLASSE MRE ET FILLE.........................................................69

EXEMPLES DE CLASSES JAVA.........................78


I. PUISSANCEDE10....................................................................................................................78 II. CAPACITE.............................................................................................................................79 III. PUISSANCE..........................................................................................................................80 IV. INVENTAIRE.........................................................................................................................80 V. CONNEXION & LISTECONNEXION............................................................................................81

___________________________________________________________________
DI GALLO Frdric Page 3 24/12/2012

121643316.doc ______________________________________________________________________________ VI. PRODUIT & PRODUITACHET................................................................................................83 VII. COMPTE & COMPTEEPARGNE..............................................................................................84 VIII. FACTURE & LISTEFACTURES..............................................................................................86 IX. CLIENT & CLIENTPRO.........................................................................................................88

___________________________________________________________________
DI GALLO Frdric Page 4 24/12/2012

121643316.doc ______________________________________________________________________________

INFORMATIQUE CNAM ANGOULEME 2000-2001

PROGRAMMATION JAVA: GNRALITS


I. Programmation classique et oriente objets

En programmation classique le dveloppement dune application se dcompose en deux tapes bien distinctes : La dfinition des structures de donnes capables daccueillir linformation que lon veut grer. Ainsi, en programmation classique, pour stocker en mmoire centrale une fraction on a introduit un enregistrement compos de 2 champs de type Entier nomms Numerateur et Denominateur . La conception de fonctions et de procdures qui travaillent sur les structures de donnes conues ltape prcdente et qui permettent de mettre en uvre tous les besoins exprims dans le cahier des charges. Cette forme de programmation, qui spare les donnes des traitements, rend difficile la mise en place de contrles, destins garantir la cohrence et lintgrit des donnes. Lutilisateur peut en effet accder directement aux donnes, sans utiliser les fonctions mises sa disposition. Par exemple, le programme dutilisation des fractions ci-dessous, dfinit partiellement la fraction F ce qui va entraner des erreurs lors de lappel certaines fonctions prsentes dans la bibliothque Fraction.h . #include<fraction.h> main() { struct Fraction F, R; F.Numerateur = 3 ; R=Inverse (F) ; } De plus, toute modification de limplmentation des donnes des consquences sur lensemble des fonctions travaillant sur ces donnes, et donc sur lensemble des traitements utilisant ces fonctions. Si lon choisit par exemple, pour des raisons doptimisation, dimplanter une fraction au moyen dune chane de caractres ( 4/5 ), toutes les fonctions de la bibliothque Fraction.h sont modifier au niveau du type des paramtres dentre ou de sortie. Il va de soi que ces changements imposent, leur tour, une modification de tous les programmes qui rfrencent la bibliothque Fraction.h .

___________________________________________________________________
DI GALLO Frdric Page 5 24/12/2012

121643316.doc ______________________________________________________________________________ La programmation oriente objets a t introduite afin de remdier ces inconvnients. Son principe de base consiste : dune part regrouper (ou "encapsuler") au sein dune mme unit (appele classe) les donnes et les traitements. Par exemple, on dfinira la classe Fraction de la manire suivante : class Fraction { private int Numerateur ; dclaration de variables
destines

private int Denominateur ; public void initialiser(int n, int d) {Numerateur = n ; Denominateur = d ; }

mmoriser une fraction.

traitements sur les fractions.

} Une fraction est dfinie par un numrateur, un dnominateur ainsi que par toutes les oprations mathmatiques existantes sur les fractions. dautre part contrler laccs aux donnes en les dclarant prives ce qui obligera lutilisateur de la classe employer les traitements encapsuls pour agir sur celles-ci. En conclusion, la programmation oriente objets a deux avantages principaux: - contrler l'accs aux donnes, - permettre la modification des classes sans avoir d'incidence sur les programmes des utilisateurs.

II. Classe et objet


Une classe est une description abstraite de structure de donnes et de traitements destine mmoriser et grer une ralit ou une notion. Par exemple la classe Fraction permet de mmoriser des fractions et de mettre en uvre des oprations sur ces dernires. A partir dune classe, tout langage objet permet (par lintermdiaire de l'oprateur new) de crer des objets qui seront des emplacements en mmoire centrale destins contenir effectivement linformation manipule. Ces objets sont appels instance et lopration de cration : instanciation. Dans louvrage Java, la synthse , les auteurs dfinissent une classe comme un "moule" partir duquel on peut obtenir autant dobjets que ncessaires. Le programme Java suivant illustre la cration dun objet de la classe Fraction . Fraction F; // dclaration dune variable qui va pointer sur un objet : Fraction ; F= new Fraction() ;
// F contient la valeur null // cration dun objet Fraction , c--d. allocation en mmoire centrale // dun espace destin recevoir la valeur dune fraction. // la variable F contient ladresse de cet emplacement. Numerateur

___________________________________________________________________
DI GALLO Frdric Page 6 24/12/2012

121643316.doc ______________________________________________________________________________
Denominateur

Il est important de noter que la variable F contient ladresse de lobjet et non lobjet luimme. Ainsi, si on dclare une autre variable G de la classe Fraction , laffectation G=F aura pour consquence daffecter dans la variable G ladresse contenue dans F . A lissue de cette instruction F et G pointe le mme objet. En langage Java, loprateur new recherche lespace ncessaire la reprsentation de lobjet et renvoie ladresse de cet objet. Dans le cas o loprateur nobtient pas lallocation ncessaire, il termine lexcution en renvoyant lexception OutOfMemoryError (qui sera tudie ultrieurement). Ds que lespace allou un objet nest plus dsign par une variable, lespace mmoire est rcupr par un systme de ramasse-miettes.

Application: On considre la classe Date :


Elle est dfinie par 3 donnes: Jour, Mois et Anne, ainsi que par toutes les oprations sur une date telles que lajout de 2 dates, le calcul de la date du lendemain, etc. Analyser lextrait du programme Java suivant et indiquer combien dobjets de la classe Date ont t crs au cours de lexcution. 0 1 2 3 4
N

int I ; Date D1,D2 ; D1=new Date() ; D2=D1 ; D1=new Date() ;

Type Image 0 Dclaration d'une variable de type primitive I 1 Dclaration des variables D1 et D2 D1 destines contenir des objets de type Date D2 2 Instanciation de D1 D1 D2 3 Instanciation de D2 vers l'objet de D1 D1 D2
NULL NULL NULL

Jour Mois Annee

Jour Mois Annee

4 Nouvelle instanciation de D1 D1

Jour Mois Annee

___________________________________________________________________
DI GALLO Frdric Page 7 24/12/2012

121643316.doc ______________________________________________________________________________

III. Les donnes dune classe


Toute classe comporte une partie donnes, dans laquelle on dcrit les emplacements mmoires - appels variables dinstance - qui seront utiles la mmorisation de linformation que lon veut grer. Ces emplacements sont en fait allous chaque instanciation et sont caractriss par un nom et un type qui peut tre simple ou structur. La classe Fraction utilise, pour mmoriser une fraction, deux variables dinstances de type simple Entier : Numerateur et Denominateur. A chaque instanciation de la classe Fraction, il y aura cration de ces deux variables comme le montre le schma ci-dessous :
Numerateur

Fraction F1, F2 ; F1=New Fraction() ; F2=New Fraction() ;

Denominateur

Numerateur Denominateur

On remarque donc, qu un moment donn, une variable dinstance existe en autant dexemplaires quil y a dobjets instancis. La syntaxe Java pour dclarer les variables dinstance dune classe est la suivante: SpcificateurAccs NomType NomVariable [=ValeurInitiale] Spcificateur daccs reprsente le niveau de protection de la donne; 2 niveaux Java: - public : laccs direct la donne est possible depuis tout programme dutilisation de la classe par la rfrence : VariableObjet.VariableDInstance - private : laccs direct la donne nest pas possible depuis un programme dutilisation de la classe. Lutilisateur devra utiliser des traitements encapsuls pour lire ou mettre jour ces donnes. Le programme ci-dessous illustre les consquences de laffectation des spcificateurs : - private la variable Numerateur , - public la variable Denominateur dans lutilisation de la classe Fraction : Fraction F ; F=New Fraction() F.Numerateur =2 F.Denominateur = 3

// affectation refuse la compilation car la variable Numerateur est prive // affectation autorise car la variable Denominateur est publique

___________________________________________________________________
DI GALLO Frdric Page 8 24/12/2012

121643316.doc ______________________________________________________________________________ La valeur initiale sera la valeur affecte dans la variable dinstance lors de la cration dun objet. Dans le cas o cette valeur nest pas prcise, cest une valeur qui dpend du type de la variable dinstance qui est affecte (par exemple 0 pour le type Entier ). La partie donnes de la classe Fraction pourrait scrire ainsi : class Fraction { private int Numerateur ; private int Denominateur =1; }

Application: On suppose que la partie Donnes de la classe Date :


class Date { public int Jour; public int Mois; public int Annee ; } 1. On considre le programma Java de test de la classe Date suivant. Indiquer le message affich par le programme lors de son excution. class test { public static void main(String args[]) { Date D1,D2 ; D1=new Date() ; D1.Jour = 1 ; D1.Mois = 1 ; D1.Annee = 2001 ; D2 = New Date() ; D2.Jour = 1 ; D2.Mois = 1 ; D2.Annee = 2001 ; if (D1==D2) System.out.println( galit ) ; else System.out.println ( Diffrence ) ; } } Le message affich est "Diffrence" car D1 et D2 sont diffrents. Ils contiennent les adresses distinctes des classes, seul leur contenu est gal. 2. A lissue de linstanciation dun objet de la classe Date , indiquer le contenu de ses variables dinstance. Jour, Mois et Annee sont des entiers, donc leur contenu "initial" est 0. 3. La dfinition de la classe Date autorise-t-elle crer (dans un programme dutilisation de la classe) des objets qui contiennent des valeurs qui ne correspondent pas une date (par exemple le :32/02/2000). Oui, on a le droit de mettre n'importe quel entier, mme s'il ne correspond pas une date

___________________________________________________________________
DI GALLO Frdric Page 9 24/12/2012

121643316.doc ______________________________________________________________________________

___________________________________________________________________
DI GALLO Frdric Page 10 24/12/2012

121643316.doc ______________________________________________________________________________

IV. Les mthodes dune classe


Les mthodes dune classe (encore appeles comportements ou traitements) se rpartissent en deux catgories : Les mthodes publiques qui correspondent tous les traitements que lutilisateur dune classe pourra appliquer aux objets de la classe. Certains auteurs qualifient ces mthodes publiques de messages que lon peut envoyer aux objets. Les mthodes prives qui sont des traitements introduits pour simplifier la conception de la classe, mais qui ne pourront pas tre utiliss depuis un programme dutilisation de la classe. Exemple: dans la classe Fraction la mthode destine calculer le PGCD de deux nombres entiers est une mthode prive dont lexistence rend plus simple le traitement destin mettre sous forme irrductible une fraction. Dans ce chapitre, on limitera ltude aux mthodes publiques. En Java la dclaration dune mthode publique respecte la syntaxe suivante : Public TypeRsultat NomFonction (Liste Paramtres formels) {Dclaration de variables locales Instructions } Remarque : on appelle signature de la mthode le nom de la fonction suivi de la liste de ses paramtres formels. Comme pour le langage C, dans le cas o la fonction ne renvoie aucun rsultat, on doit spcifier le mot cl void pour le TypeRsultat . Dans le cas o la fonction renvoie un rsultat, ce dernier devra tre retourn par linstruction return Rsultat . La liste des paramtres formels et des variables locales se dclare de la mme manire quen C. Remarquons que ces deux listes peuvent tre vides. En plus des paramtres dentre et des variables locales, toute mthode rfrence tout, ou une partie, des variables dinstance de la classe. Une mthode publique tant toujours appliqu un objet de la classe, ce seront les variables de cet objet qui seront effectivement rfrences lors de lexcution de la mthode. Ce principe est illustr ci-dessous par la mthode Afficher de la classe Fraction . class Fraction { private int Numerateur ; private int Denominateur ; public void Afficher() { System.out.println(Numerateur + / + Denominateur) ; } } En appliquant la mthode Afficher lobjet de gauche, ce seront les contenus des variables Numerateur et Denominateur de cet objet qui seront affichs c--d. 4/8 .

___________________________________________________________________
DI GALLO Frdric Page 11 24/12/2012

121643316.doc ______________________________________________________________________________ Lapplication dune mthode sur un objet scrit : VariableObjet.NomMthode(..). Par exemple, en supposant que la variable F pointe sur lobjet ci-dessus, laffichage de la fraction contenue dans cet objet scrira : F.Afficher() . Comme il a t dj dit dans le chapitre prcdent, si la mthode renvoie un rsultat, lapplication de la mthode un objet doit tre intgre une instruction, sinon elle devra tre spcifie comme une instruction. La mthode Afficher() sutilise comme une instruction car elle nadmet aucun paramtre de sortie.

Exemple:
class Date { public int Jour; public int Mois; public int Annee ;
concepteur

public void Afficher() { System.out.println(Jour + / + Mois+ / + Annee) ; public int MonJour() { return Jour ; } } class test { public static void main(String args[]) { Date D1 ; D1=new Date() ; D1.Jour = 12 ; D1.Mois = 02 ; D1.Annee = 2001 ; D1.Afficher() ; System.out.println (D1.MonJour()+25) ; } }

utilisateur

___________________________________________________________________
DI GALLO Frdric Page 12 24/12/2012

121643316.doc ______________________________________________________________________________

Application: Complter la description de la classe Fraction :


1. En crivant le contenu des mthodes suivantes : public void Initialiser(int N, int D) { // valorise les variables dinstance de lobjet cr avec les valeurs fournies en paramtre dentre. } public void Inverse() { // inverse le contenu de la fraction } }

public float Valeur() { // renvoie la valeur en relle de la fraction { { public void Initialiser(int N, int D) Numerateur = N ; Denominateur = D ; } public void Inverse() int x ; x = Numerateur ; Numerateur = Denominateur ; Denominateur = x ; }

public float Valeur() return ( Numerateur / (float) Denominateur ) ; }

2. Construire un programme Java de test de la classe Fraction qui ralise les diffrentes oprations suivantes: cration de la fraction 6/5, affichage de sa valeur relle, affichage de la valeur relle de son inverse. class test { Fraction F1 ; // F1 contient NULL F1=new Fraction () ; // F1 Numerateur: 0 - Denominateur: 0 F1.Initialiser (6,5) ; // F1 initialis 6 / 5 System.out.println (F1.Valeur() ) ; // afficher la valeur relle de F1 F1.Inverse () ; System.out.println (F1.Valeur() ) ; // on ne peut pas utiliser la mthode } // Afficher() car elle affiche uniquement le contenu de la fraction, pas sa valeur relle. Pour ne pas perdre le contenu de F1 avant l'inversion, il est faut modifier la classe Fraction: public Fraction Inverse() { Fraction Res ; Res = new Fraction () ; Res.Numerateur = Denominateur ; Res.Denominateur = Numerateur ; return Res ; } { Fraction F1, F2 ; F1=new Fraction () ; F1.Initialiser (6,5) ; F2 = F1.Inverse () ; System.out.println (F2.Valeur() ) ; }
// F1 et F2 contienent NULL // F1 initialis 6 / 5

___________________________________________________________________
DI GALLO Frdric Page 13 24/12/2012

121643316.doc ______________________________________________________________________________

4.1) Mthodes publiques de type Constructeur


Un constructeur est une mthode qui porte le nom de la classe et qui est charg dinitialiser les variables de lobjet au moment de sa cration. Le langage Java dfinit chaque classe un constructeur par dfaut qui affectera des valeurs dpendantes du type de la variable dinstance si aucune valeur dinitialisation nest prcise dans la dclaration. Le tableau ci-dessous rcapitule, pour chaque type, les valeurs affectes par dfaut. Type Entier Rel Chane de caractres Valeur 0 0.0 Null

En respectant ce principe, lors de la cration dun objet de la classe Fraction dfinie au dbut de cette page, le constructeur Fraction() initialise les variables Numerateur et Denominateur 0. Si on se limitait lexistence du constructeur par dfaut, toute instanciation devrait tre suivie dune phase daffectation pour valoriser les variables dinstances de lobjet. Or plus le nombre dtapes pour atteindre un objectif est grand plus le risque doublier une tape est grand. Par exemple si on oublie de valoriser les variables de lobjet Fraction cr, on travaillera avec une fraction ayant un numrateur et un dnominateur = 0 ce qui peut entranera des erreurs dexcution. Pour remdier ce problme, Java propose au concepteur de la classe de construire ses propres constructeurs. La dfinition dun nouveau constructeur devra respecter la syntaxe suivante : public NomClasse(Liste des paramtres formels) { } On remarque quun constructeur nest pas typ. Une fois le constructeur dfini celui-ci est appel par loprateur new comme pour le constructeur par dfaut. Le constructeur suivant permet de crer une fraction partir de la donne dun numrateur et dun dnominateur passs en paramtre dentre. public Fraction (int N, int D)
constructeur // Fraction tant le nom de la classe, ceci est le

Numerateur = N; If (Denominateur ==0) { System.out.println ( le dnominateur ne peut tre gal 0 ) ; System.exit(1) ; } else Denominateur = D; // Aprs cela, le constructeur dorigine nexiste plus.

___________________________________________________________________
DI GALLO Frdric Page 14 24/12/2012

121643316.doc ______________________________________________________________________________ Laffectation F=New Fraction (2,4) crera un objet Fraction avec comme numrateur la valeur 2 et un dnominateur gal 4.

___________________________________________________________________
DI GALLO Frdric Page 15 24/12/2012

121643316.doc ______________________________________________________________________________ Il est possible de crer pour une mme classe plusieurs constructeurs ds lors quils ont des signatures diffrentes. Par exemple, pour la classe Fraction on pourrait dfinir le second constructeur suivant : public Fraction(int N) { Numerateur = N ; Denominateur = 1 ; } Lors de lappel dun constructeur Java recherche le constructeur qui est conforme avec lappel et excute ses instructions. Ainsi, lors de lexcution de linstruction F=New Fraction(5), Java excutera le second constructeur, alors que linstruction F=New Fraction(5,3) dclenchera lexcution du premier constructeur. Lorsquune classe comporte plusieurs constructeurs on dit que le constructeur est surcharg.

Application: On considre la classe Horaire :


Dont la partie Donnes est fournie ci-dessous : class Horaire { private int heure ; private int Minute ; } Ecrire le contenu du constructeur suivant : public Horaire (int H, int M) { if ( H > 23 || H < 0 ) { system.out.println (Lheure doit tre comprise entre 0 et 23 ) ; system.exit (1) ; } else heure = H ; if ( M > 59 || M < 0 ) { system.out.println (Les minutes doivent tre comprises entre 0 et 59 ) ; system.exit (1) ; } else Minute = M ; } class TestHoraire { Horaire H ; H = new Horaire (5,55) ; } On peut crer un constructeur public Horaire () (cest dire sans paramtre). F = new Horaire () ne prendra pas en compte le constructeur par dfaut mais celui-ci.

___________________________________________________________________
DI GALLO Frdric Page 16 24/12/2012

121643316.doc ______________________________________________________________________________

4.2) Mthodes publiques de type Accesseur


Lorsque les variables dinstances dune classe sont dclares avec le spcificateur daccs private elles ne sont pas accessibles directement depuis un programme dutilisation de la classe. Ce dispositif permet donc de garantir la cohrence et lintgrit des donnes contenues dans les diffrents objets de la classe. Pour permettre un utilisateur de la classe de consulter ou de modifier les donnes ainsi protges, le concepteur de la classe doit dfinir des fonctions daccs publiques encore appeles accesseurs. Celles-ci peuvent tre de deux types : - en consultation seulement : la fonction daccs renvoie la valeur de la donne mais ne permet pas de la modifier, - en modification : la fonction modifie la valeur de la donne. Les deux accesseurs en consultation suivants permettent dobtenir le numrateur et le dnominateur dune fraction: public int SonNumerateur () { return Numerateur ; } public int SonDenominateur () { return Denominateur ; } Avec de telles fonction daccs pour connatre la valeur du numrateur dun objet, on crira la rfrence : VariableObjet.SonNumerateur() Remarque : certaines classes peuvent comporter des donnes prives pour lesquelles il nexiste aucun accesseur. Dans ce cas il sagit de donnes dimplmentation qui sont introduites pour faciliter lcriture de la classe mais dont lexistence ne doit pas tre connue de lutilisateur de la classe. class Horaire { private int heure ; private int Minute ;
accs en consultation

public int SonHeure () { return heure ; } public int SaMinute () { return Minute ; }

H1 = new horaire (8,20) ; system.out.println (H1.SonHeure ()) ; system.out.println (H1.SaMinute ()) ;

public void Changer () accs en { heure = 12; modification Minute = 0 ; } }

___________________________________________________________________
DI GALLO Frdric Page 17 24/12/2012

121643316.doc ______________________________________________________________________________

Auto-valuation n6: On considre la classe Compte :


Destine grer des comptes bancaires. Chaque objet de cette classe sera dcrit au moyen des 3 donnes prives suivantes : Nom de la proprit Numero Type Type Entier Caractre Rle Identifie un compte Fournit le type du compte : J compte joint C compte courant Mmorise le solde du compte

Solde

Rel

1. Dfinir les variables dinstance de la classe Compte class Compte { private int Numero ;
priv

// Il vaut mieux dclarer les variables en

private char Type ; private float Solde ; }


// Types primitifs : la variable contient la valeur et pas un pointeur.

2. On considre le programme de test de la classe Compte suivant : class TestCompte {public static void main (String args[]) { Compte C; C = new Compte (); } } 2.1 Indiquer le contenu de la variable C: - lissue de lexcution de la dclaration : Compte C : C contient la valeur NULL - lissue de lexcution de linstruction dinstanciation : C pointe vers un objet de type Compte. Numero C
Type Solde

2.2 Indiquer le contenu des variables dinstance de lobjet cr : Numero : 0 / Type : NULL / Solde : 0.0 2.3 Ecrire la mthode prive TestType dfinie ci-dessous : Renvoie true si le type pass en paramtre est gal J ou C, et false sinon. private boolean TestType (char T)
paramtre // renvoie true si le type pass en

{ if ( T = = "J" || T = = "C" ) return true; // est gal J ou C, et false sinon. else return false; }

___________________________________________________________________
DI GALLO Frdric Page 18 24/12/2012

121643316.doc ______________________________________________________________________________ 3. Utiliser la notion de surcharge de constructeur pour construire un objet de la classe "Compte" des deux faons suivantes: - les valeurs initiales Numero et Type d'un compte sont passes en paramtre; le solde est mis 0. Par exemple, C = new Compte (123, "J") cr le compte joint de numro 123. - les valeurs initiales Numero et Type sont saisies au clavier; le solde est mis 0. Par exemple, l'instruction C = new Compte() demande l'utilisateur de lui communiquer le numro de compte et son type, et cr l'objet associ. On utilisera les mthodes Lire.i() et Lire.c() pour acqurir respectivement un entier et un caractre. Pour ces deux constructeurs, des contrles sur le numro (seules les valeurs positives sont autoriss) et sur le type, devront tre mis en place. public Compte (int N, char T) { if (N<=0) { System.out.println ("Le numro de compte doit tre positif"); System.exit (1); } if (! TestType (T) ) { System.out.println ("Le compte doit tre de type J ou C "); System.exit (1); } else Type = T; Solde = 0; } public Compte () { int N; char T; N = Lire.i(); if (N<=0) { System.out.println ("Le numro de compte doit tre positif"); System.exit (1); } else Numero = N; T = Lire.c(); if (! TestType (T) ) { System.out.println ("Le compte doit tre de type J ou C"); System.exit (1); } else Type = T; Solde = 0; } 4. Ecrire les quatre accesseurs suivants: public float Solde () { return (Solde); }
accs en consultation

// renvoie le solde d'un compte.

public int Numero () { return (Numero); } public char Type () { return (Type); }

// renvoie le numro d'un compte.

// renvoie le type d'un compte.

___________________________________________________________________
DI GALLO Frdric Page 19 24/12/2012

121643316.doc ______________________________________________________________________________ public void ModifType () // modifie le type d'un compte automatiquement
// en appliquant la logique suivante: // si c'est un compte courant, il devient compte joint; // si c'est un compte joint, il devient compte courant. accs en modification

{ char change; change = Type; if (change = 'C') Type = 'J'; else Type = 'C'; }

ou { if (Type = = 'C') Type = 'J'; else Type = 'C'; }

5. Pour agir sur le solde d'un compte on souhaite disposer des traitements "Debiter" et "Crediter". Ecrire les mthodes associes. public void Crediter (float S) { Solde += S; } public void Debiter (float S) { Solde -= S; }

// crdite de la somme S, le solde d'un compte.

// dbite de la somme S, le solde d'un compte.

6. Ecrire le programme de test de la classe Compte qui ralise les traitements suivants: - Cration des deux comptes suivants Compte Cl Numero: 250 Type : C Compte C2 Numero: 320 Type : J - Affichage du numro et du solde du compte Cl - Modification du type du compte C2 - Apport de 500 F sur le compte Cl - Dbit de 200 F sur le compte C2 class TestCompte { public static void main (String args[]) { compte C1, C2; C1 = New Compte (250, "C"); C2 = New Compte (320, "J"); System.out.println ("Numro du compte:" + C1.Numero ()); System.out.println ("Solde du compte: " + C1.Solde () ); C2.ModifType (); C1.Crediter (500); C2.Crediter (200); // on remarque que C2 est en solde ngatif. } }

___________________________________________________________________
DI GALLO Frdric Page 20 24/12/2012

121643316.doc ______________________________________________________________________________ 7. On souhaite enrichir la classe "Compte" par la mthode binaire publique "EstSuperieur" dont la signature et l'objectif sont donns ci-dessous: public boolean EstSuperieur (Compte C) { // renvoie true si le solde de l'objet est suprieur au solde de C et false sinon } 7.1 Ecrire la mthode EstSuprieur public boolean EstSuperieur (Compte C) { if (C.Solde < Solde) return (true); else return (false); } 7.2 Dans le programme de test prcdent, comparer le compte "Cl" et le compte "C2" et faire afficher le message "Cl est suprieur C2" ou "Cl est infrieur ou gal C2" selon le rsultat du test. { if (C1.EstSuperieur (C2) ) System.out.println ("C1 est suprieur C2"); else System.out.println ("C1 est infrieur ou gal C2"); }

4.3) Les mthodes de type binaire


A linstar des oprateurs binaires, une mthode est binaire lorsquelle sapplique sur deux objets dune mme classe. Par exemple, le traitement qui consiste ajouter deux fractions donnera lieu une mthode binaire. Lors de la conception dune telle mthode, les deux objets sur lesquels elle travaillera nauront pas le mme rle. Lun sera lobjet sur lequel sera appliqu la mthode, et lautre sera fourni en argument de la mthode. Lexemple ci-dessous prsente la mthode binaire Multiplier de la classe Fraction et son utilisation dans un programme de test. class Fraction { private int Numerateur ; private int Denominateur ; public Fraction Multiplier (Fraction F) { Fraction Res; Res = new Fraction (F.Numerateur*Numerateur,F.Denominateur*Denominateur); return Res ; } Remarque : dans la mthode dune classe, on peut rfrencer les proprits prives dun autre objet de cette classe. Les rfrences F.Numerateur et F.Denominateur sont donc autoriss dans lcriture de la mthode Ajouter .

___________________________________________________________________
DI GALLO Frdric Page 21 24/12/2012

121643316.doc ______________________________________________________________________________ class Test { public static void main (String args[]) { Fraction F1, F2 ; F1 = new Fraction (4,5) ; F2 = new Fraction (6,8) ; F3 = F1.Multiplier (F2) ; } }

Application: On considre la classe "PuissanceDe10" :


Destine raliser les oprations suivantes sur les puissances de 10 : - Initialiser une puissance partir de la donne de lexposant, - Afficher une puissance de 10 sous la forme 10^Exposant - Multiplier deux puissances de 10 (on rappelle que 104 x 105 donne 109 - Fournir la valeur associe une puissance de 10 (rappel 100 = 1 et 10-2 = 0.01 (rel) class PuissanceDe10 { private int Exposant; public PuissanceDe10 (int E) { Exposant = E ; }

// on ne met pas de type pour le constructeur.

public void Afficher () { System.out.println ("10^" + Exposant) ; } public void Multiplier (PuissanceDe10 P) { Exposant += P.Exposant ; } public PuissanceDe10 MultiplierBis (PuissanceDe10 P) { PuissanceDe10 Result; Result = New PuissanceDe10 (P.Exposant + Exposant); Return (Result) ; } public PuissanceDe10 MultiplierTer (PuissanceDe10 P) { Exposant += P.Exposant ; return this ; // this retourne l'objet lui-mme. } public void MultiplierQua (PuissanceDe10 P) { P.Exposant += Exposant ; } // ici c'est P2 qui va tre modifi. public float Valeur () { int P = 1, i ; for (i = 1; i <= Math.abs(Exposant); i++;) P = P*10 ; if (Exposant < 0) P = 1 / P ; return (P) ; } }

___________________________________________________________________
DI GALLO Frdric Page 22 24/12/2012

121643316.doc ______________________________________________________________________________

___________________________________________________________________
DI GALLO Frdric Page 23 24/12/2012

121643316.doc ______________________________________________________________________________

Auto-valuation n7: On considre la classe Capacit :


Destine grer des capacits exprimes en octets. Son implantation est fournie ci-dessous: class Capacite { private float Valeur; private char Unite; public Capacite (float V, char U) { if (U != 'O' && U != 'K' && U !=' M') { System.out.println (" capacit incorrecte"); System.exit(1); } else { Valeur = V; Unite = U; } } private long ValeurEnOctets () { long L = (long) Valeur; if (Unite = = 'K') L = (long) Valeur* 1024; else if(Unite = = 'M') L = (long) Valeur * 1024*1024; return L; } public void Ajouter (Capacite C) { Valeur = this.ValeurEnOctets () + C.ValeurEnOctets (); Unite = 'O'; } public void Afficher () { System.out.println (Valeur +" "+ Unite); } } 1. Fournir les rsultats affichs l'cran l'issue de l'excution du programme suivant: class TestCapacite () { public static void main (String args[]) { Capacite C1,C2; C1= new Capacite (10,'O'); C2 = new Capacite (1,'K'); Cl.Ajouter (C2); Cl.Afficher (); C2.Afficher(); } 2. Modifier la mthode Ajouter afin de consigner le rsultat de l'addition non plus dans l'objet sur lequel elle est applique, mais dans l'objet pass en paramtre.

___________________________________________________________________
DI GALLO Frdric Page 24 24/12/2012

121643316.doc ______________________________________________________________________________ 3. On dcide de surcharger le constructeur avec la mthode suivante: public Capacite (float V) { if ( V >= 1024*1024) { V = V / (1024*1024); Unite = 'M'; } else if (V >=1024) { V = V / 1024; Unite = 'K'; } else Unite = 'O'; Valeur = V; } Fournir le contenu des variables et de l'objet cr l'issue de l'excution du programme suivant (la valeur 2048 est saisie au clavier): class TestCapacite 1 { public static void main (String args[]) { Capacite C; float D; D = Lire.f(); C = new Capacite (D); } }

___________________________________________________________________
DI GALLO Frdric Page 25 24/12/2012

121643316.doc ______________________________________________________________________________

4.4) La transmission de paramtres


En Java, la transmission des paramtres se fait toujours par valeur. Cela signifie que lors de lappel dune fonction qui admet des paramtres dentre on devra communiquer pour chacun de ces paramtres une valeur. Celle-ci pourra tre soit le contenu dune variable, soit un littral. En fait, on peut assimiler les paramtres formels des variables locales qui reoivent les valeurs des paramtres effectifs lors dun appel. Le schma suivant illustre ce principe sur le constructeur de la classe Fraction : Programme dutilisation x=4 F = new Fraction(x,5) Fonction Fraction (int N, intD) { Numerateur =N ; Denominateur = D ; }

x 4 4 N D 5

instructions de la mthode

De ce principe dcoule le fait que toute modification dun paramtre formel (de type primitif), ralise lintrieur dune mthode, naura aucun effet sur une variable passe en paramtre effectif. Cela signifie que si dans le constructeur de la classe Fraction , une modification dun paramtre dentre a t ralise par erreur, la variable fournie en paramtre effectif ne sera pas modifie. Fonction Fraction (int N, intD) { Numerateur =N ; N=N+1 ; Denominateur = D ; } x=4; F = new Fraction(x,5) ;
Aprs excution du constructeur, x contient toujours la valeur 4.

Dans le cas o le paramtre formel est un objet, cest la rfrence lobjet qui est passe en paramtre effectif. Dans ce cas, toute modification ralise sur lobjet via sa rfrence sera effectivement ralise sur lobjet pass en paramtre. Le schma ci-dessous illustre ce principe : Considrons, pour la classe Fraction , la mthode Diviser ci-dessous : public Fraction Diviser (Fraction F) { F.Inverse() ; // on inverse l'objet (division de fraction = multiplication par l'inverse) return this.Multiplier (F) ; // le mot cl this dsigne lobjet lui-mme }

___________________________________________________________________
DI GALLO Frdric Page 26 24/12/2012

121643316.doc ______________________________________________________________________________ et les deux objets F1 et F2 de la classe Fraction suivants :


Numerateur Numerateur

F1 4567

4 Denominateur 8

F2 6544

4 Denominateur 8

Lappel de la mthode F1.Diviser(F2) (par exemple F3= F1.Diviser(F2)) va provoquer : - laffectation dans la variable locale associe au paramtre F de la valeur 6544. - lexcution des instructions de cette mthode avec cette valeur ce qui aura pour consquence de modifier le numrateur et le dnominateur de lobjet point par F2. F
6544 F.Inverse () Return This.Multiplier (F); Inversion du numrateur et du dnominateur

On remarque que F2 nest pas modifi mais cest lobjet point qui est modifi.

4.5) Le mot cl this


Le mot cl this dans une mthode publique est une rfrence sur lobjet sur lequel est appliqu la mthode. Cette rfrence est en gnral implicite. Par exemple pour dfinir laccesseur en consultation charg de retourner le numrateur on aurait pu crire : public int SonNumerateur() { return this.Numerateur } Ce mot cl peut par exemple tre utilis lorsquil y ambigut entre le nom dun paramtre et le nom dune variable dinstance. Le constructeur associ la classe Fraction illustre ce cas: public Fraction (int Numerateur, int Denominateur) { this.Numerateur = Numerateur ; this.Denominateur = Denominateur ; } La mthode Diviser prsente dans le paragraphe prcdent prsente un autre intrt du mot cl this .

___________________________________________________________________
DI GALLO Frdric Page 27 24/12/2012

121643316.doc ______________________________________________________________________________

V.

Les variables et mthodes de classe

On suppose que lon ait construire une classe permettant deffectuer des oprations sur des puissances ayant la mme base. On rappelle que dans lexpression an, a est appele base et n est appel exposant. La solution qui consiste dfinir pour la classe Puissance , deux variables dinstance reprsentant respectivement la base et lexposant nest pas satisfaisante car aucun dispositif ne pourra tre mis en place pour garantir que tous les objets de cette classe auront la mme base. On pourra donc avoir la situation suivante qui empche la ralisation de toute opration.
Base P1 Base P2 2 Exposant 3 4 Exposant 2

4567

6544

Pour pallier ce problme, on doit introduire une variable commune tous les objets de la classe et qui mmorisera la base avec laquelle on souhaite travailler. Cette variable, appele variable de classe, existe avant mme quun objet soit instanci. Elle est dclare au moyen du modificateur static , et peut tre prive ou publique. Avec le statut Private , elle pourra tre rfrence uniquement par les mthodes de la classe dans laquelle elle est dfinie, alors quavec le statut Public , elle pourra tre rfrence depuis une autre classe. Le dbut de la classe Puissance pourrait scrire ainsi : class Puissance { private static int base = 2 ; private int exposant ; } Compte tenu de linitialisation de la variable base , les objets de la classe Puissance reprsenteront des puissance de 2.
P1 P2 Exposant 3 Base 2

4567

6544

Exposant 2

Pour permettre lutilisateur de modifier la variable base , on doit dfinir la mthode de classe publique ChoisirBase de la manire suivante : class Puissance { private static int base = 2 ; private int exposant ; public static void ChoisirBase () { base = Lire.i() ; }
(int).

// on suppose que la fonction Lire.i() // permet dacqurir au clavier un entier

___________________________________________________________________
DI GALLO Frdric Page 28 24/12/2012

121643316.doc ______________________________________________________________________________ Celle-ci pourra tre appele, sans quaucun objet existe, en utilisant la rfrence: Puissance.ChoisirBase. Il est important de remarquer que lexcution dune mthode de classe pouvant tre ralise avant toute instanciation dobjet, il nest pas sens de rfrencer dans une mthode de classe une variable dinstance. Par exemple, le programme suivant naurait pas de sens : class Puissance { private static int base = 2 ; private int exposant ; public static void ChoisirBase() { base = Lire.i() ; // exposant est une variable dinstance
dont

exposant = Lire.i() ; } }

// lexistence est lier lexistence dun objet.

Par contre, il est possible de rfrencer dans une mthode dinstance, une variable de classe, comme lillustre le programme suivant : class Puissance { private static int base = 2 ; private int exposant ; public static void ChoisirBase() { base = Lire.i() ; } exposant = Lire.i() ; } public void Afficher () { System.out.println (base + ^ + exposant) ; } }

VI. Travaux Pratiques


6.1) Utilisation de la classe String
Le langage Java admet les trois catgories suivantes de types primitifs : numrique : byte, short, int, long, float et double caractre : char boolen : boolean Tous ces types primitifs permettent de manipuler directement des valeurs. Ainsi pour mmoriser un caractre, il suffira de laffecter dans une variable de type caractre. Toutes les donnes qui ne sont pas dun type primitif devront tre mmorises sous forme dobjets. Cest, par exemple, le cas des chanes de caractres pour lesquelles Java propose les deux classes suivantes : String dont les objets sont des chanes de caractres de longueur fixe, StringBuffer dont les objets sont des chanes dont la longueur peut tre modifie.

___________________________________________________________________
DI GALLO Frdric Page 29 24/12/2012

121643316.doc ______________________________________________________________________________

___________________________________________________________________
DI GALLO Frdric Page 30 24/12/2012

121643316.doc ______________________________________________________________________________ A partir de la liste des mthodes donne ci-dessous, et se rapportant la classe String , crire le programme Java qui ralise les oprations suivantes : dclare les variables Fichier et Extension destines pointer sur des objets de la classe String . instancie un objet de la classe String avec la valeur Test.xls . Le constructeur admet linterface suivante : public String (Chane). Lobjet ainsi cr devra tre point par la variable Fichier . extrait, dans lobjet point par la variable Extension , lextension contenue dans lobjet point par la variable Fichier . affiche par linstruction System.out.println (lextension est : + Extension), lextension ainsi rcupre. Remarque : le nombre de caractres de lextension est suppos quelconque public class ManipChaine { public static void main (String args[]) { int Longueur, Point ; String Fichier, Extension ; Fichier = New String ('Test.xls') ; Point = Fichier.indexOf ('.') ; Longueur = Fichier.length () ; Extension = Fichier.Substring (Point + 1, Longueur -1) ; System.out.println ("L'extension est : " + Extension) ; } }

Annexe : mthodes de la classe String


int indexOf(Caractre) Localise le caractre fourni en paramtre dans lobjet et renvoie sa position. Le premier caractre a la position 0. La valeur -1 est renvoye si le caractre ne se trouve pas dans lobjet chane. Extrait, dans lobjet chane, une sous-chane de la position "Deb" la position "Fin". Renvoie le nombre de caractres de lobjet chane

String substring(Deb, Fin) int length() Exemple:

String ch, ch1; ch ch = New String ('Bonjour') ; System.out.println (ch.indexOf ('B') ) ; ch1 = ch.Substring (2,4) ; System.out.println (ch.length () );

012345 6

BONJOUR // affiche 0. ch1 // affiche 7.


234

NJO

___________________________________________________________________
DI GALLO Frdric Page 31 24/12/2012

121643316.doc ______________________________________________________________________________

6.2) Cration dune classe


Le programme de test suivant manipule des dures exprimes en heures et minutes. Analyser les diffrentes mthodes rfrences et le rsultat de leur excution afin de proposer une dfinition de la classe Dure cohrente avec son utilisation. public class TestDure Rsultat affich lcran: { public static void main (String [] arg) { Dure D1,D2 ; D1=new Dure (1,30) ; D1.Afficher ; 1 :30 D2 = new Dure (2,30) ; D1.Ajouter (D2) ; D1.Afficher ; 4 :0 System.out.println ("Valeur de la dure en minutes: " Valeur de la dure en minutes : 240 + D1.TotMinutes) ; } }

___________________________________________________________________
DI GALLO Frdric Page 32 24/12/2012

121643316.doc ______________________________________________________________________________

VII. Annexe : les tapes de dveloppement en Java


Tout programme crit en langage volu doit tre compil afin dtre excut par lordinateur. Cette opration consiste plus prcisment traduire chaque instruction du programme en une suite dlments binaires que lordinateur saura interprter et excuter. Par exemple lissue de la compilation dun programme crit en TURBOC C, on dispose dun fichier excutable portant lextension .exe que lon peut lancer partir de lenvironnement DOS par la commande : NomFichier. Il est important de savoir que le code binaire est spcifique chaque machine ; cela signifie que le fichier issu dune compilation excute sur une machine de type PC nest pas reconnu sur une station UNIX. Pour remdier ce problme et rendre le langage Java indpendant de lordinateur, le concepteur du langage Java (J. Gosling) a introduit une tape intermdiaire dans la compilation. Le principe consiste traduire le programme crit en java en un pseudo-code (appel bytecode) indpendant de toute machine. Ce pseudo-code sera alors interprt et excut par un programme spcifique chaque machine. Lensemble des interprteurs constitue la JVM : Java Virtual Machine. Ce principe est illustr par le schma suivant extrait de louvrage Le livre de Java premier langage de Anne Tasso (ditions Eyrolles):

Lavantage dun tel systme est que le dveloppeur est certain de crer un programme totalement compatible avec les diffrents ordinateurs du march. Compte tenu du principe prcdemment expos, la boite outils minimale pour raliser des dveloppements Java doit comporter les deux logiciels suivants : Le compilateur charg de traduire le programme crit en Java en pseudo-code: javac Fichier.java o le fichier ayant lextension java contient la description dune ou plusieurs classes. Le rsultat est un fichier portant lextension class . Linterprteur, propre chaque machine, et destin interprter et excuter le pseudo-code : java Fichier. Lors de lexcution de ce fichier, linterprteur Java dclenche lexcution de la mthode publique main() qui est le point dentre de lapplication. Si dans cette mthode main() , dautres classes sont rfrences, il doit disposer de leur dfinition pour russir lexcution Ces deux outils sont disponibles dans le kit de dveloppement Java (JDK : Java Development Kit ou SDK Standard Development Kit) tlchargeables depuis le site Internet de Sun. Il existe des logiciels tels que Kawa ou J buider qui offrent, sous forme dinterface graphique conviviale, un ensemble doutils de dveloppement. Il est important de savoir que ces derniers sont particulirement gourmands en ressources machines.

___________________________________________________________________
DI GALLO Frdric Page 33 24/12/2012

121643316.doc ______________________________________________________________________________

PROGRAMMATION

ORIENTEE OBJETS : Les Collections JAVA

___________________________________________________________________
DI GALLO Frdric Page 34 24/12/2012

121643316.doc ______________________________________________________________________________

PROGRAMMATION JAVA: GNRALITS.....5


I. PROGRAMMATION CLASSIQUE ET ORIENTE OBJETS..........................................................................5 II. CLASSE ET OBJET.....................................................................................................................6 III. LES DONNES DUNE CLASSE....................................................................................................8 IV. LES MTHODES DUNE CLASSE................................................................................................11 4.1) Mthodes publiques de type Constructeur ...........................................................14 4.2) Mthodes publiques de type Accesseur ...............................................................17 4.3) Les mthodes de type binaire.....................................................................................21 4.4) La transmission de paramtres.................................................................................26 4.5) Le mot cl this ......................................................................................................27 V. LES VARIABLES ET MTHODES DE CLASSE..................................................................................28 VI. TRAVAUX PRATIQUES...........................................................................................................29 6.1) Utilisation de la classe String....................................................................................29 6.2) Cration dune classe................................................................................................32 VII. ANNEXE : LES TAPES DE DVELOPPEMENT EN JAVA.................................................................33

LES COLLECTIONS EN JAVA...........................37


I. INTRODUCTION..............................................................................................................37 II. LES TABLEAUX.............................................................................................................39 III. LES VECTEURS............................................................................................................42 3.1) La classe gnrique Object .................................................................................42 3.2) Les mthodes de la classe Vector ........................................................................45 3.3) La classe Enumeration ........................................................................................47 3.4) Les packages..............................................................................................................48 IV. LES DICTIONNAIRES..............................................................................................................49 V. LES FLUX.............................................................................................................................51 5.1) Oprations sur un fichier...........................................................................................51 5.2) La gestion des erreurs...............................................................................................53

L'HERITAGE EN JAVA........................................63
I. INTRODUCTION..............................................................................................................63 II. DFINITION DE L'HRITAGE......................................................................................................65 2.1) Le constructeur d'une classe drive.........................................................................66 2.2) Les proprits d'une classe drive...........................................................................67 2.3) Les mthodes d'une classe drive............................................................................68 III. MANIPULATIONS D'OBJETS ISSUS DE CLASSE MRE ET FILLE.........................................................69

EXEMPLES DE CLASSES JAVA.........................78


I. PUISSANCEDE10....................................................................................................................78 II. CAPACITE.............................................................................................................................79 III. PUISSANCE..........................................................................................................................80 IV. INVENTAIRE.........................................................................................................................80 V. CONNEXION & LISTECONNEXION............................................................................................81

___________________________________________________________________
DI GALLO Frdric Page 35 24/12/2012

121643316.doc ______________________________________________________________________________ VI. PRODUIT & PRODUITACHET................................................................................................83 VII. COMPTE & COMPTEEPARGNE..............................................................................................84 VIII. FACTURE & LISTEFACTURES..............................................................................................86 IX. CLIENT & CLIENTPRO.........................................................................................................88

___________________________________________________________________
DI GALLO Frdric Page 36 24/12/2012

121643316.doc ______________________________________________________________________________

INFORMATIQUE CNAM ANGOULEME 2000-2001

LES COLLECTIONS EN JAVA


I. INTRODUCTION

Le chapitre prcdent a montr que laccs un objet dune classe, ncessite lexistence dune variable pointeur, dclare en dbut de traitement de la manire suivante : NomClasse NomVariablePointeur ; Dans le schma qui suit, la variable P permet daccder au produit de rfrence 34 et ainsi de lui appliquer diffrentes mthodes par la rfrence P.NomMthode.
P Rfrence 34 Dsignation Stock 55 StockAlerte 15

Disquette

Avec un tel principe laccs n instances dune classe, implique la dclaration de n variables pointeurs de cette mme classe ce qui va entraner : - dune part limpossibilit dutiliser des structures itratives pour manipuler ces objets du fait des noms de variables diffrents, - dautre part le risque dun nombre insuffisant de variables pour des problmes dont on ne connat pas priori le nombre dinstances cres.

Application: On considre la classe Produit dfinie partiellement ci-dessous :


class Produit { private int Reference ; private String Designation ; private int Stock ; private int StockAlerte ; public Produit () ; // demande toutes les caractristiques dun produit et cr lobjet associ { System.out.print ("Rfrence du produit: "); Reference = Lire.i(); System.out.print ("Dsignation du produit: "); Designation = Lire.S(); System.out.print ("Stock: "); Stock = Lire.i(); System.out.print ("Stock alerte: "); StockAlerte = Lire.i(); }

___________________________________________________________________
DI GALLO Frdric Page 37 24/12/2012

121643316.doc ______________________________________________________________________________ public boolean ACommander () { // Renvoie true si le stock est infrieur au stock alerte et false sinon return (Stock < StocIcAlerte); } public int SaRfrence () { // Renvoie la rfrence du produit return this.Reference; } public int SonStock () { // Renvoie le stock du produit return this.Stock; }

On suppose que les variables P1 , P2 et P3 pointent sur 3 instances de la classe Produit . Ecrire les instructions qui affichent, parmi ces trois produits, la rfrence de ceux qui sont commander. class TestProduit () ; { public void static main (String args[]) { Produit P1, P2, P3; P1 = new Produit(); P2 = new Produit(); P3 = new Produit(); if (P1.Acommander()) System.out.print (P1.SaRfrence()); if (P2.Acommander()) System.out.print (P2.SaRfrence()); if (P3.Acommander()) System.out.print (P3.SaRfrence()); } }

Pour faciliter la manipulation de plusieurs objets dune mme classe, le langage Java propose diffrents concepts dont les caractristiques de stockage sont rcapitules ci-dessous : Nom concept Tableau Vecteur Dictionnaire (ou table de hachage) Flux (fichiers "normaux") Type du stockage Volatile Volatile Volatile Permanent Nombre dobjets collectionns Fixe Indtermin Indtermin Indtermin

___________________________________________________________________
DI GALLO Frdric Page 38 24/12/2012

121643316.doc ______________________________________________________________________________

II. LES TABLEAUX


Pour crer un tableau destin mmoriser N pointeurs sur des objets dune classe il faut procder aux deux tapes suivantes : - dclarer une variable qui sera destine pointer sur le tableau par la syntaxe suivante : NomClasse [] NomVariable - crire linstruction charge de crer lobjet tableau par la syntaxe : NomVariable = new NomClasse[N] A lissue de cette dclaration, la variable spcifie dans le membre gauche de laffectation pointe sur un objet contenant N cases , destines chacune recevoir ladresse dun objet de la classe. Par exemple, pour crer un tableau pointant sur 5 produits on devra crire les instructions suivantes : Produit[] ListeProduits ; ListeProduits = new Produit[5] ; Le contenu des variables aprs lexcution de ces instructions pourrait tre reprsent ainsi : ListeProduits 0 null 1 null 2 null 3 null 4 null

objet Produit

objet Produit
ListeProduits[i] rfrence l'adresse

Il est important de savoir que la taille dun tableau, dfinie lors de lexcution par loprateur new , ne peut plus tre modifie ultrieurement. Il est, par contre, possible dacqurir, lors de lexcution, la taille du tableau souhait et de communiquer cette valeur loprateur new comme lillustre lexemple suivant : int N ; Produit[] ListeProduits ; System.out.println ( Nombre maximal de produits ? ) ; N=Lire.i() ; ListeProduits = new Produit[N] ; Les oprations que lon peut mettre en uvre sur un tableau se rpartissent en 2 catgories : - la premire catgorie regroupe les traitements qui agissent sur le tableau dans son intgralit. Par exemple linstruction ListeProduits.length renvoie le nombre de cases du tableau. length est en fait une proprit publique de lobjet ListeProduits . - la seconde catgorie concerne les traitement qui agissent sur chaque composant dun tableau. Pour la programmation de ces traitements, il faut savoir que laccs au ime lment du tableau est ralis par la rfrence : NomVariableTableau[i] (le premier lment porte le numro 0). Remarquons enfin que les tableaux permettent de mmoriser non seulement des adresses dobjets mais aussi des valeurs de type primitif.

___________________________________________________________________
DI GALLO Frdric Page 39 24/12/2012

121643316.doc ______________________________________________________________________________

Application 1: On considre que le tableau ListeProduits est valoris :


et pointe sur 5 objets de la classe Produits . Rcrire le traitement qui consiste afficher la rfrence des produits commander. class TestProduit () ; { public void static main (String args[]) { Produit [ ] ListeProduits; int i = 0; ListeProduits = new Produit [5]; // Chargement du tableau for (i = 0; i 4, i ++) { if (ListeProduits[i].Acommander()) System.out.println(ListeProduits[i].SaRfrence()); } for (i = 0; i ListeProduits.length - 1; i ++) { if (ListeProduits[i].Acommander()) mthode // System.out.println(ListeProduits[i].SaRfrence()); // } }
// ou // // proprit publique

Application 2: On souhaite construire la classe Inventaire :


destine grer lensemble des produits proposs par une entreprise. La description du dbut de cette classe a la forme suivante : class Inventaire { private Produit [] ListeProduits ; private int NbProduits = 0; public Inventaire() { ListeProduits = new Produit[100] ; } } a) Ecrire les trois mthodes suivantes : AjouterUnProduit () qui doit provoquer la cration dun objet de la classe Produit en demandant lutilisateur les diffrentes caractristiques du produit. RechercherUnProduit (int RefProduit) qui renvoie le produit dont la rfrence est spcifie en paramtre dentre. La valeur "null" est renvoye si le produit nexiste pas. AfficherProduitsACommander() qui affiche la rfrence de tous les produits dont le stock est infrieur au stock alerte. class Inventaire { private Produit [] ListeProduits; private int NbProduits = 0; public Inventaire() { ListeProduits = new Produit [100]; } public void AjouterunProduit() { ListeProduits[NbProduits] = new Produit; NbProduits ++;

___________________________________________________________________
DI GALLO Frdric Page 40 24/12/2012

121643316.doc ______________________________________________________________________________ } public Produit RechercherUnProduit (int RefProduit) { int i=0; Produit tmp=null; boolean Trouve = false; while (! Trouve && i <=NbProduits-1) if (RefProduit = = ListeProduits[i].SaReference()) { Trouve = true; tmp = ListeProduits[i]; } else i ++; return tmp; } public void AfficherProduitsACommander() { int i; for (i=0; i<= NbProduits - i; i ++) if (ListeProduits[i].Acommander()) System.out.print (ListeProduits[i].SaReference()); } } b) Proposer un programme de test qui ralise les oprations suivantes : - cre un objet de la classe Inventaire . - ajoute dans la classe les produits suivants (une structure itrative mettre en place) Rfrence Dsignation Stock StockAlerte 34 Disquettes 55 15 56 Cartouche encre 5 10 72 ZIP 4 5 - recherche un produit dont la rfrence est saisie. Si le produit existe, son stock sera affich, sinon le message rfrence inexistante sera affich. - affiche la rfrence de tous les produits commander. class TestInventaire { public static void main (String args[]) { Inventaire INV; int R; char Rep; INV= new Inventaire(); do { INV.AjouterunProduit(); System.out.println ("Autre produit (O/N)?"); Rep = Lire.c(); } while (Rep == 'O'); System.out.println ("Saisir une rfrence de produit"); R = Lire.i(); if (INV.RechercherunProduit(R) != null) System.out.println (INV.RechercherunProduit(R).SonStock()); else System.out.println ("Pas de produit pour cette rfrence"); System.out.println ("Liste des produits commander"); INV.AfficherProduitsACommander(); }

___________________________________________________________________
DI GALLO Frdric Page 41 24/12/2012

121643316.doc ______________________________________________________________________________ }

III. LES VECTEURS


Les vecteurs ont t introduits afin de remdier limpossibilit de redimensionner un tableau une fois que celui-ci a t cr par loprateur new . Ainsi, les objets de la classe Inventaire prsente prcdemment, sont limits la mmorisation de 100 produits. La classe Vector est prdfinie (comme la classe String), et permet de grer (en mmoire centrale) un nombre indtermin dobjets, qui appartiennent la classe gnrique Object . Par exemple, le programme suivant cre un vecteur qui sera destin pointer sur un ensemble dobjets de la classe Object . Seul le nom attribu ce vecteur laisse penser que ce sont des objets de la classe Produit qui seront mmoriss dans cette structure. Au dpart, aucune case nest affecte au vecteur et cest au fur et mesure des ajouts que le vecteur va sagrandir. Les vecteurs ne sont pas typs, au dpart, on ne sait donc pas de quels objets il s'agit. En fait, on utilise une classe "gnrique". Vector ListeProduits ; ListeProduits = new Vector() ; ListeProduits

objet de la classe Object

3.1) La classe gnrique Object


ou une premire approche de lhritage
Tout objet issu dune classe est un objet de la classe Object et ce titre, hrite des mthodes publiques de cette classe. Cette relation est un peut tre schmatise ainsi et montre que les objets des classes Fraction ,. Produit ou dune classe quelconque C sont des objets de la classe Object . On dit que les classes Produit , Fraction et C sont des sous-classes de Object ou encore des classes drives de la classe Object . La classe Object est une super-classe, ou c'est la classe de toutes les classes, ou encore une classe de base.
Super classe ou classe de base est un sous classe ou classe drive

Object
equals

Produit
equals

Fraction Compte

Classe C

Exemple: Compte pargne DI GALLO Frdric

Compte chque Page 42 24/12/2012

___________________________________________________________________

121643316.doc ______________________________________________________________________________

___________________________________________________________________
DI GALLO Frdric Page 43 24/12/2012

121643316.doc ______________________________________________________________________________ Compte tenu de cette hirarchie sur un produit de la classe Produit on peut appliquer les mthodes de la classe Produit mais aussi les mthodes de la classe Object . Par exemple la mthode clone() de la classe Object qui permet de crer le clone dun objet peut tre appliqu aussi bien un objet de la classe Produit qu un objet de la classe Fraction . Fraction F1,F2 ; Produit P1, P2 ; P1 = new Produit() ; P2 = P1.clone() ; // Deux fractions identiques et non pas une seule fraction F1 = new Fraction(4,5) ; F2 = F1.clone() ; // car Fraction "hrite" la mthode clone() de Object. Il est possible de redfinir dans une sous-classe une mthode de la classe gnrique. Dans ce cas, on dit que la mthode est polymorpohe cest--dire a plusieurs formes. A chaque appel dune telle mthode, la forme excuter est choisie en fonction de lobjet associ lappel. Considrons par exemple la mthode equals de la classe Object . Cette mthode permet de comparer les adresses de deux objets et renvoie true si ces adresses sont gales et false sinon. Ainsi dans lexemple qui suit P1.equals(P2) renvoie false car P1 et P2 contiennent des adresses diffrentes.
P1 Rfrence 34 Dsignation Stock 55 StockAlerte 15

Disquette

P2

Rfrence 34 Dsignation Stock 55 StockAlerte 15

Disquette

On peut redfinir la mthode equals au niveau de la classe Produit afin de renvoyer true si deux objets distincts contiennent les mmes valeurs. A lissue de cette conception, la mthode equals a deux formes et le programme suivant montre la puissance du polymorphisme : Produit P1,P2 ; Fraction F1,F2 ; if (P1.equals(P2)) // cest la mthode equals de la classe Produit qui est excute System.out.println ( P1 et P2 sont deux objets diffrents mais contiennent les mmes valeurs ) ; if (F1.equals(F2)) // cest la mthode equals de la classe Object qui est excute System.out.println ( F1 et F2 dsignent le mme objet ) ;

___________________________________________________________________
DI GALLO Frdric Page 44 24/12/2012

121643316.doc ______________________________________________________________________________ Cette hirarchie entre classes induit aussi la ncessit deffectuer des transtypages lors daffectation entre les variables de ces diffrentes classes. Le programme ci-dessous prsente ce principe pour les classes Object et Produit ainsi que le mcanisme du polymorphisme issu du transtypage. Object O1, O2 ; Produit P1, P2 ; . O1 = P1; // un produit est un objet donc laffectation est possible et le transtypage est implicite O2 = P2 ; P1 = (Produit) O1 ; // un objet nest pas forcment un produit donc il faut spcifier explicitement un
cast //pour effectuer le transtypage ; si le cast nest pas spcifi, le compilateur refusera //laffectation car un objet nest pas forcement un produit. A lexcution, il peut y //avoir une erreur si la variable O1 nest pas un objet de la classe Produit. //cest la mthode equals de la classe Produit qui est excute car les objets // O1 et O2 appartiennent la classe Produit

if (O1.equals(O2))

Mme si la notion de polymorphisme sera reprise et dtaille dans le chapitre suivant, il est important de retenir dores et dj les lments suivants (extraits de louvrage "Java, la synthse") : - le polymorphisme est la capacit pour une mme mthode de correspondre plusieurs formes de traitement, selon les objets auxquels la mthode est applique, - une telle facilit, qui permet le choix dynamique entre plusieurs formes de traitement suppose que le choix de la mthode soit fait au moment de lexcution. Dans linstruction prcdente (if O1.equals(O2)), le choix de la forme de mthode equals ne peut pas se faire la compilation car on ne sait pas sur quel type dobjet les variables O1 et O2 pointent.

3.2) Les mthodes de la classe Vector


Rappelons que chaque composant dun vecteur est un pointeur sur un objet de la classe Object . Compte tenu de ce qui vient dtre dit, ce pointeur peut adresser nimporte quel objet dune classe car Object est la super-classe de toutes les classes. Le schma suivant illustre ce principe bas sur un transtypage implicite. Produit ListeProduits

Rfrence 34 Dsignation

objet de la classe Object

Stock 55 StockAlerte 15

___________________________________________________________________
DI GALLO Frdric Page 45 24/12/2012

121643316.doc ______________________________________________________________________________ Quelques unes des mthodes de la classe "Vector" sont prsentes et commentes ci-dessous: Nom de la mthode Rle add(objet) Ajoute un lment objet en fin de liste add(indice, objet) Ajoute un objet dans la liste lindice spcifi en paramtre elementAt(indice) Retourne lobjet stock lindice spcifi en paramtre. Le premier lment porte le numro 0. clear() Supprime tous les lments de la liste IndexOf (Objet) Retourne lindice dans la liste du premier objet donn en paramtre ou 1 dans la liste remove(indice) Supprime lobjet dont lindice est spcifi en paramtre setElementAt(Objet,i) Remplace llment situ en position i par lobjet spcifi en paramtre size() Retourne le nombre dlments placs dans la liste Ainsi, pour ajouter un produit dans le vecteur ListeProduits , il suffira dcrire linstruction : ListeProduits.add(new Produit()) . Lappel de cette mthode induit un transtypage automatique entre une variable de classe Object et une variable de la classe Produit . Un transtypage explicite devra tre par contre mis en place pour rcuprer dans la variable pointeur P de la classe Produit , llment n i du vecteur ListeProduits. P=(Produit) ListeProduits.elementAt(i) Il faut souligner que la classe Vector ne permet pas de mmoriser des valeurs de type primitif. Pour remdier ce problme, le langage Java a dfini une classe pour chacun des types primitifs. Par exemple la classe Int est associ au type int ( le nom de la classe est obtenu en crivant avec la premire lettre majuscule, le nom du type primitif). Chacune de ces classes possde un constructeur qui instancie un objet partir du type primitif. Les instructions suivantes crent un objet de la classe Int qui pourra ainsi tre mmoris par un vecteur. int i = 4 ; Int ObjetEntier ; ObjetEntier = new Int(i) ;

Application: On suppose que lon modifie la classe Inventaire :


de la manire suivante (la partie donnes ainsi que le constructeur) : class Inventaire { private Vector ListeProduits ; public Inventaire() ListeProduits = new Vector() ; } Rcrire les mthodes AjouterUnProduit, RechercherUnProduit, AfficherProduitsACommander import java.util.Vector; class Inventaire { Vector ListeProduits; public Inventaire() { ListeProduits = new Vector(); } public void AjouterunProduit() { ListeProduits.add (new Produit()); }

___________________________________________________________________
DI GALLO Frdric Page 46 24/12/2012

121643316.doc ______________________________________________________________________________ public Produit RechercherUnProduit (int RefProduit) { int i=0; Produit tmp=null; boolean Trouve = false; while (! Trouve && i <=ListeProduits.size()- 1) if (RefProduit = = ((Produit) ListeProduits.elementAt(i)).SaReference()) { Trouve = true; tmp = (Produit) ListeProduits.elementAt(i); } else i ++; return tmp; } public void AfficherProduitsACommander() { int i; for (i=0; i <= ListeProduits.size()- 1; i ++) if (((Produit) ListeProduits.elementAt(i)).ACommander()) System.out.print (((Produit) ListeProduits.elementAt(i)).SaReference()); } }

3.3) La classe Enumeration


ou une approche de la notion dinterface
Lintgration, dans une structure itrative de type for , de la mthode elementAt() de la classe Vector permet de passer de revue tous les objets contenus dans un vecteur. Par exemple linstruction suivante affiche la rfrence de tous les produits contenus dans le vecteur ListeProduits. for (i = 0 ; i <= ListeProduits.size() - 1 ; i++) System.out. println (((Produit)ListeProduits.elementAt(I)).SaReference()) ; Une autre possibilit pour parcourir un vecteur consiste utiliser la classe Enumeration . Cette classe a les particularits suivantes : - elle nadmet pas de donnes ; elle nest donc pas instanciable et lon ne pourra donc jamais crer un objet de cette classe, - elle contient uniquement des signatures de mthodes. Limplantation des diffrentes mthodes tant ralise dans toutes les classes qui sont rattaches cette classe particulire. Une telle classe est appele interface et sa dfinition est donne ci-dessous : public interface Enumeration { boolean hasMoreElements() ; Object nextElement() ; } E = new Enumeration(); // impossible !

___________________________________________________________________
DI GALLO Frdric Page 47 24/12/2012

121643316.doc ______________________________________________________________________________ Les mthodes de cette classe repose sur lexistence dun curseur qui pointe tout moment sur un composant particulier de lnumration. La mthode nextElement renvoie lobjet point par le curseur et dplace le curseur sur le composant suivant. La mthode hasMoreElement renvoie la valeur true si le curseur pointe sur un lment et false si la fin de lnumration est atteinte. Cest en appliquant la mthode elements() sur un objet de la classe Vector que lon peut obtenir un objet de la classe numration et donc utiliser ses facilits de parcours. Lexemple suivant illustre lemploi des mthodes de la classe Enumeration pour afficher toutes les rfrences des produits contenus dans le vecteur ListeProduits . Enumeration E ; E=ListeProduits.elements() while (E.hasMoreElements()) System.out. println (((Produit) E.nextElement()).SaReference())
Produit

Application: Rcrire la mthode RechercherUnProduit() :


de la classe inventaire en utilisant linterface Enumeration . public Produit RechercherUnProduitBis (int RefProduit) { Produit tmp=null; boolean Trouve = false; Enumeration E; E = Listeproduits.elements(); while (! Trouve && E.hasMoreElements()) { tmp = (Produit) E.nextElement(); if (RefProduit = = tmp.SaReference()) { Trouve = true; } } return tmp; }

3.4) Les packages


Pour pouvoir rfrencer la classe Vector dans un programme, il est ncessaire de spcifier linstruction dimportation import java.util.Vector qui indique au compilateur et linterprteur la localisation de cette classe dans lorganisation fonctionnelle des classe java. De mme lutilisation de la classe Enumeration nest possible quen spcifiant en dbut de programme linstruction import java.util.Enumeration . Cette organisation repose sur la notion de package dont les grands principes sont donns dans ce qui suit. Un package est un regroupement (au sein dun rpertoire) de plusieurs classes qui ont un dnominateur fonctionnel commun. Les classes regroupes dans la package java.lang sont directement rfrenables depuis nimporte quelle autre classe sans avoir prciser quoi que ce soit dans le programme appelant. Cest par exemple le cas de la classe String qui a t utilise dans la premire partie des travaux pratiques du chapitre prcdent. Pour une classe

___________________________________________________________________
DI GALLO Frdric Page 48 24/12/2012

121643316.doc ______________________________________________________________________________ appartenant un package autre que java.lang , son niveau dutilisation dpend de son modificateur daccs : - public : la classe est accessible depuis nimporte quelle autre classe appartenant au package ou non - pas de modificateur : la classe est accessible seulement depuis les classes appartenant au mme package. Pour accder une classe dun package ayant le spcificateur public il est ncessaire de mentionner, dans le programme dutilisation, linstruction : import NomPackage.NomClasse Ainsi pour utiliser les classes Vector et Enumeration qui se trouvent dans le package java.util , on crit en dbut de traitement : import java.util.* Pour intgrer une classe un package, il est ncessaire de respecter la syntaxe ci-dessous : package NomPackage ; public class NomClasse {. } Quelques remarques : - Une classe ne peut appartenir qu un seul package. - Dans le cas o lon ne prcise pas la clause package lors de la cration dune classe, un package par dfaut, qui correspond au rpertoire courant, lui est automatiquement attribu. - Dans certains systmes, la variable systme CLASSPATH permet de dfinir tous les rpertoires susceptibles de contenir des packages. Ces rpertoires sont alors visits par le compilateur pour quil procde aux importations demandes. Laffectation de diffrents chemins daccs la variable CLASSPATH est ralise par la commande SET . Par exemple, la commande suivante dfinit comme localisation possible des packages le rpertoire courant et le rpertoire Lib . SET CLASSPATH = . ;C:\JAVA\JDK1.3\Lib

IV. Les dictionnaires


Dans un vecteur, laccs direct un composant nest possible que si lon connat son indice. Si on ne dtient pas cette information on doit procder une recherche squentielle. Ainsi la mthode RechercherUnProduit (Refproduit) met en uvre un parcours squentiel du vecteur ListeProduits afin de trouver le produit dont la rfrence est fournie en paramtre. Les objets de la classe Hashtable encore appels dictionnaires permettent de mmoriser un nombre indtermin dobjets dune classe et mettent la disposition de lutilisateur des mthodes capables de raliser des accs directs partir dune valeur de cl. Une cl est une donne de la classe qui est telle que tous les objets de cette classe ont des valeurs diffrentes. Elle permet donc didentifier chaque instance de la classe. Dans la classe Produit la donne Reference peut tre considre comme une cl. Pour crer un dictionnaire, il faut crire les deux instructions suivantes : Hashtable NomVariable ; NomVariable= new Hashtable()

___________________________________________________________________
DI GALLO Frdric Page 49 24/12/2012

121643316.doc ______________________________________________________________________________ A lissue de lexcution de ces instructions la structure du dictionnaire pourrait tre schmatise ainsi : Variable de la classe Hastable Cl Objet Objet de la classe Object Objet de la classe Object Les mthodes de la classe Hashtable les plus couramment utilises sont dcrites et commentes dans le tableau ci-dessous : Nom de la mthode put(objetCl,Objet) get(objetCl) remove(ObjetCl) size() keys () Rle Ajoute une cl et son objet dans le dictionnaire Renvoie lobjet associ la cl spcifie en paramtre Supprime dans le dictionnaire llment ayant la cl spcifie en paramtre Retourne le nombre dlments placs dans la liste Renvoie sous forme dnumration la liste des cls mmorises.

Application: On souhaite implanter la classe Inventaire


destine mmoriser un ensemble de produits au moyen dun dictionnaire. En supposant que tout produit est identifi par sa rfrence, le dbut de description de la classe Inventaire a la forme suivante : import java.util.* ; public class Inventaire { private Hashtable ListeProduits ; public Inventaire() { ListeProduits = new Hashtable() ; } 1. Rcrire les mthodes AjouterUnProduit et RechercherUnProduit 2. Ecrire la mthode AfficherTout qui affiche la liste de tous les produits (rf et dsignation).

___________________________________________________________________
DI GALLO Frdric Page 50 24/12/2012

121643316.doc ______________________________________________________________________________

V.

Les flux
5.1) Oprations sur un fichier

Jusqu maintenant les objets crs taient stocks dans la mmoire vive de lordinateur et avaient de ce fait une dure de vie limite lexcution du programme. Pour mmoriser de faon permanente des objets, le langage Java propose les deux mcanismes suivants : - la srialisation qui consiste crire des informations relatives un objet sur un fichier, - et la dsrialisation qui correspond lopration rciproque cest--dire la reconstitution de lobjet en mmoire vive partir des informations lues sur le fichier. La mise en place de ces deux mcanismes est base sur lutilisation des classes ObjectOutputStream et ObjectInputStream . Un objet de la classe ObjectOutputStream est appel flux sortant et sera utile pour effectuer une opration dcriture sur un fichier. Un objet de la classe ObjectOutpuStream est appel flux entrant et sera utile pour raliser une opration de lecture sur un fichier. Lextrait de programme suivant illustre la cration de ces deux objets. ObjectInputStream FE ; ObjectOutputStream FS ; FE = new ObjectInputStream (new FileInputStream( Produits.DTA ) ; FS = new ObjectOutputStream (new FileOutputStream ( Produits.DTA ) ; Remarques : la cration dun objet de type flux entrant choue si le fichier spcifi en paramtre nexiste pas dans larborescence. Dans ce cas, une erreur de type "File Not Found Exception" est mise. Dans le cas contraire, la tte de lecture associ ce flux se positionne sur le premier objet stock. la cration dun objet de type flux sortant choue seulement dans le cas o le chemin daccs au fichier, spcifi en paramtre, nest pas cohrent avec larborescence. Dans le cas o le fichier existe dj son contenu est effac. Dans le cas o le fichier nexiste pas et que son chemin daccs est correct, il y a cration du fichier. Pour toutes ces situations la tte dcriture se positionne en dbut de fichier. une fois que tous les traitements ont t raliss, il faut fermer les flux en leur appliquant la mthode close() . Par exemple FE.close() ferme le flux entrant point par la variable FE . Les objets que lon peut crire ou lire sur un fichier peuvent tre issues de nimporte quelle classe : prdfinie ( Vector , Hastable , String , etc) ou non. Dans le cas dune classe cre par le programmeur, il faudra rendre ses objets srialisables en prcisant dans len-tte de la classe la clause implements Serializable . Par exemple, pour enregistrer de manire permanente les objets de la classe Produit on devra prciser la clause implements de la manire suivante . public class Produit implements Serializable {}

___________________________________________________________________
DI GALLO Frdric Page 51 24/12/2012

121643316.doc ______________________________________________________________________________ La lecture dun objet sur un fichier, est ralis en appliquant la mthode readObject() lobjet Flux entrant . Lobjet point par la tte de lecture est alors transfr en mmoire centrale et la tte progresse automatiquement sur lobjet suivant. Dans le programme suivant, la variable P pointe sur lobjet lissue de la lecture sur le fichier Produit P ; P = (Produit) FE.readObject() ; Remarques : - le cast est ncessaire pour effectuer le transtypage de lobjet lu. - dans le cas o la tte de lecture pointe aucun objet, la mthode readObject met lerreur ClassNotFoundException . Pour crire un objet sur un fichier, il suffit dappliquer la mthode writeObject lobjet Flux sortant . Lobjet, prsent en mmoire vive, est alors crit sur le fichier dans lemplacement point par la tte dcriture et celle-ci avance automatiquement sur le prochain emplacement libre. Produit P ; P = new Produit() ; FS.writeObject(P) ;

Application: La classe ProdCatalogue


Dont un extrait est prsent ci-dessous est destine mmoriser les produits proposs la vente par la socit X. Tous ces produits tant soumis au mme taux de T.V.A., celui-ci est stock en un exemplaire dans la variable de classe TauxTVA. Pour mmoriser de faon permanente ce taux et prendre en compte dventuelles modifications, celui-ci est enregistr dans le fichier Param.DTA . class ProdCatalogue {public static float TauxTVA ; private static ObjectInputStream FE; private static ObjectOutputStream FS; private int Reference ; private String Designation ; private PrixHT ; 1. Ecrire les mthodes de classe LireTaux, ModifierTaux et EnregistrerTaux dfinies ci-dessous : La mthode LireTaux lit dans le fichier Param.DTA le taux de TVA enregistr et le stocke dans la variable de classe TauxTVA La mthode ModifierTaux (float NouveauTaux) modifie le taux en vigueur en lui affectant la valeur fournie en paramtre La mthode EnregistrerTaux enregistre dans le fichier Param.DTA le taux en vigueur 2.Ecrire le constructeur de la classe ProdCatalogue destin crer un produit du catalogue en acqurant ses diffrentes caractristiques par lintermdiaire du clavier. 3. Ecrire la mthode AfficherPrixTTC qui affiche le prix TTC du produit.

___________________________________________________________________
DI GALLO Frdric Page 52 24/12/2012

121643316.doc ______________________________________________________________________________

5.2) La gestion des erreurs


Comme il a t dit dans le paragraphe prcdent certaines oprations sur les fichiers peuvent conduire des erreurs dexcution. Par exemple, la cration dun flux entrant provoque une erreur si le fichier que lon veut lire nexiste pas dans larborescence. Chacune de ces erreurs, encore appeles exceptions, correspond un objet dune classe particulire qui est instanci lors de lincident. Ainsi, si lon suppose que le fichier Param.DTA nexiste pas, lexcution de linstruction : FE = new ObjectInputStream (new FileInputStream( Param.DTA ) ; provoque linstanciation dun objet de la classe FileNotFoundException (on dit encore quune exception de la classe FileNotFoundException est leve). A lissue de cette instanciation, le traitement en cours est interrompu et lexception est propage aux mthodes appelantes. Si aucune mthode ne traite lerreur, lexcution se termine avec un ou plusieurs messages derreurs. Toute mthode rfrenant des mthodes pouvant lever des exceptions telles que readObject ou le constructeur dun flux doit avertir le compilateur de ce fait en prcisant la clause supplmentaire trhows liste des classes dexceptions . Par exemple, len-tte de la mthode LireTaux de la classe ProdCatalogue devra, pour tre accepte par le compilateur avoir la forme ci-aprs : public static void LireTaux () throws IOException, ClassNotFoundException { } Si la clause Throws est omise le compilateur signalera pour chaque type derreur susceptible de se produire, le message derreur suivant : "NomClasseException must be caught, or it must be declared in the throws clause of this method" car il sait pour chaque mthode appele, les exceptions quelle peut lever. Dans le cas o la mthode appelante veut traiter lerreur et non la propager, il faut utiliser les instructions try catch . La clause try englobe le traitement susceptible de lever des exceptions, la (ou les) clause(s) catch mentionne(nt) le traitement qui sera excute pour chaque type derreur commise. Le programme suivant illustre ce principe sur la mthode Lire pour laquelle on ne veut plus propager les erreurs leves mais les traiter en retournant la valeur null ou un message appropri. La clause throws devient inutile si on mentionne autant de clauses catch que de type derreurs. public static void LireTaux() { try {FE = new ObjectInputStream (new FileInputStream ("Param.DTA")); TauxTVA = ((Float) FE.readObject()).floatValue(); FE.close(); } catch (IOException Ex) {System.out.println ( Erreur de lecture sur Param.DTA ); } catch (ClassNotFoundException e) {System.out.println ( Le fichier Param.DTA ne contient pas les objets attendus ) ; }

___________________________________________________________________
DI GALLO Frdric Page 53 24/12/2012

121643316.doc ______________________________________________________________________________ Dans le cas o le traitement de lerreur est le mme quelque soit son type, on crira une seule instruction catch avec un nom de classe dexception gnrique. Cette notion est base sur la hirarchie des classes dexceptions dont un extrait (issu de louvrage Java la synthse) est prsent ci-aprs. Pour le programme prcdent on pourrait, par exemple, proposer la solution qui suit : public static void LireTaux() { try {FE = new ObjectInputStream (new FileInputStream ("Param.DTA")); TauxTVA = ((Float) FE.readObject()).floatValue(); FE.close(); } catch (Exception Ex) {System.out.println ( Erreur sur le fichier Param.DTA); } } Object Classe fille Classe mre

Throwable Error Exception RunTimeExcep IOException

___________________________________________________________________
DI GALLO Frdric Page 54 24/12/2012

121643316.doc ______________________________________________________________________________

Application:
Du fait de la prsence de la clause throws dans les en-ttes des mthodes LireTaux et EnregistrerTaux la classe ProdCatalogue prsente ci-dessous nentrane plus derreurs la compilation. En effet, lors de lexcution de la mthode LireTaux , si le fichier Param.DTA nexiste pas, une erreur de type IOException est leve et propage aux mthodes appelantes ce qui entrane larrt de lexcution. On souhaite maintenant modifier cette mthode afin de ne plus stopper lexcution du programme mais de demander lutilisateur de communiquer un taux de TVA dans le cas o le fichier Param.DTA nexiste pas dans larborescence du support. Proposer une solution. import java.io.*; class ProdCatalogue {public static float TauxTVA; private static ObjectInputStream FE; private static ObjectOutputStream FS; private int Reference; private String Designation; private float PrixHT; public static void LireTaux() throws IOException, ClassNotFoundException { FE = new ObjectInputStream (new FileInputStream ("Param.DTA")); TauxTVA = ((Float) FE.readObject()).floatValue(); FE.close(); } public static void EnregistrerTaux() throws IOException { FS = new ObjectOutputStream (new FileOutputStream ("Param.DTA")); FS.writeObject (new Float(TauxTVA)); FS.close(); } public static void ModifierTaux (float NouveauTaux) { TauxTVA = NouveauTaux; } public ProdCatalogue() {System.out.println ("Rfrence ?"); Reference = Lire.i(); System.out.println ("Dsignation ?"); Designation = Lire.S(); System.out.println ("Prix HT ?"); PrixHT = Lire.f(); } public void AfficherPrixTTC() { System.out.println (PrixHT*TauxTVA); } }

___________________________________________________________________
DI GALLO Frdric Page 55 24/12/2012

121643316.doc ______________________________________________________________________________

Auto-valuation n8 : les collections


Dans le cadre du dveloppement d'un logiciel relatif au suivi du trafic d'un rseau INTRANET, on s'intresse aux classes Connexion et ListeConnexions dfinies partiellement ci-dessous class Connexion { private int Duree; private float VolumeEntrant; private float VolumeSortant; public Connexion (int D, float VE, float VS) {} public int SaDuree() {...} public float SonvolumeEntrant() {...} public float SonvolumeSortant() {} } Remarques: On suppose que la dure d'une connexion est exprime en minutes entires et que les volumes sont exprims en KO. Aucun contrle n'est prvoir pour le constructeur de la classe. 1. Ecrire l'ensemble des methodes class Connexion { private int Duree; private float VolumeEntrant; private float VolumeSortant; public Connexion(int D, float VE, float VS) { Duree = D; VolumeEntrant = VE; VolumeSortant = VS; }
// Constructeur de la classe // Constructeur de la classe

// Accesseurs en consultation qui renvoient la dure, le flux entrant et le flux sortant associs la connexion

// Accesseurs en consultation qui renvoient la dure, le flux entrant et le flux sortant associs la connexion

public int SaDuree() { return (Duree); } public float SonvolumeEntrant() { return (VolumeEntrant); } public float SonvolumeSortant()

___________________________________________________________________
DI GALLO Frdric Page 56 24/12/2012

121643316.doc ______________________________________________________________________________ { return (VolumeSortant); } import java.util.*; class ListeConnexions { private Vector Vect; public ListeConnexions() {Vect = new Vector(); }

// Constructeur de la classe ListeConnexions

// Mthode qui ajoute en dernire position de la liste une nouvelle connexion fournie en paramtre dans la liste

public void AjouterNouvelleConnexion (Connexion C) { Vect.add(C); } private int NbTotal() { return Vect.size(); }
// Mthode qui affiche le nombre total de connexions

// Mthode qui affiche la dure total des connexions mmorises dans la liste

private int DureeTotale() { int i, tot=0; for (i=0; i <= NbTotal()- 1; i ++) tot+=((Connexion) Vect.elementAt(i)).SaDuree(); return tot; } public float DureeMoyenneO // Mthode qui renvoie la dure moyenne de connexion { return DureeTotale() / NbTotal(); } public void AfficherListe() // Mthode qui affiche toutes les connexions de la liste { int i; for (i=0; i <= NbTotal()-1; i ++) { System.out.print (((Connexion) Vect.elementAt(i)).SaDuree()+"mn"); System.out.print (((Connexion) Vect.elementAt(i)).SonVolumeEntrant() + "K"); System.out.print (((Connexion) Vect.elementAt(i)).SonVolumeSortant() + "K"); } }
// Mthode qui extrait de la liste les connexions dont la dure est suprieure 5 minutes // et dont les flux sortant et entrant sont infrieurs 50 K. L'extraction n'altre pas la liste initiale.

public ListeConnexions Extract() { ListeConnexions LTmp; LTmp = new ListeConnexions(); int i, tot=0; for (i=0; i <= NbTotal()- 1; i ++) if (((Connexion) Vect.elementAt(i)).SaDuree()> 5 && ((Connexion) Vect.elementAt(i)).SonVolumeEntrant() < 50 && ((Connexion) Vect.elementAt(i)).SonVolumeSortant() < 50) LTmp.AjouterNouvelleConnexion((Connexion) Vect.elementAt(i)); return (LTmp); }

___________________________________________________________________
DI GALLO Frdric Page 57 24/12/2012

121643316.doc ______________________________________________________________________________ }

___________________________________________________________________
DI GALLO Frdric Page 58 24/12/2012

121643316.doc ______________________________________________________________________________ 2. Ecrire le programme de test qui ralise les oprations suivantes: Dure 1 8 12 7 cration des quatre connexions suivantes dans la liste L Volume entrant Volume Sortant 14.4 7 10 5 535 5678 2 2

Affichage de la liste L Affichage du temps moyen de connexion Cration de la liste des connexions LS dont la dure est suprieure 5 minutes et dont les flux sortant et entrant sont infrieurs 50 K Affichage de la liste LS

class TestListeConnexions { public static void main (String args[]) { ListeConnexions L,LS; L = new ListeConnexions(); L.AjouterNouvelleConnexion(new Connexion (1, 14.4f, 7f)); L.AjouterNouvelleConnexion(new Connexion (8, 10f, 5f)); L.AjouterNouvelleConnexion(new Connexion (12, 535f, 5768f)); L.AjouterNouvelleConnexion(new Connexion (7, 2f, 2f)); L.AfficherListe(); System.out.println (L.DureeMoyenne()); LS=L.Extract(); LS.AfficherListe(); } }

___________________________________________________________________
DI GALLO Frdric Page 59 24/12/2012

121643316.doc ______________________________________________________________________________

PROGRAMMATION

ORIENTEE OBJETS : L'HERITAGE en JAVA

___________________________________________________________________
DI GALLO Frdric Page 60 24/12/2012

121643316.doc ______________________________________________________________________________

PROGRAMMATION JAVA: GNRALITS.....5


I. PROGRAMMATION CLASSIQUE ET ORIENTE OBJETS..........................................................................5 II. CLASSE ET OBJET.....................................................................................................................6 III. LES DONNES DUNE CLASSE....................................................................................................8 IV. LES MTHODES DUNE CLASSE................................................................................................11 4.1) Mthodes publiques de type Constructeur ...........................................................14 4.2) Mthodes publiques de type Accesseur ...............................................................17 4.3) Les mthodes de type binaire.....................................................................................21 4.4) La transmission de paramtres.................................................................................26 4.5) Le mot cl this ......................................................................................................27 V. LES VARIABLES ET MTHODES DE CLASSE..................................................................................28 VI. TRAVAUX PRATIQUES...........................................................................................................29 6.1) Utilisation de la classe String....................................................................................29 6.2) Cration dune classe................................................................................................32 VII. ANNEXE : LES TAPES DE DVELOPPEMENT EN JAVA.................................................................33

LES COLLECTIONS EN JAVA...........................37


I. INTRODUCTION..............................................................................................................37 II. LES TABLEAUX.............................................................................................................39 III. LES VECTEURS............................................................................................................42 3.1) La classe gnrique Object .................................................................................42 3.2) Les mthodes de la classe Vector ........................................................................45 3.3) La classe Enumeration ........................................................................................47 3.4) Les packages..............................................................................................................48 IV. LES DICTIONNAIRES..............................................................................................................49 V. LES FLUX.............................................................................................................................51 5.1) Oprations sur un fichier...........................................................................................51 5.2) La gestion des erreurs...............................................................................................53

L'HERITAGE EN JAVA........................................63
I. INTRODUCTION..............................................................................................................63 II. DFINITION DE L'HRITAGE......................................................................................................65 2.1) Le constructeur d'une classe drive.........................................................................66 2.2) Les proprits d'une classe drive...........................................................................67 2.3) Les mthodes d'une classe drive............................................................................68 III. MANIPULATIONS D'OBJETS ISSUS DE CLASSE MRE ET FILLE.........................................................69

EXEMPLES DE CLASSES JAVA.........................78


I. PUISSANCEDE10....................................................................................................................78 II. CAPACITE.............................................................................................................................79 III. PUISSANCE..........................................................................................................................80 IV. INVENTAIRE.........................................................................................................................80 V. CONNEXION & LISTECONNEXION............................................................................................81

___________________________________________________________________
DI GALLO Frdric Page 61 24/12/2012

121643316.doc ______________________________________________________________________________ VI. PRODUIT & PRODUITACHET................................................................................................83 VII. COMPTE & COMPTEEPARGNE..............................................................................................84 VIII. FACTURE & LISTEFACTURES..............................................................................................86 IX. CLIENT & CLIENTPRO.........................................................................................................88

___________________________________________________________________
DI GALLO Frdric Page 62 24/12/2012

121643316.doc ______________________________________________________________________________

INFORMATIQUE CNAM ANGOULEME 2000-2001

L'HERITAGE EN JAVA
I. INTRODUCTION

Compte tenu des connaissances acquises jusqu' prsent, pour implmenter une relation est un entre deux entits A et B , la seule solution envisageable consiste intgrer l'entit A dans l'entit B. Celle technique appele composition est illustre dans le tableau ci-dessous au travers des classes Produit et ProduitAchete. Un produit est caractris par trois proprits: sa rfrence, sa dsignation, et son prix de vente HT. Un produit achet est un produit qui a, en plus, les deux caractristiques suivantes:le nom de son fournisseur, et son prix d'achat HT. class Produit { private String Reference; private String Designation; private float PrixventeHT; public Produit(String R, String D, float PV) // Constructeur { Reference = R; Designation = D; PrixVenteHT = PV; }
// Mthode qui augmente le prix de vente d'un pourcentage pass en paramtre

public void AugmenterPrixVenteHT (float TauxM) { PrixVenteHT = PrixVenteHT *(l+TauxM); }


// Mthode qui renvoie sous la forme d'une chane de caractres toutes les caractristiques du produit

public String InfosQ { retum (Reference + + Designation + + PrixVente HT); } public float SonPrixVenteHT() { return (PrixVenteHT); }
// Accesseur en consultation qui renvoie le prix

___________________________________________________________________
DI GALLO Frdric Page 63 24/12/2012

121643316.doc ______________________________________________________________________________

class ProduitAchete { private Produit Prod; private String NomFournisseur; private float PrixAchatHT;
// Constructeur

public ProduitAchete (String R, String D, float PV, String F, float PA) { Prod = new Produit(R,D,PV); NomFournisseur = F; PrixAchatHT = PA; } public float Marge() // mthode qui calcule la marge sur un produit achet { return (Prod.SonPrixVenteHT() - PrixAchatHT); }
// Mthode qui renvoie sous la forme d'une chane de caractres toutes les caractristiques du produit achet

public String Infos() { return (Prod.Infos() + + NomFournisseur + + PrixAchatHT); } Cette solution qui consiste dire qu'un produit achet contient un produit et non est un produit peut tre reprsente ainsi: (On suppose que P1 est une variable pointant sur un objet de la classe ProduitAchete ). P1
Prod NomFournisseur PrixAchatHT PrixVenteHT

Rfrence Dsignation

Avec une telle implmentation, pour augmenter de 5 % le prix de vente d'un produit achet point par la variable Pi, on devra crire 1'instruction: P1.SonProduit().AugmenterPrixVenteHT(0.05f);
Accesseur Prod

Cette criture n 'est pas naturelle car compte tenu du frit qu 'un produit achet est un produit, on devrait pouvoir crire: Pi.AugmenterPrix VenteHT(O. OS. C'est le concept d'hritage qui va permettre de reprsenter le lien est un de manire plus pertinente.

___________________________________________________________________
DI GALLO Frdric Page 64 24/12/2012

121643316.doc ______________________________________________________________________________

II. Dfinition de l'hritage


Pour exprimer le fait que tout objet de la classe B est un objet de la classe A on devra crire l'en-tte de la classe B de la manire suivante: class B extends A { // donnes et mthodes spcifiques } La dfinition de cette classe peut tre interprte ainsi: - la clause extends spcifie qu'un objet de la classe B hrite de toutes les fonctionnalits de la classe A . Cela signifie que l'on pourra, par exemple, appliquer sur un objet de la classe B les mthodes publiques de la classe A. - le contenu de la classe B dcrit uniquement les fonctionnalits (proprits et mthodes) spcifiques la classe B. L'ajout de fonctionnalits pour la classe B est appele spcialisation. Sans celle spcialisation, la classe B n'aurait aucun intrt car un objet de la classe B serait strictement identique un objet de la classe A. D'un point de vue terminologie, on rappelle que B est une sous-classe de A ou encore une classe drive de A. A est une super-classe ou encore une classe de base. L'hritage permet donc de rutiliser trs facilement le code dj crit. Il garantit en outre que toute modification au niveau de la classe A sera automatiquement rpercute au niveau de la classe drive. Le dbut de la dfinition de la classe ProduitAchete s'crirait donc: class ProduitAchete extends Produit // ProduitAchete est la classe drive ou classe fille. { private String NomFournisseur; // Produit est la classe de base ou classe mre. private float PrixAchatHT; } // ProduitAchete hrite de toutes les mthodes publiques de Produit. Un objet de cette classe pourrait tre schmatise ainsi: P1
Rfrence Dsignation PrixVenteHT NomFournisseur PrixAchatHT

___________________________________________________________________
DI GALLO Frdric Page 65 24/12/2012

121643316.doc ______________________________________________________________________________

Application: On considre la classe Compte tudie l'auto-valuation n0 6


et destine grer des comptes. Un extrait de cette classe est fourni ci-dessous class Compte { private int Numero; private char Type; private float Solde; public Compte (int N, char T) { Numero = N; Type = T; Solde = 0; } public float SonSolde() { return (Solde); } public int SonNumero() { return (Numero); } public void Crediter(float Montant) { Solde += Montant; } public void Afficherlnfos() { System.out.println ( Compte + Numero + + Type + + Solde); } Proposer une solution pour implmenter la notion de compte d'pargne: un compte d'pargne est un compte bancaire qui a, en plus, un taux de rmunration class CompteEpargne extends Compte { private float TauxRenumeration; }

2.1) Le constructeur d'une classe drive


Pour crer un objet de la classe drive, on doit obligatoirement crer un objet de la classe de base par un appel au constructeur de celle-ci. Cette obligation garantit la relation est un entre l'objet de la classe drive et l'objet de la classe de base. Ainsi, le constructeur de la classe ProduitAchete doit avoir la forme suivante: public ProduitAchete (String R, String D, float P frs String F, float PA) { super(R,D,P V); // appel au constructeur de la classe de base NomFournisseur = F; PrixAchatHT = PA; }

___________________________________________________________________
DI GALLO Frdric Page 66 24/12/2012

121643316.doc ______________________________________________________________________________ Remarques: Le mot-cl super dsigne l'objet de la classe suprieure. Ainsi, l'instruction "super(R,D,PV)" cre un produit qui deviendra un produit achet par la valorisation (au moyen des deux dernires instructions) des variables d'instances : NomFournisseur et PrixAchatHT. L'appel au constructeur de la classe mre doit tre la premire instruction du constructeur de la mthode drive. Si l'appel au constructeur de la classe mre n'est pas explicitement cit dans le constructeur de la mthode drive, le compilateur recherche un constructeur par dfaut (constructeur sans paramtre) dans la classe mre. Si celui-ci n'existe pas, le compilateur signale le message d'erreur suivant: no constructor matching Produit() found in Produit

Application: Ecrire le constructeur de la classe CompteEpargne :


dont la signature est fournie ci-dessous: public CompteEpargne (int N, int TauxR) Les paramtres N et TauxR correspondent respectivement au numro de compte et au taux de rmunration du compte pargne. Le type du compte doit tre obligatoirement E pour signifier qu'il s'agit d'un compte pargne. Le solde doit tre initialis 0. public CompteEpargne (int N, intTauxR) { super (N, 'E'); TauxRenumeration = TauxR; }

2.2) Les proprits d'une classe drive


Comme il a dj t dit dans les paragraphes prcdents, un objet d'une classe drive hrite des proprits de la classe mre et admet en plus des proprits spcifiques. Il est important de souligner que l'hritage n'est pas synonyme d'accessibilit. Cela signifie que l'accs (depuis une classe drive) une variable d'instance de la classe de base n'est pas immdiat: il dpend en fait de son spcificateur d'accs. Les trois possibilits sont rcapitules dans le tableau suivant:
Spcificateur d'accs d'une variable d'instance de la classe de base Consquences pour la rfrence dans la classe drive

public private protected

Accs possible dans la classe drive comme dans toutes les classes Accs impossible Accs possible dans toutes les classes drives de la classe mre

Dans le cas o la proprit de la classe mre est inaccessible depuis une classe drive, on doit recourir des mthodes publiques de la classe mre pour la modifier ou la consulter.

___________________________________________________________________
DI GALLO Frdric Page 67 24/12/2012

121643316.doc ______________________________________________________________________________

Application:
Compte tenu du spcificateur d'accs dfini pour les variables de la classe Compte , indiquer si elles sont accessibles depuis la classe CompteEpargne . Toutes les variables de la classe Compte sont dfinies en private, et donc inaccessibles depuis toute autre classe.

2.3) Les mthodes d'une classe drive


Avant de parler des mthodes qui seront explicitement dfinies dans la classe drive, il faut se rappeler, que toute mthode de la classe de base peut tre applique un objet de la classe drive. Outre ces traitements communs, la dfinition d'une classe drive intgre des mthodes dues sa spcialisation. Celles-ci peuvent tre rparties en 3 catgories distinctes: La premire catgorie regroupe toutes les mthodes qui n'existent pas dans la classe mre. Ces mthodes ne peuvent s'appliquer que sur des objets de la classe drive. La seconde catgorie englobe les mthodes dites surcharges. Ces traitements ont le mme nom que des mthodes de la classe mre mais avec des signatures diffrentes. Pour que l'excution russisse il faudra qu'il y ait cohrence entre la signature de la mthode et l'objet sur lequel la mthode est applique. La troisime et dernire catgorie regroupe les mthodes redfinies. Ces mthodes qui ont la mme signature que dans la classe mre sont dites polymorphes. C'est au niveau de l'excution et en fonction de l'objet sur lequel la mthode est applique que la forme de la mthode est choisie. Il faut noter que la redfinition supprime l'hritage. Cela signifie que, pour une mthode polymorphe, on ne pourra plus appliquer la forme dfinie au niveau de la classe mre sur 1 objet de classe drive. Le modificateur "final" dans une mthode de la classe de base empche la redfinition de cette mthode dans les classes filles: public final void Mthode { } La dfinition de la classe ProduitAchete fournie ci-dessous prsente deux mthodes: Marge et Infos appartenant respectivement la premire et la dernire catgorie. class ProduitAchet extends Produit
// Mthode qui renvoie la marge ralise; cette mthode n'existe pas dans la classe mre

{ public float Marge() { return (super.PrixVenteHT() - PrixAchatHT); }


// Mthode polymorphe qui renvoie sous forme de chane de caractres les informations du produit achet:

public String Infos() { return (super.Infos() + + NomFournisseur + + PrixAchatHT); }

___________________________________________________________________
DI GALLO Frdric Page 68 24/12/2012

121643316.doc ______________________________________________________________________________ } n Remarque: la mthode Infos est construite partir du code de la mthode Infos dfinie au niveau de la classe mre par la rfrence : super.Infos().Si l'on omet dans cet appel le mot-cl super, la mthode Infos devient rcursive et provoque une excution sans fin.

Application: Ecrire dans la classe CompteEpargne les 2 mthodes suivantes:


Afficherlnfos() afin de visualiser le message: compte pargne : numro, solde, taux de rmunration Ajouterlnterets() qui ajoute au solde les intrts annuels class CompteEpargne extends Compte {
// Mthode qui visualise les caractristiques du compte pargne

public void Afficherlnfos() { System.out.println ("Compte pargne:" + super.SonNumero() +" "+ super.SonSolde() +" "+ TauxRemuneration); }
// Mthode qui ajoute les intrts annuels au solde

public void Ajouterlnterets() { super.Crediter (TauxRemuneration*super.SonSolde()); } } // *this.SonSolde() ou * SonSolde()

III. Manipulations d'objets issus de classe mre et fille


Sur un objet de la classe mre, on peut appliquer toutes les mthodes publiques de cette classe. Sur un objet de la classe drive, on peut appliquer: - Toutes les mthodes publiques de la classe mre non redfinies, - Toutes les mthodes publiques de la classe drive. L'affectation d'un objet de la classe drive dans une variable objet de la classe mre est possible sans avoir spcifier un transtypage. Ainsi tout produit achet tant un produit on peut affecter dans une variable de la classe "Produit" un objet de la classe "ProduitAchet". Produit P; ProduitAchete PA; PA = new ProduitAchete( "R45", "Table", 250, "Dupont", 150); P=PA; Par contre l'affectation rciproque (objet de la classe mre dans une variable objet de la classe fille) ncessite un transtypage explicite. Ainsi un produit n 'tant pas forcment un produit achet, on devra spcifier un cast afin d'indiquer au compilateur que l'objet point par une variable de la classe Produit est effectivement un produit achet. Cette technique est ncessaire ds lors que l'on veut appliquer des mthodes de la classe drive un objet point par une variable de la classe mre. Par exemple, pour appliquer la mthode "Marge()" un produit achet point par la variable P (de la classe Produit ) on devra crire: ((ProduitAchete) P).Marge().

___________________________________________________________________
DI GALLO Frdric Page 69 24/12/2012

121643316.doc ______________________________________________________________________________

___________________________________________________________________
DI GALLO Frdric Page 70 24/12/2012

121643316.doc ______________________________________________________________________________

Application: Ecrire le programme de test qui ralise les oprations suivantes:


N 1 2 3
0

Cration des comptes bancaires suivants: de compte Type de compte Taux de rmunration Variable objet E 0.035 CE1 C C1 E 0.04 CE2 Affectation dans les variables C2 C3 des comptes d'pargnes points par CE1 et CE2. Ajout de 100 F sur les comptes points par Cl et C2. Mise jour des intrts du compte point par C2. Affichage des informations des comptes points par Cl, C2, C3. class TestCompte { public static void main (String args[]) { Compte C1,C2,C3; CompteEpargne CEI ,CE2; CEl = new CompteEpargne (1, 0.035f); Cl = new Compte (2,'C'); CE2 = new CompteEpargne (3,0.04f); C2 = CEl ; C3 = CE2 ; Cl .Crediter(100); C2.Crediter(l00); ((CompteEpargne)C2).AjouterInterets(); Cl.AfficherInfos(); C2.Afficherlnfos(); // polymorphisme C3.Afficherlnfos(); } }

// sinon il le considre un double // sinon il le considre un double

Auto-valuation n9: Rvisions:


Partie n0 1: On considre la classe Facture dfinie partiellement ci-dessous: class Facture { private static float TauxTVA=0.206f; private int NoFacture; private float MontantHT; public int SonNumero() { return (NoFacture); } }

___________________________________________________________________
DI GALLO Frdric Page 71 24/12/2012

121643316.doc ______________________________________________________________________________ 1. Ecrire la mthode prive ValideMontant(float M) dont l'objectif est de contrler si le montant M pass en paramtre est strictement positive. Sa logique algorithmique est prsente ci-dessous: Si M <=0 Alors Afficher le montant doit tre strictement positif Arrt de l'excution FinSi Retourner M 2. Un programme utilisant la classe Facture contient les deux instructions suivantes: Facture F; F = new Facture (1, 200); // (N de la facture, Montant HT de la facture) Dduire de la dernire instruction la signature associ a l'un des constructeurs de la classe. Ecrire le contenu de ce constructeur en envisageant uniquement un contrle sur le montant hors taxes qui doit tre strictement positif. 3. Ecrire l'accesseur en modification ModifMontant charg de modifier le montant HT d'une facture. Un exemple d'appel de cet accesseur est fourni ci-dessous et affecte la valeur 100 au montant HT de la facture pointe par F. F.ModifMontant(100); On devra aussi dans cet accesseur vrifier que le nouveau montant est strictement positif. 4. Ecrire la mthode SonMontantTTCO charge de renvoyer le montant TTC de la facture. Indiquer l'instruction crire dans le programme de test pour afficher le montant TTC de la facture pointe par la variable F. 5. Dfinir la mthode de classe ChangerTaux qui permet de changer le taux de TVA en vigueur contenu dans la variable de classe TauxTVA. Le nouveau taux est un paramtre formel de la mthode. Indiquer l'instruction spcifier dans le programme de test pour affecter la valeur 0.204 au taux de TVA. Partie n0 2: Pour construire la classe ListeFactures destine grer une liste des factures on envisage les deux implantations suivantes: Solution 1 class ListeFactures { private Facture [] T; private int Nb; public ListeFactures O { T = new Facture [50]; Nb=0; } public void AjouterUneFacture (Facture F) { T[Nb] = F; Nb ++; } Solution 2 importjava.util.Vector class ListeFactures { private Vector V; public ListeFactures() { V = new Vector(); } public void AjouterUneFacture (Facture F) { V.add (F); }

___________________________________________________________________
DI GALLO Frdric Page 72 24/12/2012

121643316.doc ______________________________________________________________________________ 6. Ecrire pour chacune des deux solutions la mthode TotalTTC qui renvoie le total TTC des factures contenues dans la liste. On suppose que la mthode SonMontantTTC() est disponible dans la classe Facture . Partie n0 3: Les clients de la socit mettrice de factures peuvent tre rpartis en deux catgories: les particuliers qui reprsentent la majorit des clients de l'entreprise et pour lesquels la tarification des frais de livraison dpend seulement du dpartement de livraison que l'on suppose tre le dpartement du client, les professionnels pour lesquels la tarification de la livraison dpend du dpartement mais aussi du chiffre d'affaires ralis. Pour mmoriser ces deux types de clients, on propose les classes "Client" et "ClientPro" dfinies ci-dessous: La classe Client class Client { private String Nom; private String Prenom; protected int Departement; public Client (String N, String P, int D) { Nom=N; Prenom = P; Departement = D; } public float FraisDeLivraison() { float F=0; if (Departement != 16) F = 1500; return (F); } } La classe ClientPro class ClientPro extends Client { private float CA; public ClientPro (String N, String P, int D) { ... } public void CumulerAchat(float Montant) { CA+=Montant; } } 7. Quelle est la consquence du spcificateur protected associ la proprit "Departement" ? 8. Dfinir le constructeur de la classe ClientPro . A l'issue de l'excution de ce constructeur, la valeur O doit tre affecte dans la variable CA.

___________________________________________________________________
DI GALLO Frdric Page 73 24/12/2012

121643316.doc ______________________________________________________________________________ 9. Redfinir la mthode FraisDeLivraison dans la classe Clientl>ro afm de respecter la rgle de gestion suivante: La tarification des frais de livraison suit les mmes rgles que pour les particuliers exception faite du cas o le chiffre d'affaires du professionnel est suprieur 10 000 F et les frais de livraison payants. Dans ce cas une rduction de 5 % est applique. 10. On considre le programme de test suivant: class TestClient { public static void main (String args[]) { Client C1,C2,CInt; ClientPro CP; Cl = new Client("Dupont","Paul", 16); C2 = new Client("Durand","Ren", 17); CP = new ClientPro("Dubois", "Claude", 17); CP.CumulerAchat(l5 000); CInt=CP; System.out.println(CInt.FraisDeLivraison()); System.out.prihtln (C2.FraisDeLivraison()); } } Quel sera le rsultat affich par les deux dernires instructions? 1425 et 1500

___________________________________________________________________
DI GALLO Frdric Page 74 24/12/2012

121643316.doc ______________________________________________________________________________

PROGRAMMATION

ORIENTEE OBJETS : ANNEXES: Quelques classes

___________________________________________________________________
DI GALLO Frdric Page 75 24/12/2012

121643316.doc ______________________________________________________________________________

PROGRAMMATION JAVA: GNRALITS.....5


I. PROGRAMMATION CLASSIQUE ET ORIENTE OBJETS..........................................................................5 II. CLASSE ET OBJET.....................................................................................................................6 III. LES DONNES DUNE CLASSE....................................................................................................8 IV. LES MTHODES DUNE CLASSE................................................................................................11 4.1) Mthodes publiques de type Constructeur ...........................................................14 4.2) Mthodes publiques de type Accesseur ...............................................................17 4.3) Les mthodes de type binaire.....................................................................................21 4.4) La transmission de paramtres.................................................................................26 4.5) Le mot cl this ......................................................................................................27 V. LES VARIABLES ET MTHODES DE CLASSE..................................................................................28 VI. TRAVAUX PRATIQUES...........................................................................................................29 6.1) Utilisation de la classe String....................................................................................29 6.2) Cration dune classe................................................................................................32 VII. ANNEXE : LES TAPES DE DVELOPPEMENT EN JAVA.................................................................33

LES COLLECTIONS EN JAVA...........................37


I. INTRODUCTION..............................................................................................................37 II. LES TABLEAUX.............................................................................................................39 III. LES VECTEURS............................................................................................................42 3.1) La classe gnrique Object .................................................................................42 3.2) Les mthodes de la classe Vector ........................................................................45 3.3) La classe Enumeration ........................................................................................47 3.4) Les packages..............................................................................................................48 IV. LES DICTIONNAIRES..............................................................................................................49 V. LES FLUX.............................................................................................................................51 5.1) Oprations sur un fichier...........................................................................................51 5.2) La gestion des erreurs...............................................................................................53

L'HERITAGE EN JAVA........................................63
I. INTRODUCTION..............................................................................................................63 II. DFINITION DE L'HRITAGE......................................................................................................65 2.1) Le constructeur d'une classe drive.........................................................................66 2.2) Les proprits d'une classe drive...........................................................................67 2.3) Les mthodes d'une classe drive............................................................................68 III. MANIPULATIONS D'OBJETS ISSUS DE CLASSE MRE ET FILLE.........................................................69

EXEMPLES DE CLASSES JAVA.........................78


I. PUISSANCEDE10....................................................................................................................78 II. CAPACITE.............................................................................................................................79 III. PUISSANCE..........................................................................................................................80 IV. INVENTAIRE.........................................................................................................................80 V. CONNEXION & LISTECONNEXION............................................................................................81

___________________________________________________________________
DI GALLO Frdric Page 76 24/12/2012

121643316.doc ______________________________________________________________________________ VI. PRODUIT & PRODUITACHET................................................................................................83 VII. COMPTE & COMPTEEPARGNE..............................................................................................84 VIII. FACTURE & LISTEFACTURES..............................................................................................86 IX. CLIENT & CLIENTPRO.........................................................................................................88

___________________________________________________________________
DI GALLO Frdric Page 77 24/12/2012

121643316.doc ______________________________________________________________________________

INFORMATIQUE CNAM ANGOULEME 2000-2001

EXEMPLES DE CLASSES JAVA


I. PuissanceDe10
class PuissanceDe10 { private int Exposant; public PuissanceDe10 (int E) { Exposant = E ; }

// on ne met pas de type pour le constructeur.

public void Afficher () { System.out.println ("10^" + Exposant) ; } public void Multiplier (PuissanceDe10 P) { Exposant += P.Exposant ; } public PuissanceDe10 MultiplierBis (PuissanceDe10 P) { PuissanceDe10 Result; Result = New PuissanceDe10 (P.Exposant + Exposant); Return (Result) ; } public PuissanceDe10 MultiplierTer (PuissanceDe10 P) { Exposant += P.Exposant ; return this ; // this retourne l'objet lui-mme. } public void MultiplierQua (PuissanceDe10 P) { P.Exposant += Exposant ; } // ici c'est P2 qui va tre modifi. public float Valeur () { int P = 1, i ; for (i = 1; i <= Math.abs(Exposant); i++;) P = P*10 ; if (Exposant < 0) P = 1 / P ; return (P) ; } }

___________________________________________________________________
DI GALLO Frdric Page 78 24/12/2012

121643316.doc ______________________________________________________________________________

II. Capacite
class Capacite { private float Valeur; private char Unite; public Capacite (float V, char U) { if (U != 'O' && U != 'K' && U !=' M') { System.out.println (" capacit incorrecte"); System.exit(1); } else { Valeur = V; Unite = U; } } private long ValeurEnOctets () { long L = (long) Valeur; if (Unite = = 'K') L = (long) Valeur* 1024; else if(Unite = = 'M') L = (long) Valeur * 1024*1024; return L; } public void Ajouter (Capacite C) { Valeur = this.ValeurEnOctets () + C.ValeurEnOctets (); Unite = 'O'; } public void Afficher () { System.out.println (Valeur +" "+ Unite); } } class TestCapacite { public static void main (String args[]) { Capacite C1,C2; C1= new Capacite (10,'O'); C2 = new Capacite (1,'K'); Cl.Ajouter (C2); Cl.Afficher (); C2.Afficher(); }

___________________________________________________________________
DI GALLO Frdric Page 79 24/12/2012

121643316.doc ______________________________________________________________________________

III. Puissance
class Puissance { private static int base = 2 ; private int exposant ; public static void ChoisirBase() { base = Lire.i() ; } exposant = Lire.i() ; } public void Afficher () { System.out.println (base + ^ + exposant) ; } }

IV. Inventaire
class Inventaire { private Produit [] ListeProduits; private int NbProduits = 0; public Inventaire() { ListeProduits = new Produit [100]; } public void AjouterunProduit() { ListeProduits[NbProduits] = new Produit; NbProduits ++; } public Produit RechercherUnProduit (int RefProduit) { int i=0; Produit tmp=null; boolean Trouve = false; while (! Trouve && i <=NbProduits-1) if (RefProduit = = ListeProduits[i].SaReference()) { Trouve = true; tmp = ListeProduits[i]; } else i ++; return tmp; } public void AfficherProduitsACommander() { int i; for (i=0; i<= NbProduits - i; i ++) if (ListeProduits[i].Acommander()) System.out.print (ListeProduits[i].SaReference()); } }

___________________________________________________________________
DI GALLO Frdric Page 80 24/12/2012

121643316.doc ______________________________________________________________________________ class TestInventaire { public static void main (String args[]) { Inventaire INV; int R; char Rep; INV= new Inventaire(); do { INV.AjouterunProduit(); System.out.println ("Autre produit (O/N)?"); Rep = Lire.c(); } while (Rep == 'O'); System.out.println ("Saisir une rfrence de produit"); R = Lire.i(); if (INV.RechercherunProduit(R) != null) System.out.println (INV.RechercherunProduit(R).SonStock()); else System.out.println ("Pas de produit pour cette rfrence"); System.out.println ("Liste des produits commander"); INV.AfficherProduitsACommander(); } }

V.

Connexion & ListeConnexion


class Connexion { private int Duree; private float VolumeEntrant; private float VolumeSortant; public Connexion(int D, float VE, float VS) { Duree = D; VolumeEntrant = VE; VolumeSortant = VS; } public int SaDuree() { return (Duree); } public float SonvolumeEntrant() { return (VolumeEntrant); } public float SonvolumeSortant() { return (VolumeSortant); }
// Constructeur de la classe

// Accesseurs en consultation qui renvoient la dure, le flux entrant et le flux sortant associs la connexion

___________________________________________________________________
DI GALLO Frdric Page 81 24/12/2012

121643316.doc ______________________________________________________________________________ import java.util.*; class ListeConnexions { private Vector Vect; public ListeConnexions() {Vect = new Vector(); }

// Constructeur de la classe ListeConnexions

// Mthode qui ajoute en dernire position de la liste une nouvelle connexion fournie en paramtre dans la liste

public void AjouterNouvelleConnexion (Connexion C) { Vect.add(C); } private int NbTotal() { return Vect.size(); }
// Mthode qui affiche le nombre total de connexions

// Mthode qui affiche la dure total des connexions mmorises dans la liste

private int DureeTotale() { int i, tot=0; for (i=0; i <= NbTotal()- 1; i ++) tot+=((Connexion) Vect.elementAt(i)).SaDuree(); return tot; } public float DureeMoyenneO // Mthode qui renvoie la dure moyenne de connexion { return DureeTotale() / NbTotal(); } public void AfficherListe() // Mthode qui affiche toutes les connexions de la liste { int i; for (i=0; i <= NbTotal()-1; i ++) { System.out.print (((Connexion) Vect.elementAt(i)).SaDuree()+"mn"); System.out.print (((Connexion) Vect.elementAt(i)).SonVolumeEntrant() + "K"); System.out.print (((Connexion) Vect.elementAt(i)).SonVolumeSortant() + "K"); } }
// Mthode qui extrait de la liste les connexions dont la dure est suprieure 5 minutes // et dont les flux sortant et entrant sont infrieurs 50 K. L'extraction n'altre pas la liste initiale.

public ListeConnexions Extract() { ListeConnexions LTmp; LTmp = new ListeConnexions(); int i, tot=0; for (i=0; i <= NbTotal()- 1; i ++) if (((Connexion) Vect.elementAt(i)).SaDuree()> 5 && ((Connexion) Vect.elementAt(i)).SonVolumeEntrant() < 50 && ((Connexion) Vect.elementAt(i)).SonVolumeSortant() < 50) LTmp.AjouterNouvelleConnexion((Connexion) Vect.elementAt(i)); return (LTmp); } }

___________________________________________________________________
DI GALLO Frdric Page 82 24/12/2012

121643316.doc ______________________________________________________________________________ class TestListeConnexions { public static void main (String args[]) { ListeConnexions L,LS; L = new ListeConnexions(); L.AjouterNouvelleConnexion(new Connexion (1, 14.4f, 7f)); L.AjouterNouvelleConnexion(new Connexion (8, 10f, 5f)); L.AjouterNouvelleConnexion(new Connexion (12, 535f, 5768f)); L.AjouterNouvelleConnexion(new Connexion (7, 2f, 2f)); L.AfficherListe(); System.out.println (L.DureeMoyenne()); LS=L.Extract(); LS.AfficherListe(); } }

VI. Produit & ProduitAchet


class Produit { private String Reference; private String Designation; private float PrixventeHT; public Produit(String R, String D, float PV) { Reference = R; Designation = D; PrixVenteHT = PV; }
// Constructeur

// Mthode qui augmente le prix de vente d'un pourcentage pass en paramtre

public void AugmenterPrixVenteHT (float TauxM) { PrixVenteHT = PrixVenteHT *(l+TauxM); }


// Mthode qui renvoie sous la forme d'une chane de caractres toutes les caractristiques du produit

public String InfosQ { retum (Reference + + Designation + + PrixVente HT); } public float SonPrixVenteHT() { return (PrixVenteHT); }
// Accesseur en consultation qui renvoie le prix

___________________________________________________________________
DI GALLO Frdric Page 83 24/12/2012

121643316.doc ______________________________________________________________________________ class ProduitAchete { private Produit Prod; private String NomFournisseur; private float PrixAchatHT;
// Constructeur

public ProduitAchete (String R, String D, float PV, String F, float PA) { Prod = new Produit(R,D,PV); NomFournisseur = F; PrixAchatHT = PA; } public float Marge() // mthode qui calcule la marge sur un produit achet { return (Prod.SonPrixVenteHT() - PrixAchatHT); }
// Mthode qui renvoie sous la forme d'une chane de caractres toutes les caractristiques du produit achet

public String Infos() { return (Prod.Infos() + + NomFournisseur + + PrixAchatHT); }

VII. Compte & CompteEpargne


class Compte { private int Numero; private char Type; private float Solde; public Compte (int N, char T) { Numero = N; Type = T; Solde = 0; } public float SonSolde() { return (Solde); } public int SonNumero() { return (Numero); } public void Crediter(float Montant) { Solde += Montant; } public void Afficherlnfos() { System.out.println ( Compte + Numero + + Type + + Solde); } }

___________________________________________________________________
DI GALLO Frdric Page 84 24/12/2012

121643316.doc ______________________________________________________________________________ class CompteEpargne extends Compte { private float TauxRemuneration;

public CompteEpargne (int N, float TauxR) { super (N, 'E'); TauxRemuneration = TauxR; }
// Mthode qui visualise les caractristiques du compte pargne

public void Afficherlnfos() { System.out.println ("Compte pargne:" + super.SonNumero() +" "+ super.SonSolde() +" "+ TauxRemuneration); }
// Mthode qui ajoute les intrts annuels au solde

public void Ajouterlnterets() { super.Crediter (TauxRemuneration*super.SonSolde()); } }


// *this.SonSolde() ou * SonSolde()

class TestCompte { public static void main (String args[]) { Compte C1,C2,C3; CompteEpargne CEI ,CE2; CEl = new CompteEpargne (1, 0.035f); Cl = new Compte (2,'C'); CE2 = new CompteEpargne (3,0.04f); C2 = CEl ; C3 = CE2 ; Cl .Crediter(100); C2.Crediter(l00); ((CompteEpargne)C2).AjouterInterets(); Cl.AfficherInfos(); C2.Afficherlnfos(); // polymorphisme C3.Afficherlnfos(); } }

// sinon il le considre un double // sinon il le considre un double

___________________________________________________________________
DI GALLO Frdric Page 85 24/12/2012

121643316.doc ______________________________________________________________________________

VIII.

Facture & ListeFactures

class Facture { private static float TauxTVA=0.206f; private int NoFacture; private float MontantHT; private float ValideMontant(float M) { if (M<=0) { System.out.println("le montant doit tre strictement positif'); System.exit(1); } return (M); } public Facture(int NF, float M) { NoFacture = NF; MontantHT = ValideMontant (M); } public void ModifMontant(float NM) { MontantHT = ValideMontant(NM); } public float SonMontantTTC() { return (MontantHT*(1+TauxTVA)); } public static void ChangerTaux(float NT) { TauxTVA=NT; } }

class TestFacture { public static void main (String args[]) { Facture F; F = new Facture(56, 200); System.out.println (F.SonMontantTTC()); F.ModifMontant(100); System.out.println (F.SonMontantTTC()); Facture.ChangerTaux(0.204f); System.out.println (F.SonMontantTTC()); } }

___________________________________________________________________
DI GALLO Frdric Page 86 24/12/2012

121643316.doc ______________________________________________________________________________ class ListeFactures // implante au moyen d'un tableau { private Facture [] T; private int Nb; public ListeFactures() { T = new Facture[50]; Nb=0; } public void AjouteruneFacture(Facture F) { T[Nb] = F; Nb++; } public float TotalTTC() { int i; float Tot=0; for (i=0; i<=Nb-1; i ++) Tot+=T[i].SonMontantTTC(); return Tot; } } La classe ListeFactures // implante au moyen d'un vecteur

import java.util.Vector; class ListeFactures { private Vector V; public ListeFactures() { V = new Vector(); } public void AjouterUneFacture(Facture F) { V.add(F); } public float TotalTTC() { int i; float Tot=0; for (i = 0; i <= V.sizeO-1; i ++) Tot += ((Facture)V.elementAt(i)).SonMontantTTC(); return (Tot); } }

___________________________________________________________________
DI GALLO Frdric Page 87 24/12/2012

121643316.doc ______________________________________________________________________________ class TestListeFactures { public static void main (String args[]) { Facture F; ListeFactures2 L; L = new ListeFactures2(); F = new Facture(1,100); L.AjouterUneFacture (F); F = new Facture(2,50); L.AjouterUneFacture(F); System.out.println (L.TotalTTC()); } }

IX. Client & ClientPro


class ClientPro extends Client { private float CA; public ClientPro (String N, String P, int D) { super(N,P,D); CA=0; } public void CumulerAchat(float Montant) { CA+=Montant; } public float FraisDeLivraison() { float F=0; F = super.FraisDeLivraison(); if (CA > 10 000 && F > 0) F *= 0.95f; return (F); } } class TestClient { public static void main (String args[]) { Client C1,C2,CInt; ClientPro CP; Cl = new Client("Dupont","Paul", 16); C2 = new Client("Durand","Ren", 17); CP = new ClientPro("Dubois", "Claude", 17); CP.CumulerAchat(l5 000); CInt=CP; System.out.println(CInt.FraisDeLivraison()); System.out.prihtln (C2.FraisDeLivraison()); } }

___________________________________________________________________
DI GALLO Frdric Page 88 24/12/2012