Académique Documents
Professionnel Documents
Culture Documents
DI GALLO Frdric
Programmation Oriente
Objets en JAVA
Cours du Cycle dApprofondissement
class
{ public
private
___________________________________________________________________
DI GALLO Frdric Page 1 27/11/2017
Document1
___________________________________________________________________
DI GALLO Frdric Page 2 27/11/2017
Document1
L'HERITAGE EN JAVA
I. INTRODUCTION .......................................................................................................... 55
II. DEFINITION DE L'HERITAGE ............................................................................................. 57
2.1) Le constructeur d'une classe drive......................................................................... 58
2.2) Les proprits d'une classe drive ........................................................................... 59
2.3) Les mthodes d'une classe drive ............................................................................ 60
III. MANIPULATIONS D'OBJETS ISSUS DE CLASSE MERE ET FILLE ........................................... 61
___________________________________________________________________
DI GALLO Frdric Page 3 27/11/2017
Document1
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) ;
}
___________________________________________________________________
DI GALLO Frdric Page 4 27/11/2017
Document1
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 ; mmoriser une fraction.
public void initialiser(int n, int d)
{Numerateur = n ;
Denominateur = d ; 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.
Numerateur
F
Denominateur
___________________________________________________________________
DI GALLO Frdric Page 5 27/11/2017
Document1
Il est important de noter que la variable F contient ladresse de lobjet et non lobjet lui-
mme. 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.
0 int I ;
1 Date D1,D2 ;
2 D1=new Date() ;
3 D2=D1 ;
4 D1=new Date() ;
N Type Image
0 Dclaration d'une variable de type I
primitive
1 Dclaration des variables D1 et D2 D1 NULL
destines contenir des objets de type D2 NULL
Date
2 Instanciation de D1
Jour
D1 Mois
Annee
NULL
D2
3 Instanciation de D2 vers l'objet de D1
D1 Jour
D2 Mois
Annee
4 Nouvelle instanciation de D1
Jour
D1 Mois
Annee
___________________________________________________________________
DI GALLO Frdric Page 6 27/11/2017
Document1
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
Denominateur
Fraction F ;
F=New Fraction()
F.Numerateur =2 // affectation refuse la compilation car la variable Numerateur est prive
F.Denominateur = 3 // affectation autorise car la variable Denominateur est publique
___________________________________________________________________
DI GALLO Frdric Page 7 27/11/2017
Document1
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;
}
class Date
{ public int Jour;
public int Mois;
public int Annee ;
}
___________________________________________________________________
DI GALLO Frdric Page 8 27/11/2017
Document1
class Fraction
{ private int Numerateur ;
private int Denominateur ;
___________________________________________________________________
DI GALLO Frdric Page 9 27/11/2017
Document1
Exemple:
class Date
{ public int Jour;
public int Mois;
public int Annee ;
class test
{ public static void main(String args[])
{ Date D1 ;
D1=new Date() ;
D1.Jour = 12 ;
utilisateur D1.Mois = 02 ;
D1.Annee = 2001 ;
D1.Afficher() ;
System.out.println (D1.MonJour()+25) ;
}
}
___________________________________________________________________
DI GALLO Frdric Page 10 27/11/2017
Document1
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 ; }
___________________________________________________________________
DI GALLO Frdric Page 11 27/11/2017
Document1
Type Valeur
Entier 0
Rel 0.0
Chane de caractres Null
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) // Fraction tant le nom de la classe, ceci est le constructeur
{ 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.
}
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 12 27/11/2017
Document1
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.
class Horaire
{ private int heure ;
private int Minute ;
}
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 13 27/11/2017
Document1
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 ;
___________________________________________________________________
DI GALLO Frdric Page 14 27/11/2017
Document1
class Compte
{ private int Numero ; // Il vaut mieux dclarer les variables en priv
private char Type ;
private float Solde ;
} // Types primitifs : la variable contient la valeur et pas un pointeur.
Solde
___________________________________________________________________
DI GALLO Frdric Page 15 27/11/2017
Document1
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;
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;
}
___________________________________________________________________
DI GALLO Frdric Page 16 27/11/2017
Document1
5. Pour agir sur le solde d'un compte on souhaite disposer des traitements "Debiter" et
"Crediter". Ecrire les mthodes associes.
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 17 27/11/2017
Document1
{
if (C1.EstSuperieur (C2) ) System.out.println ("C1 est suprieur C2");
else System.out.println ("C1 est infrieur ou gal C2");
}
class Fraction
{ private int Numerateur ;
private int Denominateur ;
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 .
class Test
___________________________________________________________________
DI GALLO Frdric Page 18 27/11/2017
Document1
class PuissanceDe10
{ private int Exposant;
public PuissanceDe10 (int E) // on ne met pas de type pour le constructeur.
{ Exposant = E ; }
___________________________________________________________________
DI GALLO Frdric Page 19 27/11/2017
Document1
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; }
}
___________________________________________________________________
DI GALLO Frdric Page 20 27/11/2017
Document1
___________________________________________________________________
DI GALLO Frdric Page 21 27/11/2017
Document1
Programme dutilisation
x=4
F = new Fraction(x,5) x 5
4
N D
Fonction Fraction (int N, intD) 4 5
{ Numerateur =N ;
Denominateur = D ;
} 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.
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
:
___________________________________________________________________
DI GALLO Frdric Page 22 27/11/2017
Document1
Numerateur Numerateur
F1 4 F2 4
4567 6544
Denominateur Denominateur
8 8
Inversion du numrateur et
F du dnominateur
6544
F.Inverse ()
Return This.Multiplier (F);
On remarque que F2 nest pas modifi mais cest lobjet point qui est modifi.
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:
La mthode Diviser prsente dans le paragraphe prcdent prsente un autre intrt du mot
cl this .
___________________________________________________________________
DI GALLO Frdric Page 23 27/11/2017
Document1
Base Base
P1 P2
2 4
4567 6544
Exposant Exposant
3 2
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 ;
}
P1 P2
Exposant Exposant
4567 3 6544 2
Base
2
class Puissance
{ private static int base = 2 ;
private int exposant ;
public static void ChoisirBase () // on suppose que la fonction Lire.i()
{ base = Lire.i() ; } // permet dacqurir au clavier un entier (int).
}
___________________________________________________________________
DI GALLO Frdric Page 24 27/11/2017
Document1
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) ; }
}
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 25 27/11/2017
Document1
Exemple:
012345 6
String ch, ch1; ch
BONJOUR
ch = New String ('Bonjour') ;
System.out.println (ch.indexOf ('B') ) ; // affiche 0.
ch1 = ch.Substring (2,4) ; ch1 234
System.out.println (ch.length () ); // affiche 7. NJO
___________________________________________________________________
DI GALLO Frdric Page 26 27/11/2017
Document1
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 :
" + D1.TotMinutes) ; 240
}
}
___________________________________________________________________
DI GALLO Frdric Page 27 27/11/2017
Document1
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 28 27/11/2017
Document1
PROGRAMMATION
ORIENTEE
OBJETS :
Les Collections
JAVA
___________________________________________________________________
DI GALLO Frdric Page 29 27/11/2017
Document1
___________________________________________________________________
DI GALLO Frdric Page 30 27/11/2017
Document1
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 ;
P Rfrence
34
Dsignation
Stock
55 Disquette
StockAlerte
15
s
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.
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 31 27/11/2017
Document1
___________________________________________________________________
DI GALLO Frdric Page 32 27/11/2017
Document1
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 :
___________________________________________________________________
DI GALLO Frdric Page 33 27/11/2017
Document1
ListeProduits
0 1 2 3 4
null null null null null
objet objet
Produit 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 34 27/11/2017
Document1
public Inventaire()
{ ListeProduits = new Produit [100]; }
___________________________________________________________________
DI GALLO Frdric Page 35 27/11/2017
Document1
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;
}
___________________________________________________________________
DI GALLO Frdric Page 36 27/11/2017
Document1
Vector ListeProduits ;
ListeProduits = new Vector() ;
ListeProduits
objet de la
classe
Object
sous classe
ou classe drive
Produit Fraction Classe C
equals
Exemple: Compte
___________________________________________________________________
DI GALLO Frdric Page 37 27/11/2017
Document1
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 Disquette
StockAlerte
15
s
P2 Rfrence
34
Dsignation
Stock
55 Disquette
StockAlerte
15
s
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 38 27/11/2017
Document1
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.
if (O1.equals(O2)) //cest la mthode equals de la classe Produit qui est excute car les objets
// O1 et O2 appartiennent la classe Produit
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.
Produit
ListeProduits
Rfrence
34
Dsignation
objet de la Stock
55
classe StockAlerte
15
Object
___________________________________________________________________
DI GALLO Frdric Page 39 27/11/2017
Document1
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
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) ;
import java.util.Vector;
class Inventaire
{ Vector ListeProduits;
public Inventaire()
{ ListeProduits = new Vector(); }
{ 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;
}
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 41 27/11/2017
Document1
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
___________________________________________________________________
DI GALLO Frdric Page 42 27/11/2017
Document1
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
___________________________________________________________________
DI GALLO Frdric Page 43 27/11/2017
Document1
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 :
___________________________________________________________________
DI GALLO Frdric Page 44 27/11/2017
Document1
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 45 27/11/2017
Document1
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) ;
___________________________________________________________________
DI GALLO Frdric Page 46 27/11/2017
Document1
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 47 27/11/2017
Document1
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
tion
___________________________________________________________________
DI GALLO Frdric Page 48 27/11/2017
Document1
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 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 49 27/11/2017
Document1
class Connexion
{ private int Duree;
private float VolumeEntrant;
private float VolumeSortant;
// Accesseurs en consultation qui renvoient la dure, le flux entrant et le flux sortant associs la connexion
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.
// Accesseurs en consultation qui renvoient la dure, le flux entrant et le flux sortant associs la connexion
public int SaDuree()
{ return (Duree); }
import java.util.*;
___________________________________________________________________
DI GALLO Frdric Page 50 27/11/2017
Document1
class ListeConnexions
{ private Vector Vect;
public ListeConnexions() // Constructeur de la classe ListeConnexions
{Vect = new Vector(); }
// 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); }
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 51 27/11/2017
Document1
Affichage de la liste L
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 52 27/11/2017
Document1
PROGRAMMATION
ORIENTEE
OBJETS :
L'HERITAGE
en JAVA
___________________________________________________________________
DI GALLO Frdric Page 53 27/11/2017
Document1
L'HERITAGE EN JAVA
I. INTRODUCTION .......................................................................................................... 55
II. DEFINITION DE L'HERITAGE ............................................................................................. 57
2.1) Le constructeur d'une classe drive......................................................................... 58
2.2) Les proprits d'une classe drive ........................................................................... 59
2.3) Les mthodes d'une classe drive ............................................................................ 60
III. MANIPULATIONS D'OBJETS ISSUS DE CLASSE MERE ET FILLE ........................................... 61
___________________________________________________________________
DI GALLO Frdric Page 54 27/11/2017
Document1
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;
// Mthode qui renvoie sous la forme d'une chane de caractres toutes les caractristiques du produit
public String InfosQ
{ retum (Reference + + Designation + + PrixVente HT);
}
___________________________________________________________________
DI GALLO Frdric Page 55 27/11/2017
Document1
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
Rfrence
NomFournisseur
Dsignation
PrixAchatHT
PrixVenteHT
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 56 27/11/2017
Document1
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
}
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.
P1 Rfrence
Dsignation
PrixVenteHT
NomFournisseur
PrixAchatHT
___________________________________________________________________
DI GALLO Frdric Page 57 27/11/2017
Document1
___________________________________________________________________
DI GALLO Frdric Page 58 27/11/2017
Document1
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
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 59 27/11/2017
Document1
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.
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.
// 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);
}
}
n
Remarque: la mthode Infos est construite partir du code de la mthode Infos dfinie
___________________________________________________________________
DI GALLO Frdric Page 60 27/11/2017
Document1
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.
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 61 27/11/2017
Document1
class TestCompte
{ public static void main (String args[])
{ Compte C1,C2,C3;
CompteEpargne CEI ,CE2;
CEl = new CompteEpargne (1, 0.035f); // sinon il le considre un double
Cl = new Compte (2,'C');
CE2 = new CompteEpargne (3,0.04f); // sinon il le considre un double
C2 = CEl ;
C3 = CE2 ;
Cl .Crediter(100);
C2.Crediter(l00);
((CompteEpargne)C2).AjouterInterets();
Cl.AfficherInfos();
C2.Afficherlnfos(); // polymorphisme
C3.Afficherlnfos();
}
}
class Facture
{ private static float TauxTVA=0.206f;
private int NoFacture;
private float MontantHT;
public int SonNumero()
{ return (NoFacture);
}
}
___________________________________________________________________
DI GALLO Frdric Page 62 27/11/2017
Document1
Partie n0 2: Pour construire la classe ListeFactures destine grer une liste des factures
on envisage les deux implantations suivantes:
Solution 1 Solution 2
class ListeFactures importjava.util.Vector
{ private Facture [] T; class ListeFactures
private int Nb; { private Vector V;
public ListeFactures O public ListeFactures()
{ T = new Facture [50]; { V = new Vector();
Nb=0; }
} public void AjouterUneFacture (Facture F)
public void AjouterUneFacture (Facture F) { V.add (F);
{ T[Nb] = F; }
Nb ++;
}
___________________________________________________________________
DI GALLO Frdric Page 63 27/11/2017
Document1
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;
}
}
___________________________________________________________________
DI GALLO Frdric Page 64 27/11/2017
Document1
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 65 27/11/2017
Document1
PROGRAMMATION
ORIENTEE
OBJETS :
ANNEXES:
Quelques classes
___________________________________________________________________
DI GALLO Frdric Page 66 27/11/2017
Document1
___________________________________________________________________
DI GALLO Frdric Page 67 27/11/2017
Document1
I. PuissanceDe10
class PuissanceDe10
{ private int Exposant;
public PuissanceDe10 (int E) // on ne met pas de type pour le constructeur.
{ Exposant = E ; }
___________________________________________________________________
DI GALLO Frdric Page 68 27/11/2017
Document1
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; }
}
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 69 27/11/2017
Document1
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]; }
___________________________________________________________________
DI GALLO Frdric Page 70 27/11/2017
Document1
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();
}
}
class Connexion
{ private int Duree;
private float VolumeEntrant;
private float VolumeSortant;
// Accesseurs en consultation qui renvoient la dure, le flux entrant et le flux sortant associs la connexion
public int SaDuree()
{ return (Duree); }
___________________________________________________________________
DI GALLO Frdric Page 71 27/11/2017
Document1
import java.util.*;
class ListeConnexions
{ private Vector Vect;
public ListeConnexions() // Constructeur de la classe ListeConnexions
{Vect = new Vector(); }
// 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); }
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 72 27/11/2017
Document1
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();
}
}
// Mthode qui renvoie sous la forme d'une chane de caractres toutes les caractristiques du produit
public String InfosQ
{ retum (Reference + + Designation + + PrixVente HT);
}
___________________________________________________________________
DI GALLO Frdric Page 73 27/11/2017
Document1
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);
}
___________________________________________________________________
DI GALLO Frdric Page 74 27/11/2017
Document1
class TestCompte
{ public static void main (String args[])
{ Compte C1,C2,C3;
CompteEpargne CEI ,CE2;
CEl = new CompteEpargne (1, 0.035f); // sinon il le considre un double
Cl = new Compte (2,'C');
CE2 = new CompteEpargne (3,0.04f); // sinon il le considre un double
C2 = CEl ;
C3 = CE2 ;
Cl .Crediter(100);
C2.Crediter(l00);
((CompteEpargne)C2).AjouterInterets();
Cl.AfficherInfos();
C2.Afficherlnfos(); // polymorphisme
C3.Afficherlnfos();
}
}
___________________________________________________________________
DI GALLO Frdric Page 75 27/11/2017
Document1
class Facture
{ private static float TauxTVA=0.206f;
private int NoFacture;
private float MontantHT;
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());
}
}
{ private Facture [] T;
private int Nb;
public ListeFactures()
{ T = new Facture[50]; Nb=0; }
import java.util.Vector;
class ListeFactures
{ private Vector V;
public ListeFactures()
{ V = new Vector(); }
___________________________________________________________________
DI GALLO Frdric Page 77 27/11/2017
Document1
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());
}
}
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 78 27/11/2017