Vous êtes sur la page 1sur 87

POO Java : Par MR YOUSSFI

Programmation Oriente Objet Java


M.Youssfi

Diffrents types de langage de programmation


Ordinateur CPU

Langage Machine Langage Assembleur Langages structurs: - Pascal, C Langages Orients Objet - C++, Java .

Homme

Langage humains

POO Java : Par MR YOUSSFI

Quest ce que java?


Langage de programmation orient objet (Classe, Objet, Hritage, Encapsulation et Polymorphisme) Avec java on peut crer des application multiplateformes. Les applications java sont portables. Cest--dire, on peut crer une application java dans une plateforme donne et on peut lexcuter sur nimporte quelle autre plateforme. Le principe de java est : Write Once Run Every Where Open source: On peut rcuprer le code source de java. Ce qui permet aux dveloppeurs, en cas de besoin, de dvelopper ou modifier des fonctionnalits de java.

Quest ce que java?


Java est utilis pour crer :
Des applications Desktop Des applets java (applications java destines sexcuter dans une page web) Des applications pour les smart phones Des applications embarques dans des cartes puces Des application JEE (Java Entreprise Edition)

Pour crer une application java, il faut installer un kit de dveloppement java
JSDK : Java Standard Developpement Kit, pour dvelopper les application DeskTop JME : Java Mobile Edition, pour dvelopper les applications pour les tlphones potables JEE : Java Entreprise Edition, pour dvelopper les applications qui vont sexcuter dans un serveur dapplication JEE (Web Sphere Web Logic, JBoss). JCA : Java Card Editon, pour dvelopper les applications qui vont sxcuter dans des cartes puces.

POO Java : Par MR YOUSSFI

Diffrents modes de compilation


Java est un langage compil et interprt Compilation en mode natif Compilation Byte Code Compilation en mode JIT(Just In Time)

Natif
Code source Compilation Langage Machine Edition de lien Programme.Exe

Byte Code
Code source Compilation Byte Code Interprtation par La JVM en mode byte code (Traduit en code machine et excute instruction par Instruction )

JIT
Code source Compilation Byte Code Interprtation par La JVM en mode JIT (Traduit tout le programme Byte Code en programme machine puis lexcute )
5

Installation de java
Le Kit de dveloppement java JDK peut tre tlcharg gratuitement partir du site de Sun Microsystem son diteur principal (www.java.sun.com). Le JDK contient 3 trois pacquages :

J2Sdk1.6.exe : Kit de dveloppement proprement dit Jre1.6.exe : Machine virtuelle java jdk15-doc.zip : Documentation java Excuter jdk-6u13-windows-i586-p.exe . Le JDK sera install
dans le rpertoire c:\program files\java et installe galement jre1.6 dans le mme dossier.

POO Java : Par MR YOUSSFI

Ce que contient le JDK

Kit de dveloppement java


Les programmes ncessaire au dveloppement java sont placs dans le rpertoire c:\jdk1.5\bin savoir:
javac.exe : Compilateur java. java.exe : Interprteur du bytecode java. appletviewer.exe : Pour tester les applets java. Jdb.exe : Dbogueur java. Javap.exe : dsassembleur du bytecode. Javadoc.exe : Gnrer la documentation de vos programmes java. Javah.exe : Permet de lier des programmes Java avec des mthodes natives, crites dans un autre langage et dpendant du systme. jar.exe : Permet de compresser les classes Java ainsi que tous les fichiers ncessaires l'excution d'un programme (graphiques, sons, etc.). Il permet en particulier d'optimiser le chargement des applets sur Internet. jarsigner.exe : Un utilitaire permettant de signer les fichiers archives produits par jar.exe.
8

POO Java : Par MR YOUSSFI

Configuration de l environnement
La configuration de l'environnement comporte deux aspects : - Dfinir la variable denvironnement path qui indique le chemin d'accs aux programmes excutables : Cette variable path devrait contenir le chemin du JDK utilis:
-

path= C:\Program Files\Java\jdk1.6.0_13\bin; ..

Quand elle excute une application java, la JVM consulte la variable denvironnement classpath qui contient le chemin daccs aux classes java utilises par cette application.
-

classpath= .; c:\monProjet\lib; c:\programmation

Configurer la variable denvironnement path sous windows

10

POO Java : Par MR YOUSSFI

Outils de dveloppement java


Un Editeur de texte ASCII: on peut utiliser un simple diteur comme notepad de windows mais il est prfrable d utiliser un diteur conu pour la programmation java exemples: Ultraedit, JCreator, . Eclipse est lenvironnement de dveloppement java le plus prfr pour les dveloppeur java. Il est gratuit et cest un environnement ouvert. Autres IDE java :
JDevlopper de Oracle. JBuilder de Borland.

11

Premier programme java


Remarques: Le nom du fichier java doit tre le mme que celui de la classe qui contient la fonction principale main. Pour compiler le programme source, il faut faire appel au programme javac.exe qui se trouve dans le dossier c:\jdk1.2\bin. Pour rendre accessible ce programme depuis n importe quel rpertoire, il faut ajouter la commande : path c:\jdk1.2\bin dans le fichier autoexec.bat. Aprs compilation du programme PremierProgramme.java, il y a gnration du fichier PremierProgramme.class qui reprsente le ByteCode de programme. Pour excuter ce programme en byte code, il faut faire appel au programme java.exe qui reprsente l interprter du bytecode.

12

POO Java : Par MR YOUSSFI

Premier programme java


public class PremierProgramme { public static void main(String[] args) { System.out.println("First Test"); } }
Lancer un diteur de texte ASCII et Ecrire le code source de ce programme. Enregistrer ce fichier dans un nouveau rpertoire c:\exojava sous le nom PremierProgramme.java Compiler ce programme sur ligne de commande Dos :

c:\exojava>javac PremierProgramme.java
Corriger les Erreurs de compilation Excuter le programme sur ligne de commande

c:\exojava>java PremierProgramme

13

Premire Application graphique


import javax.swing.*; import java.awt.FlowLayout; public class FirstGraphicApp { public static void main(String[] args) { // Crer une nouvelle fentre JFrame jf=new JFrame("Titre"); //Crer les composants graphiques JLabel l=new JLabel("Nom:"); JTextField t=new JTextField(12); JButton b=new JButton("OK"); //Dfinir une technique de mise en page jf.setLayout(new FlowLayout()); //Ajouter les composants la fentre jf.add(l);jf.add(t);jf.add(b); //Dfinir les dimensions de la fentre jf.setBounds(10, 10, 400, 400); //Afficher la fentre jf.setVisible(true); } }
14

POO Java : Par MR YOUSSFI

Premire Applet
import java.applet.Applet; import java.awt.*; public class FirstApplet extends Applet{ public void init(){ add(new Label("Nom:")); add(new TextField(12)); add(new List()); add(new Button("OK")); } public void paint(Graphics g) { g.drawRect(2, 2, 400, 300); } }

Rdiger le programme source. Enregistrer le fichier sous le nom FirstApplet.java Compiler le programme source et corriger les erreurs. Crer un page HTML qui affiche l applet sur un navigateur web:
<html> <body> <applet code= FirstApplet.class" width="500" height="500"></applet> </body> </html>

Vous pouvez galement AppletViewer.exe pour tester l applet :


C:\exojava>appletviewer page.htm
15

Deuxime Applet avec Gestion des vnements


import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class DeuxiemeApplet extends Applet implements ActionListener { // Dclarer etcrer les composants graphiques Label lNom=new Label("Nom:"); TextField tNom=new TextField(12); List listNoms=new List(); Button b=new Button("OK"); // Initialisation de l'applet public void init() { // Ajouter les composants l'applet add(lNom);add(tNom);add(listNoms);add(b); // En cliquant sur le bouton b le gestionnaire // des vnnements actionPerformed s'excute b.addActionListener(this); } //Mthode qui permet de grer les vnements public void actionPerformed(ActionEvent e) { if(e.getSource()==b){ // Lire le contenu de la zone de texte String nom=tNom.getText(); // Ajouter ce contenu dans la liste listNoms.add(nom); } } }
16

POO Java : Par MR YOUSSFI

Structures fondamentales du langage java

17

Structure du langage java


Au niveau syntaxe, Java est un langage de programmation qui ressemble beaucoup au langage c++ Toute fois quelques simplifications ont t apportes java pour des raisons de scurit et doptimisation. Dans cette partie nous ferons une prsentation succincte des types primitifs, les enveloppeurs, dclarations des variables, le casting des primitives, les oprateurs arithmtiques et logiques, les structures de contrle (if, swich, for et while)
18

POO Java : Par MR YOUSSFI

Les primitives
Java dispose des primitives suivantes :
Primitive
char byte short int long float double boolean void

tendue
0 65 535 -128 +127 -32 768 +32 767 -2 147 483 648 + 2 147 483 647 de 1.4E-45 3.40282347E38 true ou false -

Taille
16 bits 8 bits 16 bits 32 bits 64 bits 32 bits 64 bits 1 bit 0 bit

19

Utilisation des primitives


Les primitives sont utilises de faon trs simple. Elles doivent tre dclares, tout comme les handles d'objets, avec une syntaxe similaire, par exemple :

int i; char c; boolean fini;


Les primitives peuvent tre initialises en mme temps que la dclaration.
int i = 12; char c = 'a'; boolean fini = true;
20

10

POO Java : Par MR YOUSSFI

Utilisation des primitives


Comment choisir le nom dune variable:
Pour respecter la typologie de java, les nom des variables commencent toujours par un caractre en minuscule et pour indiquer un sparateur de mots,on utilise les majuscules. Exemples: int nbPersonnes; String nomPersonne;

Valeurs par dfaut des primitives:


Toutes les primitives de type numrique utilises comme membres d'un objet sont initialises la valeur 0. Le type boolean est initialis la valeur false.

21

Casting des primitives


Le casting des primitives
Le casting (mot anglais qui signifie moulage), galement appel cast ou, parfois, transtypage, consiste effectuer une conversion d'un type vers un autre type. Le casting peut tre effectu dans deux conditions diffrentes
Vers un type plus gnral. On parle alors de sur-casting ou de sur-typage. Vers un type plus particulier. On parle alors de souscasting ou de sous-typage.

22

11

POO Java : Par MR YOUSSFI

Casting des primitives


Sur-casting : Le sur-casting peut se faire implicitement ou explicitement.
Exemples :
int a=6; // le type int est cod sur 32 bits long b; // le type long est cod sur 64 bits
Casting implicite : b=a; Casting explicite b=(long)a;

Sous-Casting : Le sous-casting ne peut se faire quexplicitement.


1: float a = (float)5.5; 2 : double c = (double)a; 4 : int d = 8; 5 : byte f = (byte)d;

23

Les enveloppeurs (wearpers)


Les primitives sont enveloppes dans des objets appels enveloppeurs (Wearpers ). Les enveloppeurs sont des classe
Classe Character Byte Short Integer Long Float Double Boolean Void BigInteger BigDecimal Primitive char byte short int long float double boolean 24

12

POO Java : Par MR YOUSSFI

Utilisation des primitives et enveloppeurs


Exemple:
double v1=5.5; // v1 est une primitive Double v2=new Double(5.6); // v2 est un objet long a=5; // a est une primitive Long b=new Long(5); // b est un objet Long c= 5L; // c est un objet System.out.println("a="+a); System.out.println("b="+b.longValue()); System.out.println("c="+c.byteValue()); System.out.println("V1="+v1); System.out.println("V2="+v2.intValue());

Rsultat:
a=5 b=5 c=5 V1=5.5 V2=5

25

Oprateurs
Oprateur d affectation:

x=3; // x reoit 3 x=y=z=w+5; // z reoit w+5, y reoit z et x reoit y


+ : addition - : soustraction * : multiplication / : division % : modulo (reste de la division euclidienne)

Les oprateurs arithmtiques deux oprandes:


26

13

POO Java : Par MR YOUSSFI

Oprateurs
Les oprateurs arithmtiques deux oprandes
(Les raccourcis)
x = x + 4; ou x+=4; z = z * y; ou Z*=y; v = v % w; ou v%=w;

Les oprateurs relationnels:


== < > <= >= !=

: quivalent : plus petit que : plus grand que : plus petit ou gal : plus grand ou gal : non quivalent

Les oprateurs dcrmentation:

dincrmentations

et

de

++ : Pour incrmenter (i++ ou ++i) -- : Pour dcrmenter (i- ou --i)

27

Oprateurs
Les oprateurs logiques
&& Et (deux oprandes) || Ou (deux oprandes ) ! Non (un seul oprande)

L'oprateur trois oprandes ?:


condition ? expression_si_vrai : expression_si_faux exemple : x = (y < 5) ? 4 * y : 2 * y;
Equivalent : if (y < 5) x = 4 * y; else x = 2 * y;

28

14

POO Java : Par MR YOUSSFI

Structures de contrle
L'instruction conditionnelle if
La syntaxe de l'instruction if peut tre dcrite de la faon suivante:
if (expression) instruction; ou : if (expression) { instruction1; instruction2; }

L'instruction conditionnelle else


if (expression) { instruction1; } else { instruction2; }

29

Structures de contrle
Les instructions conditionnelles imbriques
Java permet d'crire ce type de structure sous la forme :
if (expression1) { bloc1; } else if (expression2) { bloc2; } else if (expression3) { bloc3; } else { bloc5; }

30

15

POO Java : Par MR YOUSSFI

Structures de contrle:

L'instruction switch
Syntaxe : switch( variable) { case valeur1: instr1;break; case valeur2: instr2;break; case valeurN: instrN;break; default: instr;break; }

Exemple:

import java.util.Scanner; public class Test { public static void main(String[] args) { System.out.print("Donner un nombre:"); Scanner clavier=new Scanner(System.in); int nb=clavier.nextInt(); switch(nb){ case 1 : System.out.println("Lundi");break; case 2 : System.out.println("Mardi");break; case 3 : System.out.println("Mercredi");break; default :System.out.println("Autrement");break; }}}

31

Structures de contrle
La boucle for
La boucle for est une structure employe pour excuter un bloc d'instructions un nombre de fois en principe connu l'avance. Elle utilise la syntaxe suivante : for (initialisation;test;incrmentation) { instructions; } Exemple : for (int i = 2; i < 10;i++) { System.out.println("I="+i); }

32

16

POO Java : Par MR YOUSSFI

Structures de contrle
Sortie d'une boucle par return
int[] tab=new int[]{4,6,5,8}; for (int i = 0; i < tab.length; i++) { if (tab[i] == 5) { return i; }

Branchement au moyen des instructions break et continue


break:
int x = 10; for (int i = 0; i < 10; i++) { x--; if (x == 5) break; } System.out.println(x);

continue:
for (int i = 0; i < 10; i++) { if (i == 5) continue; System.out.println(i); }
33

Structures de contrle
L instruction While
while (condition){ BlocInstructions; }

Exemple :
int s=0;int i=0; while (i<10){ s+=i; i++; } System.out.println("Somme="+s);

L instruction do .. while
do{ BlocInstructions; } while (condition);

Exemple : int s=0;int i=0; do{ s+=i; i++; }while (i<10); System.out.println("Somme="+s);

34

17

POO Java : Par MR YOUSSFI

Mthode oriente objet


La mthode oriente objet permet de concevoir une application sous la forme d'un ensemble d'objets relis entre eux par des relations Lorsque que l'on programme avec cette mthode, la premire question que lon se pose plus souvent est :

qu'est-ce que je manipule ? , Au lieu de qu'est-ce que je fait ? .


L'une des caractristiques de cette mthode permet de concevoir de nouveaux objets partir d'objets existants. On peut donc rutiliser les objets dans plusieurs applications. La rutilisation du code fut un argument dterminant pour venter les avantages des langages objets. Pour faire la programmation oriente objet il faut connatre les concepts suivant Objet et classe Hritage Encapsulation (Accessibilit) Polymorphisme

35

Objet
Un objet est une structure informatique dfinie par un tat et un comportement Objet=tat + comportement
Ltat regroupe les valeurs instantanes de tous les attributs de lobjet. Le comportement regroupe toutes les comptences et dcrit les actions et les ractions de lobjet. Autrement dit le comportement est dfini par les oprations que lobjet peut effectuer.

Ltat dun objet peut changer dans le temps. Gnralement, cest le comportement qui modifie ltat de lobjet Exemples:
v1:Voiture
Couleur="rouge" Carburant=20 Puissance=120 demarrer() accelerer() Freiner()

:Fenetre
titre="WinWord"

tat de lobjet

largeur=400 hauteur=300 Deplacer()

Comportement

agrandir() fermer()
36

18

POO Java : Par MR YOUSSFI

Identit dun objet


En plus de son tat, un objet possde une identit qui caractrise son existence propre. Cette identit sappelle galement rfrence ou handle de lobjet En terme informatique de bas niveau, lidentit dun objet reprsente son adresse mmoire. Deux objets ne peuvent pas avoir la mme identit: cest--dire que deux objet ne peuvent pas avoir le mme emplacement mmoire.

37

Classes
Les objets qui ont des caractristiques communes sont regroups dans une entit appel classe. La classe dcrit le domaine de dfinition dun ensemble dobjets. Chaque objet appartient une classe Les gnralits sont contenues dans les classe et les particularits dans les objets. Les objets informatique sont construits partir de leur classe par un processus qui sappelle linstanciation. Tout objet est une instance dune classe.
38

19

POO Java : Par MR YOUSSFI

Caractristique dune classe


Une classe est dfinit par:
Les attributs Les mthodes

Les attributs permettent de dcrire ltat de des objets de cette classe.


Chaque attribut est dfini par:
Son nom Son type ventuellement sa valeur initiale

Les mthodes permettent de dcrire le comportement des objets de cette classe.


Une mthode reprsente une procdure ou une fonction qui permet dexcuter un certain nombre dinstructions.

Parmi les mthode dune classe, existe deux mthodes particulires:


Une mthode qui est appele au moment de la cration dun objet de cette classe. Cette mthode est appele CONSTRUCTEUR Une mthode qui est appele au moment de la destruction dun objet. Cette mthode sappelle le DESTRUCTEUR
39

Reprsentation UML dune classe


Une classe est reprsent par un rectangle 3 compartiments:
Un compartiment qui contient le nom de la classe Un compartiment qui contient la dclaration des attributs Un compartiment qui contient les mthodes

Exemples:
Compte
code : int solde : float Compte(float soldeInitial) verser(float mt):void retirer(float mt):void getSolde():float
40

Nom de la classe Attributs Mthodes Ou Oprations

20

POO Java : Par MR YOUSSFI

Les classes sont stockes dans des packages


Les packages offrent un mcanisme gnral pour la partition des modles et le regroupement des lments de la modlisation Chaque package est reprsent graphiquement par un dossier Les packages divisent et organisent les modles de la mme manire que les dossier organisent le systme de fichier

Nom du paquetage

41

Accessibilit au membres dune classe


Dans java, il existe 4 niveaux de protection :
private (-) : Un membre priv dune classe nest accessible qu lintrieur de cette classe. protected (#) : un membre protg dune classe est accessible :
Lintrieur de cette classe Aux classes drives de cette classe. Aux classes du mme package.

public (+) : accs partir de toute entit interne ou externe la classe Autorisation par dfaut : dans java, en labsence des trois autorisations prcdentes, lautorisation par dfaut est package. Cette autorisation indique que uniquement les classes du mme package ont lautorisation daccs.
42

21

POO Java : Par MR YOUSSFI

Exemple dimplmentation dune classe package metier; avec Java public class Compte {
metier
Compte
- code : int # solde : float + Compte(int code, float solde) + verser(float mt):void + retirer(float mt):void + toString():String

// Attributs private int code; protected float solde; // Constructeur public Compte(int c,float s){ code=c; solde=s; } // Mthode pour verser un montant public void verser(float mt){ solde+=mt; } // Mthode pour retirer un montant public void retirer(float mt){ solde-=mt; } // Une mthode qui retourne l'tat du compte public String toString(){ return(" Code="+code+" Solde="+solde); } } 43

Cration des objets dans java


Dans java, pour crer un objet dune classe , On utilise la commande new suivie du constructeur de la classe. La commande new Cre un objet dans lespace mmoire et retourne ladresse mmoire de celui-ci. Cette adresse mmoire devrait tre affecte une variable qui reprsente lidentit de lobjet. Cette rfrence est appele handle.
package test; import metier.Compte; public class Application { public static void main(String[] args) {

c1:Compte
code=1 Code=1 solde=6000 Solde=8000 Solde=5000 verser(float mt) retirer(float mt) toString()

Compte c1=new Compte(1,5000); Compte c2=new Compte(2,6000); c1.verser(3000); c1.retirer(2000); System.out.println(c1.toString());


} }

c2:Compte
code=2 solde=6000 verser(float mt)

Code=1 Solde= 6000

retirer(float mt) toString()


44

22

POO Java : Par MR YOUSSFI

Constructeur par dfaut


Quand on ne dfinit aucun constructeur pour une classe, le compilateur cre le constructeur par dfaut. Le constructeur par dfaut na aucun paramtre et ne fait aucune initialisation
Exemple de classe :
public class Personne { // Les Attributs private int code; private String nom; // Les Mthodes public void setNom(String n){ this.nom=n; } public String getNom(){ return nom; } }

Instanciation en utilisant le d constructeur par dfaut :


Personne p=new Personne(); p.setNom("AZER"); System.out.println(p.getNom());

45

Getters et Setters
Les attributs privs dune classe ne sont accessibles qu lintrieur de la classe. Pour donner la possibilit dautres classes daccder aux membres privs, il faut dfinir dans la classes des mthodes publiques qui permettent de :
lire la variables privs. Ce genre de mthodes sappellent les accesseurs ou Getters modifier les variables privs. Ce genre de mthodes sappellent les mutateurs ou Setters

Les getters sont des mthodes qui commencent toujours par le mot get et finissent par le nom de lattribut en crivant en majuscule la lettre qui vient juste aprs le get. Les getters retourne toujours le mme type que lattribut correspondant.
Par exemple, dans la classe CompteSimple, nous avons dfini un attribut priv : private String nom; Le getter de cette variable est :
public String getNom( ){ return nom; }

Les setters sont des mthodes qui commencent toujours par le mot set et finissent par le nom de lattribut en crivant en majuscule la lettre qui vient juste aprs le set. Les setters sont toujours de type void et reoivent un paramtre qui est de meme type que la variable:
Exemple:
public void setNom( String n ){ this.nom=n; }
46

23

POO Java : Par MR YOUSSFI

Encapsulation
public class Application { public static void main(String[] args) { Personne p=new Personne(); p.setNom("AZER"); System.out.println(p.getNom()); } }
:Application Comportement Etat p.getNom() p:Personne Comportement Etat
tCo de

Diagramme de squence :
:Application crer() p1:Personne setNom("AZER") getNom()

g e tN om()

Code = 1 nom=AZER

in

ma

p.seNom("AZER")

setNom()

Gnralement, ltat dun objet est priv ou protg et son comportement est publique Quand ltat de lobjet est priv Seules les mthode de ses qui ont le droit dy accder Quand ltat de lobjet est protg, les mthodes des classes drives et les classes appartenant au mme package peuvent galement y accder
47

Membres statiques dune classe.


Dans lexemple de la classe Compte, chaque objet Compte possde ses propres variables code et solde. Les variables code et solde sont appeles variables dinstances. Les objets dune mme classe peuvent partager des mmes variables qui sont stockes au niveau de la classe. Ce genre de variables, sappellent les variables statiques ou variables de classes. Un attribut statique dune classe est un attribut qui appartient la classe et partag par tous les objets de cette classe. Comme un attribut une mthode peut tre dclare statique, ce qui signifie quelle appartient la classe et partage par toutes les instances de cette classe. Dans la notation UML, les membres statiques dune classe sont souligns.

ge

Retourne AZER

()

48

24

POO Java : Par MR YOUSSFI

Exemple:

Supposant nous voulions ajouter la classe Compte une variable qui permet de stocker le nombre le comptes crs. Comme la valeur de variable nbComptes est la mme pour tous les objets, celle-ci sera dclare statique. Si non, elle sera duplique dans chaque nouveau objet cr. La valeur de nbComptes est au dpart initialise 0, et pendant la cration dune nouvelle instance (au niveau du constructeur), nbCompte est incrmente et on profite de la valeur de nbComptes pour initialiser le code du compte.

Compte
- code : int # solde : float - nbComptes:int + Compte(float solde) + verser(float mt):void + retirer(float mt):void + toString():String + getNbComptes():int

package metier; public class Compte { // Variables dinstances private int code; private float solde; // Variable de classe ou statique private static int nbComptes; public Compte(float solde){ this.code=++nbComptes; this.solde=solde; } // Mthode pour verser un montant public void verser(float mt){ solde+=mt; } // Mthode pour retirer un montant public void retirer(float mt){ solde-=mt; } // retourne l'tat du compte public String toString(){ return(" Code="+code+" Solde="+solde); } // retourne la valeur de nbComptes public static int getNbComptes(){ return(nbComptes); } }
49

Application de test
package test; import metier.Compte; public class Application { public static void main(String[] args) {

Classe Compte
nbCompte=0 nbCompte=2 nbCompte=1

getNbComptes()

Compte c1=new Compte(5000); Compte c2=new Compte(6000); c1.verser(3000); c1.retirer(2000); System.out.println(c1.toString());

c1:Compte
code=1 Code=1 solde=6000 Solde=8000 Solde=5000 verser(float mt) retirer(float mt) toString()

c2:Compte
code=2 solde=6000 verser(float mt) retirer(float mt) toString()

System.out.println(Compte.nbComptes) System.out.println(c1.nbComptes)
} }

Code=1 Solde= 6000 2 2

50

25

POO Java : Par MR YOUSSFI

Destruction des objets : Garbage Collector


Dans certains langages de programmation, le programmeur doit s occuper lui mme de dtruire les objets inutilisables. Java dtruit automatiquement tous les objets inutilisables en utilisant ce qu on appelle le garbage collector (ramasseur d ordures). Qui s excute automatiquement ds que la mmoire disponible est infrieure un certain seuil. Tous les objets qui ne sont pas retenus par des handles seront dtruits. Ce phnomne ralenti parfois le fonctionnement de java. Pour signaler au garbage collector que vous vouler dtruire un objet dune classe, vous pouvez faire appel la mthode finalize() redfinie dans la classe.
51

Exercice 1 : Modlisation dun segment


extr1 extr2

On souhaite crer une application qui permet de manipuler des segments. Un segment est dfini par la valeur de ses deux extrmits extr1 et extr2. Pour crer un segment, il faut prciser les valeurs de extr1 et extr2. Les oprations que lon souhaite excuter sur le segment sont :
ordonne() : mthode qui permet dordonner extr1 et extr2 si extr1 est suprieur extr2 getLongueur() : mthode qui retourne la longueur du segment. appartient(int x) : retourne si x appartient au segment ou non. toString() : retourne une chane de caractres de type SEGMENT[extr1,extr2]

Faire une reprsentation UML de la classe Segment. Implmenter en java la classe Segment Crer une application TestSegment qui permet de :
Crer objet de la classe Segment avec les valeurs extr1=24 et extr2=12. Afficher ltat de cet objet en utilisant la mthode toString(). Afficher la longueur de ce segment. Afficher si le point x=15, appartient ce segment. Changer les valeurs des deux extrmits de ce segment. Afficher nouveau la longueur du segment.
52

26

POO Java : Par MR YOUSSFI

Diagramme de classes
Segment
+ extr1 : int + extr2 : int + Segment (int e1,int e2) + ordonne() + getLongueur() : int + appartient(int x) : boolean + toString() : String + main(String[] args):void

TestSegment

53

Solution : Segment.java

package fig; public class Segment { public int extr1; public int extr2; // Constructeur public Segment(int a,int b){ extr1=a;extr2=b;ordonne(); } public void ordonne(){ if(extr1>extr2){ int z=extr1; extr1=extr2; extr2=z; } } public int getLongueur(){ return(extr2-extr1); } public boolean appartient(int x){ if((x>extr1)&&(x<extr2)) return true; else return false; } public String toString(){ return ("segment["+extr1+","+extr2+"]"); } }

54

27

POO Java : Par MR YOUSSFI

Application

package test; import java.util.Scanner; import fig.Segment; public class Application { public static void main(String[] args) { Scanner clavier=new Scanner(System.in); System.out.print("Donner Extr1:");int e1=clavier.nextInt(); System.out.print("Donner Extr2:");int e2=clavier.nextInt(); Segment s=new Segment(e1, e2); System.out.println("Longueur du"+s.toString()+" est :"+ s.getLongueur()); System.out.print("Donner X:");int x=clavier.nextInt(); if(s.appartient(x)==true) System.out.println(x+" Appartient au "+s); else System.out.println(x+" N'appartien pas au "+s); } }
55

Donner Extr1:67 Donner Extr2:13 Longueur dusegment[13,67] est :54 Donner X:7 7 N'appartient pas au segment[13,67]

Excution de la classe TestSegment


Pour excuter une application (Classe qui contient la mthode main) avec Eclipse, on clique avec le bouton droit de la souris sur la classe, puis on choisit dans le menu contextuel, Run As > Java Application

Donner Extr1:67 Donner Extr2:13 Longueur dusegment[13,67] est :54 Donner X:7 7 N'appartient pas au segment[13,67]

56

28

POO Java : Par MR YOUSSFI

Exercice 2
P(x,y)

Une cercle est dfini par :


Un point qui reprsente son centre : centre(x,y) et un rayon.
R C(x,y)

On peut crer un cercle de deux manires :


Soit en prcisant son centre et un point du cercle. Soit en prcisant son centre et son rayon

Les oprations que lon souhaite excuter sur un cercle sont :


getPerimetre() : retourne le primtre du cercle getSurface() : retourne la surface du cercle. appartient(Point p) : retourne si le point p appartient ou non lintrieur du cercle. toString() : retourne une chane de caractres de type CERCLE(x,y,R)
1. 2.

Etablir le diagramme de classes Crer les classe Point dfinie par:


Les attributs x et y de type int Un constructeur qui initialise les valeurs de x et y. Une mthode toString().

3. 4.

Crer la classe Cercle Crer une application qui permet de :


a. b. c. d.

Crer un cercle dfini par le centre c(100,100) et un point p(200,200) Crer un cercle dfini par le centre c(130,100) et de rayon r=40 Afficher le primtre et le rayon des deux cercles. Afficher si le point p(120,100) appartient lintersection des deux cercles ou non.
57

Hritage et accessibilit

M.Youssfi

29

POO Java : Par MR YOUSSFI

Hritage
Dans la programmation oriente objet, lhritage offre un moyen trs efficace qui permet la rutilisation du code. En effet une classe peut hriter dune autre classe des attributs et des mthodes. Lhritage, quand il peut tre exploit, fait gagner beaucoup de temps en terme de dveloppement et en terme de maintenance des applications. La rutilisation du code fut un argument dterminant pour venter les mthodes orientes objets.
59

Exemple de problme
Supposons que nous souhaitions crer une application qui permet de manipuler diffrents types de comptes bancaires: les compte simple, les comptes pargnes et les comptes payants. Tous les types de comptes sont caractriser par:
Un code et un solde Lors de la cration dun compte, son code qui est dfini automatiquement en fonction du nombre de comptes crs; Un compte peut subir les oprations de versement et de retrait. Pour ces deux oprations, il faut connatre le montant de lopration. Pour consulter un compte on peut faire appel sa mthode toString()

Un compte simple est un compte qui possde un dcouvert. Ce qui signifie que ce compte peut tre dbiteur jusqu la valeur du dcouvert. Un compte Epargne est un compte bancaire qui possde en plus un champ tauxIntert et une mthode calculIntrt() qui permet de mettre jour le solde en tenant compte des interts. Un ComptePayant est un compte bancaire pour lequel chaque opration de retrait et de versement est payante et vaut 5 % du montant de lopration.

60

30

POO Java : Par MR YOUSSFI

Diagramme de classes
Compte
- code : int # solde : float - nbComptes : int + Compte ( ) + verser (float mt) : void + retirer (float mt) : void + toString() : String

CompteSimple
- decouvert : float + CompteSimple (float dec) + retirer (float mt) : void + toString() : String

CompteEpargne
- taux : float + CompteEparge (float taux) + catculInterets () : void + toString() : String

ComptePayant
+ ComptePayant ( ) + verser (float mt) : void + retirer (float mt) : void + toString() : String

61

Implmentation java de la classe Compte


public class Compte { private int code; protected float solde; private static int nbComptes; public Compte( ){ ++nbComptes; code=nbComptes; this.solde=0; } public void verser(float mt){ solde+=mt; } public void retirer(float mt){ if(mt<solde) solde-=mt; } public String toString(){ return("Code="+code+" Solde="+solde); } }
62

31

POO Java : Par MR YOUSSFI

Hritage : extends
La classe CompteSimple est une classe qui hrite de la classe Compte. Pour dsigner lhritage dans java, on utilise le mot extends public class CompteSimple extends Compte { } La classe CompteSimple hrite de la classe CompteBancaire tout ses membres sauf le constructeur. Dans java une classe hrite toujours dune seule classe. Si une classe nhrite pas explicitement dune autre classe, elle hrite implicitement de la classe Object. La classe Compte hrite de la classe Object. La classe CompteSimple hrite directement de la classe Compte et indirectement de la classe Object.
63

Dfinir les constructeur de la classe drive


Le constructeur de la classe drive peut faire appel au constructeur de la classe parente en utilisant le mot super() suivi de ses paramtres.
public class CompteSimple extends Compte { private float decouvert;

//constructeur
public CompteSimple(float decouvert){ super(); this.decouvert=decouvert; } }

64

32

POO Java : Par MR YOUSSFI

Redfinition des mthodes


Quand une classe hrite dune autre classe, elle peut redfinir les mthodes hrites. Dans notre cas la classe CompteSimple hrite de la classe Compte la mthode retirer(). nous avons besoin de redfinir cette mthode pour prendre en considration la valeur du dcouvert.
public class CompteSimple extends Compte { private float decouvert; // constructeur public CompteSimple(float decouvert){ super(); this.decouvert=decouvert; } // Redfinition de la mthode retirer public void retirer(float mt) { if(mt-decouvert<=solde) solde-=mt; } }

65

Redfinition des mthodes


Dans la mthode redfinie de la nouvelle classe drive, on peut faire appel la mthode de la classe parente en utilisant le mot super suivi dun point et du nom de la mthode Dans cette nouvelle classe drive, nous allons redfinir galement la mthode toString().
public class CompteSimple extends Compte { private float decouvert; // constructeur // Redfinition de la mthode retirer
public void retirer(float mt) { if(mt+decouvert>solde) solde-=mt; }

// Redfinition de la mthode toString public String toString() { return("Compte Simple "+super.toString()+" Dcouvert="+decouvert); } }
66

33

POO Java : Par MR YOUSSFI

Hritage la loupe : Instanciation


Quand on cre une instance dune classe, la classe parente est automatiquement instancie et lobjet de la classe parente est associ lobjet cr travers la rfrence super injecte par le compilateur
CompteSimple cs=new CompteSimple(5000);
: Compte
- code=1 - solde=0 + verser() + retirer() + toString()

Lors de linstanciation, lhritage entre les classes est traduit par une composition entre un objet de la classe instancie et dun objet de la classe parente qui est cr implicitement.

cs : CompteSimple
- decouvert=5000 - super = + retirer() + toString()

67

Surcharge
Dans une classe, on peut dfinir plusieurs constructeurs. Chacun ayant une signature diffrentes (paramtres diffrents) On dit que le constructeur est surcharg On peut galement surcharger une mthode. Cela peut dire quon peut dfinir, dans la mme classe plusieurs mthodes qui ont le mme nom et des signatures diffrentes; La signature dune mthode dsigne la liste des arguments avec leurs types. Dans la classe CompteSimple, par exemple, on peut ajouter un autre constructeur sans paramtre Un constructeur peut appeler un autre constructeur de la mme classe en utilisant le mot this() avec des paramtres ventuels

68

34

POO Java : Par MR YOUSSFI

Surcharge de constructeurs
public class CompteSimple extends Compte { private float decouvert;

//Premier constructeur
public CompteSimple(float decouvert){ super(); this.decouvert=decouvert; }

//Deuxime constructeur
public CompteSimple(){ this(0); } }

On peut crer une instance de la classe CompteSimple en faisant appel lun des deux constructeur :
CompteSimple cs1=new CompteSimple(5000); CompteSimple cs2=new CompteSimple();
69

Accessibilit

70

35

POO Java : Par MR YOUSSFI

Accessibilit
Les trois critres permettant d'utiliser une classe sont Qui, Quoi, O. Il faut donc :
Que l'utilisateur soit autoris (Qui). Que le type d'utilisation souhait soit autoris (Quoi). Que l'adresse de la classe soit connue (O).

Pour utiliser donc une classe, il faut :


Connaitre le package ou se trouve la classe (O)
Importer la classe en spcifiant son package.

Quest ce quon peut faire avec cette classe:


Est-ce quon a le droit de linstancier Est-ce quon a le droit dexploiter les membres de ses instances Est-ce quon a le droit dhriter de cette classe. Est-ce quelle contient des membres statiques

Connaitre qui a le droit daccder aux membres de cette instance.


71

Les packages (O)


Nous avons souvent utilis la classe System pour afficher un message : System.out.prinln() , En consultant la documentation de java, nous allons constater que le chemin d accs complet la classe System est java.lang.System. La classe System tant stocke dans le sous dossier lang du dossier java. java.lang.System est le chemin d accs qui prsente la particularit d utiliser un point . comme sparateur. Java.lang qui contient la classe System est appel package

72

36

POO Java : Par MR YOUSSFI

Les packages (O)

73

Les packages (O)


Notion de package: Java dispose d'un mcanisme pour la recherche des classes. Au moment de lexcution, La JVM recherche les classes en priorit :
Dans le rpertoire courant, c'est--dire celui o se trouve la classe appelante, si la variable d'environnement CLASSPATH n'est pas dfinie ; Dans les chemins spcifis par la variable d'environnement CLASSPATH si celle-ci est dfinie.

Linstruction package:
Si vous souhaitez qu'une classe que vous avez cre appartienne un package particulier, vous devez le spcifier explicitement au moyen de l'instruction package, suivie du nom du package. Cette instruction doit tre la premire du fichier. Elle concerne toutes les classes dfinies dans ce fichier.

Linstruction import
Pour utiliser une classe, il faut
Soit crire le nom de la classe prcde par son package. Soit importer cette classe en la dclarant dans la clause import. Et dans ce cas l, seul le nom de la classe suffit pour lutiliser.
74

37

POO Java : Par MR YOUSSFI

Les packages (O)


Application:
package a.b.c; public class Client { private int code; private String nom; public Client(int code, String nom) { this.code = code; this.nom = nom; } public String getNom(){ return(nom); } public int getCode(){ return code; } }

package test; import a.b.c.Client; public class Application { public static void main(String[] args) { Client c=new Client(2,"Salih"); System.out.println("Nom="+c.getNom()); } }

Pour Compiler la classe Client.java sur ligne de commande:


javac -d cheminbin Client.java cheminbin reprsente le dossier des fichiers .class.

75

Les packages (O)


Les fichiers .jar

Les fichiers .jar sont des fichiers compresss comme les fichiers .zip selon un algorithme particulier devenu un standard. Ils sont parfois appels fichiers d'archives ou, plus simplement, archives. Ces fichiers sont produits par des outils de compression tels que Pkzip (sous DOS) ou Winzip (sous Windows), ou encore par jar.exe. Les fichiers .jar peuvent contenir une multitude de fichiers compresss avec l'indication de leur chemin d'accs. Les packages standard de Java sont organiss de cette manire, dans un fichier nomm rt.jar plac dans le sous-rpertoire lib du rpertoire o est install le JDK. Dans le cas d'une installation standard de Java 6 sur le disque C:, le chemin d'accs complet la classe System est donc : c:\jdk1.6\jre\lib\rt.jar\java\lang\System

Cration de vos propres fichiers .jar ou .zip Vous pouvez utiliser le programme jar.exe du jdk pour crer les fichiers .jar Syntaxe : jar [options] nomarchive.jar fichiers Exemple qui permet darchive le contenu du dossier a :

C:\AJ2\TP_ACC\bin> jar cf archive.jar a

76

38

POO Java : Par MR YOUSSFI

Ce qui peut tre fait(Quoi)


Nous avons maintenant fait le tour de la question O ? Pour qu'une classe puisse tre utilise (directement ou par l'intermdiaire d'un de ses membres), il faut non seulement tre capable de la trouver, mais aussi qu'elle soit adapte l'usage que l'on veut en faire. Une classe peut servir plusieurs choses :
Crer des objets, en tant instancie. Crer de nouvelles classes, en tant tendue. On peut utiliser directement ses membres statiques (sans qu'elle soit instancie.) On peut utiliser les membres de ses instances.

Les diffrents modificateurs qui permettent dapporter des restrictions lutilisation dune classe sont:
abstract, final, static, synchronized et native

77

Classe abstraite
Une classe abstraite est une classe qui ne peut pas tre instancie. La classe Compte de notre modle peut tre dclare abstract pour indiquer au compilateur que cette classe ne peut pas tre instanci. Une classe abstraite est gnralement cre pour en faire driver de nouvelle classe par hritage. public abstract class Compte { private int code; protected float solde; private static int nbComptes; // Constructeurs // Mthodes }
78

39

POO Java : Par MR YOUSSFI

Les mthodes abstraites


Une mthode abstraite peut tre dclare lintrieur dune classe abstraite. Une mthode abstraite est une mthode qui na pas de dfinition. Une mthode abstraite est une mthode qui doit tre redfinie dans las classes drives. Exemple :
On peut ajouter la classe Compte une mthode abstraite nomme afficher() pour indiquer que tous les comptes doivent redfinir cette mthode.
79

Les mthodes abstraites


public abstract class Compte { // Membres // Mthode abstraite

public abstract void afficher();


}

public class CompteSimple extends Compte // Membres

public void afficher(){ System.out.println("Solde="+solde+" Dcouvert="+decouvert); }


}
80

40

POO Java : Par MR YOUSSFI

Interfaces
Une interface est une sorte de classe abstraite qui ne contient que des mthodes abstraites. Dans java une classe hrite dune seule classe et peut hriter en mme temps de plusieurs interface. On dit quune classe implmente une ou plusieurs interface. Une interface peut hriter de plusieurs interfaces. Exemple dinterface: public interface Solvable { public void solver(); public double getSole(); } Pour indiquer que la classe CompteSimple implmente cette insterface on peut crire: public class CompteSimple extends Compte implements Solvable { private float decouvert; public void afficher() { System.out.println("Solde="+solde+" Dcouvert="+decouvert); } public double getSole() { return solde; } public void solver() { this.solde=0; 81 }}

Classe de type final


Une classe de type final est une classes qui ne peut pas tre drive. Autrement dit, on ne peut pas hriter dune classe final. La classe CompteSimple peut tre dclare final en crivant:
public final class CompteSimple extends Compte { private float decouvert; public void afficher() { System.out.println("Solde="+solde+" Dcouvert="+decouvert); } }

82

41

POO Java : Par MR YOUSSFI

Variables et mthodes final


Une variable final est une variable dont la valeur ne peut pas changer. Autrement dit, cest une constante:
Exemple : final double PI=3.14;

Une mthode final est une mthode qui ne peut pas tre redfinie dans les classes drives.
Exemple : La mthode verser de la classe suivante ne peut pas tre redfinie dans les classes drives car elle est dclare final
public class Compte { private int code; protected float solde; private static int nbComptes; public final void verser(float mt){ solde+=mt; } public void retirer(float mt){ if(mt<solde) solde-=mt; } }

83

Membres statiques dune classe


Les membres (attributs ou mthodes) dune classes sont des membres qui appartiennent la classe et sont partags par toutes les instances de cette classe. Les membres statiques ne sont pas instancis lors de linstanciation de la classe Les membres statiques sont accessible en utilisant directement le nom de la classe qui les contient. Il nest donc pas ncessaire de crer une instance dune classe pour utiliser les membres statiques. Les membre statiques sont galement accessible via les instances de la classe qui les contient. Exemple dutilisation:
double d=Math.sqrt(9);

Ici nous avons fait appel la mthode sqrt de la classe Math sans crer aucune instance. Ceci est possible car la mthode sqrt est statique. Si cette mthode ntait pas statique, il faut tout dabord crer un objet de la classe Math avant de faire appel cette mthode:
Math m=new Math(); double d=m.sqrt(9);

Les seuls membres dune classe, qui sont accessibles, sans instanciation sont les membres statiques.
84

42

POO Java : Par MR YOUSSFI

Qui peut le faire (Qui):


private:
L'autorisation private est la plus restrictive. Elle s'applique aux membres d'une classe (variables, mthodes et classes internes). Les lments dclars private ne sont accessibles que depuis la classe qui les contient. Ce type d'autorisation est souvent employ pour les variables qui ne doivent tre modifies ou lues qu' l'aide d'un getter ou d'un setter.

public:
Un membre public dune classe peut tre utilis par nimporte quelle autres classe. En UML le membres public sont indiqus par le signe +

protected:
Les membres d'une classe peuvent tre dclars protected. Dans ce cas, l'accs en est rserv aux mthodes des classes appartenant
au mme package aux classes drives de ces classes, ainsi qu'aux classes appartenant aux mmes packages que les classes drives.

Autorisation par dfaut : package


L'autorisation par dfaut, que nous appelons package, s'applique aux classes, interfaces, variables et mthodes. Les lments qui disposent de cette autorisation sont accessibles toutes les mthodes des classes du mme package.
85

Rsum: Hritage
Une classe peut hriter dune autre classe en utilisant le mot extends. Une classe Hrite dune autre tout ses membres sauf le constructeur. Il faut toujours dfinir le constructeur de la nouvelle classe drive. Le constructeur de la classe drive peut appeler le constructeur de la classe parente en utilisant le mot super(), avec la liste des paramtres. Quand une classe hrite dune autre classe, elle a le droit de redfinir les mthodes hrites. Dans une mthode redfinie, on peut appeler la mthode de la classe parente en crivant le mot super suivi dun point et du nom de la mthode parente. (super.mthode()). Un constructeur peut appeler un autre constructeur de la mme classe en utilisant le mot this() avec des paramtres du constructeur.
86

43

POO Java : Par MR YOUSSFI

Rsum: Accessibilt
Pour utiliser une classe il faut connaitre:
O trouver la classe (package) Quels sont les droits daccs cette classe (Quoi?) Quelles sont les classes qui ont le droit daccder aux membres de cette classe (Qui?)

O?
Pour utiliser une classe il faut importer son package en utilisant linstruction import Pour dclarer le package dappartenance dune classe on utilise linstruction package La variable denvironnement classpath permet de dclarer les chemins ou la JVM trouvera les classes dune application

87

Rsum: Accessibilt
Quoi?
abstract :
Une classe abstraite est une classe qui ne peut pas tre instancie. Une mthode abstraite est une mthode qui peut tre dfinie lintrieur dune classe abstraite. Cest une mthode qui na pas de dfinition. Par consquent, elle doit tre redfinie dans les classes drives. Une interface est une sorte de classe abstraite qui ne contient que des mthodes abstraites. Dans java une classe hrite toujours dune seule classe et peut implmenter plusieurs interfaces.

final:
Une classe final est une classe qui ne peut pas tre drive. Une mthode final est une mthode qui ne peut pas tre redfinie dans les classes drives. Une variable final est une variable don la valeur ne peut pas changer On utilise final pour deux raisons: une raison de scurit et une raison doptimisation

static:
Les membres statiques dune classe appartiennent la classe et partags par toutes ses objets Les membres statiques sont accessible en utilisant directement le nom de la classe Les membres statiques sont accessible sans avoir besoin de crer une instance de la classe qui les contient Les membres statiques sont galement accessible via les instances de la classe qui les contient
88

44

POO Java : Par MR YOUSSFI

Rsum: Accessibilt
Qui?
Java dispose de 4 niveaux dautorisations: private : protected: public: package (Autorisation par dfaut)

89

Travail faire
Implmenter la classe Compte Implmenter la classe CompteSimple Implmenter la classe CompteEpargne Implmenter la classe ComptePayant Crer une application pour tester les diffrentes classes.

90

45

POO Java : Par MR YOUSSFI

Compte.java
package metier; public abstract class Compte { private int code; protected float solde; private static int nbComptes; public Compte(float s){ code=++nbComptes; this.solde=s; } public void retirer(float mt){ if(mt<solde) solde-=mt; } public void verser(float mt){ solde+=mt; } public String toString(){ return("Code="+code+" Solde="+solde); }
// Getters et Setters public int getCode() { return code; } public float getSolde() { return solde; } public static int getNbComptes() { return nbComptes; } }

91

CompteSimple.java
package metier; public final class CompteSimple extends Compte { private float decouvert; // Constructeurs public CompteSimple(float s,float d){ super(s); this.decouvert=d; } public CompteSimple(){ super(); } public void retirer(float mt) { if(solde+decouvert>mt) solde-=mt; } public String toString() { return "Compte Simple "+super.toString()+" Solde="+solde; } //Getters et Setters public float getDecouvert() { return decouvert; } public void setDecouvert(float decouvert) { this.decouvert = decouvert; } }

92

46

POO Java : Par MR YOUSSFI

CompteEpargne.java
package metier; public class CompteEpargne extends Compte { private float taux; //Constructeurs public CompteEpargne() { this(0,6); } public CompteEpargne(float solde,float taux) { super(solde); this.taux=taux; } public void calculInterets(){ solde=solde*(1+taux/100); } public String toString() { return "Compte Epargne "+super.toString()+" Taux="+taux; } // Getters et Setters public float getTaux() { return taux; } public void setTaux(float taux) { this.taux = taux; } }

93

ComptePayant.java
package metier; public class ComptePayant extends Compte { // Constructeur public ComptePayant(float solde) { super(solde); } public void verser(float mt) { super.verser(mt); super.retirer(mt*5/100); } public void retirer(float mt) { super.retirer(mt); super.retirer(mt*5/100); } public String toString() { return super.toString(); } }

94

47

POO Java : Par MR YOUSSFI

Application TestCompte.java
package test; import metier.*; public class TestCompte { public static void main(String[] args) { // Tester la classe Compte Simple CompteSimple c1=new CompteSimple(8000,4000); System.out.println(c1.toString()); c1.verser(3000); c1.retirer(5000); c1.setDecouvert(5500); System.out.println(c1.toString()); // Tester la classe Compte Epargne CompteEpargne c2=new CompteEpargne(50000,5); System.out.println(c2.toString()); c2.verser(30000); c2.retirer(6000); c2.calculInterets(); System.out.println(c2.toString()); c2.setTaux(6); c2.calculInterets(); System.out.println(c2); // Test de ComptePayant ComptePayant c3=new ComptePayant(5000); System.out.println(c3); c3.verser(6000); c3.retirer(4000); System.out.println(c3); } }

95

Polymorphisme

96

48

POO Java : Par MR YOUSSFI

Polymorphisme
Le polymorphisme offre aux objets la possibilit d appartenir plusieurs catgories la fois. En effet, nous avons certainement tous appris l'cole qu'il tait impossible d'additionner des pommes et des oranges Mais, on peut crire l expression suivante: 3 pommes + 5 oranges = 8 fruits

97

Polymorphisme
Le sur-casting des objets:
Une faon de dcrire l'exemple consistant additionner des pommes et des oranges serait d'imaginer que nous disons pommes et oranges mais que nous manipulons en fait des fruits. Nous pourrions crire alors la formule correcte : 3 (fruits) pommes + 5 (fruits) oranges --------------------------------------------= 8 fruits Cette faon de voir les choses implique que les pommes et les oranges soient "transforms" en fruits pralablement l'tablissement du problme. Cette transformation est appele sur-casting
98

49

POO Java : Par MR YOUSSFI

Instanciation et hritage
Considrons lexemple suivant:
Fruit poids:int Fruit() affiche():void

Pomme

Orange

Pomme(int p) affiche():void affichePoids()

Orange(int p) affiche():void affichePoids()

99

Instanciation et hritage
public abstract class Fruit{ int poids; public Fruit(){ System.out.println("Cration d'un fruit"); } public void affiche(){ System.out.println("c'est un fruit"); } } public class Pomme extends Fruit{ public Pomme(int p){ poids=p; System.out.println("cration d'une pomme de "+ poids+" grammes "); } public void affiche(){ System.out.println("C'est une pomme"); } public void affichePoids(){ System.out.println("le poids de la pomme est:"+poids+" grammes"); } } public class Orange extends Fruit{ public Orange(int p){ poids=p; System.out.println("cration d'une Orange de "+ poids+" grammes "); } public void affiche(){ System.out.println("C'est une Orange"); } public void affichePoids(){ System.out.println("le poids de la Orange est:"+poids+" grammes"); } }

public class Polymorphisme{ public static void main(String[] args){ Pomme p=new Pomme(72); Orange o=new Orange(80); } }

100

50

POO Java : Par MR YOUSSFI

Instanciation et hritage
Le rsultat affich par le programme est:
Cration Cration Cration cration d'un fruit d'une pomme de 72 grammes d'un fruit d'une orange de 80 grammes

Nous constatons qu'avant de crer une Pomme, le programme cre un Fruit, comme le montre l'excution du constructeur de cette classe. La mme chose se passe lorsque nous crons une Orange

101

Sur-casting des objets


Considrons lexemple suivant:
public class Polymorphisme2{ public static void main(String[] args){ // Sur-casting implicite Fruit f1=new Orange(40); // Sur-casting explicite Fruit f2=(Fruit)new Pomme(60); // Sur-casting implicite f2=new Orange(40); } }

102

51

POO Java : Par MR YOUSSFI

Sur-casting des objets


Un objet de type Pomme peut tre affect un handle de type fruit sans aucun problme :
Fruit f1; f1=new Pomme(60);

Dans ce cas lobjet Pomme est converti automatiquement en Fruit. On dit que lobjet Pomme est sur-cast en Fruit. Dans java, le sur-casting peut se faire implicitement. Toutefois, on peut faire le sur-casting explicitement sans quil soit ncessaire. La casting explicit se fait en prcisant la classe vers laquelle on convertit lobjet entre parenthse. Exemple :
f2=(Fruit)new Orange(40);

103

Sous-Casting des objets


Considrons lexemple suivant:
public class Polymorphisme3{ public static void main(String[] args){ Fruit f1; Fruit f2; Erreur de compilation: f1=new Pomme(60); Polymorphisme3.java:5: cannot resolve symbol : method affichePoids () f2=new Orange(40); location: class Fruit f1.affichePoids(); f1.affichePoids(); ((Pomme)f1).affichePoids(); ^ 1 error } }
Solution : Sous-casting explicit

symbol

104

52

POO Java : Par MR YOUSSFI

Sous-casting des objets


Ce message indique que lobjet f1 qui est de type Fruit ne possde pas la mthode affichePoids(). Cela est tout fait vrai car cette mthode est dfinie dans les classes Pomme et Oranges et non dans la classe Fruit. En fait, mme si le handle f1 pointe un objet Pomme, le compilateur ne tient pas en considration cette affectation, et pour lui f1 est un Fruit. Il faudra donc convertir explicitement lobjet f1 qui de type Fruit en Pomme. Cette conversion sappelle Sous-casting qui indique la conversion dun objet dune classe vers un autre objet dune classe drive. Dans ce cas de figure, le sous-casting doit se faire explicitement. Lerreur de compilation peut tre vit en crivant la syntaxe suivante :
((Pomme)f1).affichePoids();

Cette instruction indique que lobjet f1 , de type Fruit, est converti en Pomme, ensuite la mthode affichePoids() de lobjet Pomme est appel ce qui est correcte.

105

Late Binding
Dans la plupart des langages, lorsque le compilateur rencontre un appel de mthode, il doit tre mme de savoir exactement de quelle mthode il s'agit. Le lien entre l'appel et la mthode est alors tabli au moment de la compilation. Cette technique est appele early binding, que l'on pourrait traduire par liaison prcoce. Java utilise cette technique pour les appels de mthodes dclares final. Elle a l'avantage de permettre certaines optimisations. En revanche, pour les mthodes qui ne sont pas final, Java utilise la technique du late binding (liaison tardive). Dans ce cas, le compilateur n'tablit le lien entre l'appel et la mthode qu'au moment de l'excution du programme. Ce lien est tabli avec la version la plus spcifique de la mthode. Dans notre cas, nous la mthode affiche() possde 3 versions dfinies dans les classes Fruit, Pomme et Orange. Grce au late binding, java est capable de dterminer, au moment de lexcution, quelle version de mthode qui sera appele ce que nous pouvons vrifier par le programme suivant :

106

53

POO Java : Par MR YOUSSFI

Late Binding
public class Polymorphisme4{ public static void main(String[] args){ Fruit f1; Fruit f2; f1=new Pomme(60); f2=new Orange(40); f1.affiche();//((Pomme)f1).affiche(); f2.affiche(); } } Lexcution de ce programme donne : Cration d'un fruit Cration d'une pomme de 60 grammes Cration d'un fruit Cration d'une orange de 40 grammes C'est une pomme C'est une Orange
107

Polymorphisme
Pour rsumer, un objet est une instance de :
sa classe, toutes les classes parentes de sa classe, toutes les interfaces qu'il implmente, toutes les interfaces parentes des interfaces qu'il implmente, toutes les interfaces qu'implmentent les classes parentes de sa classe, toutes les interfaces parentes des prcdentes.

108

54

POO Java : Par MR YOUSSFI

Tableaux et Collections

109

Tableaux de primitives
Tableaux de primitives: Dclaration :
Exemple : Tableau de nombres entiers
int[] liste;

liste
5 12 23
0 1 2 3 4 5 6 7 8 9 10

liste est un handle destin pointer vers un tableau dentier

Cration du tableau
liste = new int[11];

Manipulation des lments du tableau:


liste[0]=5; liste[1]=12; liste[3]=23; for(int i=0;i<liste.length;i++){ System.out.println(liste[i]); }
110

55

POO Java : Par MR YOUSSFI

lesFruits

Tableaux dobjets
Dclaration :
Exemple : Tableau dobjets Fruit Fruit[] lesFruits;
:Pomme poids=60 affiche() affichePoids() :Orange poids=60 affiche() affichePoids() :Pomme poids=60 affiche() affichePoids()

Cration du tableau
lesFruits = new Fruit[5];

0 1 2 3 4

Cration des objets:


lesFruits[0]=new Pomme(60); lesFruits[1]=new Orange(100); lesFruits[2]=new Pomme(55);

Manipulation des objets:


for(int i=0;i<lesFruits.length;i++){ lesFruits[i].affiche(); if(lesFruits[i] instanceOf Pomme) ((Pomme)lesFruits[i]).affichePoids(); else ((Orange)lesFruits[i]).affichePoids(); }

Un tableau dobjets est un tableau de handles

Collections
Une collection est un tableau dynamique dobjets de type Object. Une collection fournit un ensemble de mthodes qui permettent:
Dajouter un nouveau objet dans le tableau Supprimer un objet du tableau Rechercher des objets selon des critres Trier le tableau dobjets Contrler les objets du tableau Etc

Dans un problme, les tableaux peuvent tre utiliss quand la dimension du tableau est fixe. Dans le cas contraire, il faut utiliser les collections Java fournit plusieurs types de colections:
ArrayList Vector Iterator HashMap Etc

Dans cette partie du cours, nous allons prsenter uniquement comment utiliser les collections ArrayList, Vector, Iterator et HashMap Vous aurez loccasion de dcouvrir les autres collections dans les prochains cours

112

56

POO Java : Par MR YOUSSFI

Collection ArrayList
ArrayList est une classe du package java.util, qui implmente linterface List. Dclaration dune collection de type List qui devrait stocker des objets de type Fruit:
List<Fruit> fruits;

Cration de la liste: fruits=new ArrayList<Fruit>();

Ajouter deux objets de type Fruit la liste:


fruits.add(new Pomme(30)); fruits.add(new Orange(25));

Faire appel la mthode affiche() de tous les objets de la liste:


En utilisant la boucle classique for for(int i=0;i<fruits.size();i++){ fruits.get(i).affiche(); } En utilisant la boucle for each for(Fruit f:fruits) f.affiche();

Supprimer le deuxime Objet de la liste


fruits.remove(1);

113

Exemple dutilisation de ArrayList


import java.util.ArrayList;import java.util.List; public class App1 { public static void main(String[] args) { // Dclaration dune liste de type Fruit List<Fruit> fruits; // Cration de la liste fruits=new ArrayList<Fruit>(); // Ajout de 3 objets Pomme, Orange et Pomme la liste fruits.add(new Pomme(30)); fruits.add(new Orange(25)); fruits.add(new Pomme(60)); // Parcourir tous les objets for(int i=0;i<fruits.size();i++){ // Faire appel la mthode affiche() de chaque Fruit de la liste fruits.get(i).affiche(); } // Une autre manire plus simple pour parcourir une liste for(Fruit f:fruits) // Pour chaque Fruit de la liste f.affiche(); // Faire appel la mthode affiche() du Fruit f } 114 }

57

POO Java : Par MR YOUSSFI

Collection Vector
Vecor est une classe du package java.util qui fonctionne comme ArrayList Dclaration dun Vecteur qui devrait stocker des objets de type Fruit:
Vector<Fruit> fruits;

Cration de la liste: fruits=new Vector<Fruit>();

Ajouter deux objets de type Fruit la liste:


fruits.add(new Pomme(30)); fruits.add(new Orange(25));

Faire appel la mthode affiche() de tous les objets de la liste:


En utilisant la boucle classique for for(int i=0;i<fruits.size();i++){ fruits.get(i).affiche(); } En utilisant la boucle for each for(Fruit f:fruits) f.affiche();

Supprimer le deuxime Objet de la liste


fruits.remove(1);
115

Exemple dutilisation de Vector


import java.util.Vector; public class App2 { public static void main(String[] args) { // Dclaration dun vecteur de type Fruit Vector<Fruit> fruits; // Cration du vecteur fruits=new Vector<Fruit>(); // Ajout de 3 objets Pomme, Orange et Pomme au vecteur fruits.add(new Pomme(30)); fruits.add(new Orange(25)); fruits.add(new Pomme(60)); // Parcourir tous les objets for(int i=0;i<fruits.size();i++){ // Faire appel la mthode affiche() de chaque Fruit fruits.get(i).affiche(); } // Une autre manire plus simple pour parcourir un vecteur for(Fruit f:fruits) // Pour chaque Fruit du veceur f.affiche(); // Faire appel la mthode affiche() du Fruit f } }
116

58

POO Java : Par MR YOUSSFI

Collection de type Iterator


La collection de type Iterator du package java.util est souvent utilise pour afficher les objets dune autre collection En effet il est possible dobtenir un iterator partir de chaque collection. Exemple :
Cration dun vecteur de Fruit.
Vector<Fruit> fruits=new Vector<Fruit>();

Ajouter des fruits aux vecteur


fruits.add(new Pomme(30)); fruits.add(new Orange(25)); fruits.add(new Pomme(60));

Cration dun Iterator partir de ce vecteur


Iterator<Fruit> it=fruits.iterator();

Parcourir lIterator:
while(it.hasNext()){ Fruit f=it.next(); f.affiche(); }

Notez bien que, aprs avoir parcouru un iterator, il devient vide


117

Collection de type HashMap


La collection HashMap est une classe qui implmente linterface Map. Cette collection permet de crer un tableau dynamique dobjet de type Object qui sont identifis par une cl. Dclaration et cration dune collection de type HashMap qui contient des fruits identifis par une cl de type String :
Map<String, Fruit> fruits=new HashMap<String, Fruit>();

Ajouter deux objets de type Fruit la colelction


fruits.put("p1", new Pomme(40)); fruits.put("o1", new Orange(60));

Rcuprer un objet ayant pour cl "p1


Fruit f=fruits.get("p1"); f.affiche();

fruits key value p1 o1

:Pomme

:Orange

Parcourir toute la collection:


Iterator<String> it=fruits.keySet().iterator(); while(it.hasNext()){ String key=it.next(); Fruit ff=fruits.get(key); System.out.println(key); ff.affiche(); }
118

59

POO Java : Par MR YOUSSFI

Associations entre classes


Une agence gre plusieurs clients. Chaque client possde un seul compte Le compte peut tre soit un compteSimple ou un compteEpargne.
1
Agence Compte

*
gre

Client

1
possde

CompteSimple

CompteEpargne

119

Traduction des association


La premire association gre de type ( 1---*) entre Agence et Client se traduit par :
Cration dun tableau dobjets Client ou dun vecteur comme attribut de la classe Agence. Ce tableau ou ce vecteur sert rfrencer les clients de lagence.

La deuxime association possde de type ( 1----1) se traduit par:


Cration dun handle de type Compte dans la classe Client. Ce handle sert rfrencer lobjet Compte de ce client.

La troisime rgne de gestion est une relation dhritage et non une association.

120

60

POO Java : Par MR YOUSSFI

Traduction des association

1
Agence lesClients:Vector

Compte

*
gre

Client monCompte:Compte

1
possde

CompteSimple

CompteEpargne

Agence a=new Agence(); Client cli=new Client(); CompteSimple c1=new CompteSimple(); cli.monCompte=c1; a.addClient(cli);

121

Exemple de diagramme dobjets

Agence a=new Agence(); Client cli=new Client(); CompteSimple c1=new CompteSimple(); cli.monCompte=c1; a.lesClients.addElement(cli);

cli: Client
monCompte

c1: CpteSimple

a: Agence
lesClients

: Client
monCompte

: CpteEpargne

addClient(Client c)

: Client
monCompte

: CpteSimple

122

61

POO Java : Par MR YOUSSFI

Exceptions et Entres sorties

Par M.youssfi

Les Exceptions
Throwable

JVM
Error

Application
Exception

Etc

Etc

ArithmenticException

IOExcption

Etc

Les exceptions sont des objets Erreur qui sont gnrs par un programme java, quon peut attraper et traiter. Par contre les objets Error ne peuvent tre ni traits ni prvus par le programmeur (exemple les erreurs qui sont provoques par la machine virtuelle java) .
124

62

POO Java : Par MR YOUSSFI

Les Exceptions
Les deux types dexeptions de Java En Java, on peut classer les erreurs en deux catgories :
Les exeptions surveilles, Les exeptions non surveilles.

Java oblige le programmeur traiter les erreurs surveilles. Elles sont signales par le compilateur Les erreurs non surveilles peuvent tre traites ou non. Et ne sont pas signales par le compilateur
125

Les Exceptions
Exemple : considrons le programme suivant :
public class Erreur1 { public static void main( String[] args ) { int x = 10, y = 0, z = 0; z = x / y; System.out.println("aprs calcul");} }

la compilation se fait sans problme lexcution de ce programme affiche le message suivant :


java.lang.ArithmeticException: / by zero at Erreur.main(Erreur.java:4) Exception in thread "main"

126

63

POO Java : Par MR YOUSSFI

Les Exceptions
Ce message indique quune erreur de division par zro se produit la ligne 4. java gnre automatiquement un objet de la classe ArithmeticException du package java.lang. Cet objet sappelle Exception . ce genre derreur nest pas signal par le compilateur, on dira que ArithmeticException est une exception non surveille . Cela veut dire que le programmeur nest pas oblig de prvoir le traitement de ce genre derreur. En revanche, il existe des Exceptions surveilles que le programmeur doit prvoir un code de traitement de ces exceptions exemple IOException due aux oprations dentres sorties. Lorsqu une exception, non surveilles et qui nest pas traite par le programmeur, se produit, linterprteur la traite en affichant un message et en provoquant larrt instantan du programme (Bug).

127

Attraper les exceptions


Le Bloc Try catch
public class Erreur1 { public static void main( String[] args ) { int x = 10, y = 0, z = 0; try { z = x / y; } catch (ArithmeticException e) { System.out.println("Capture de l'exception"); } System.out.println("aprs le bloc try"); } }

128

64

POO Java : Par MR YOUSSFI

Attraper les exceptions


La compilation se fait sans problme Rsultat de lexcution : Capture de l'exception aprs le bloc try Lexcution se produit sans problme et indique que lexception a t bien capture en utilisant le handle e. Dans ce cas le programme empche que lexception soit transmise linterprteur ce qui empche larrt du programme et donne la possibilit de traiter lrreur. Le bloc catch qui permet de traiter lexception est appel handler dexception .
129

Dans Quelle direction sont lances les exceptions


public class Erreur1 { public static int calcul(int a, int b) { return a / b; JVM } Exception public static void main( String[] args ) { int x = 10, y = 0, z = 0; main try { z = calcul(x, y); Exception } calcul catch (ArithmeticException e) { System.out.println(e.getMessage()); } } } Ici, l'exception est lance dans la mthode calcul. Celle-ci ne comporte pas de handler (bloc catch) pour cette exception. L'exception remonte alors dans le bloc de niveau suprieur, c'est--dire celui o a eu lieu l'appel de la mthode. L, un handler est trouv et l'exception est traite.
130

65

POO Java : Par MR YOUSSFI

Traiter les exceptions


public class Erreur1 { public static int calcul(int a, int b) { return a / b; } public static void main( String[] args ) { int x = 10, y = 0, z = 0; try { z = calcul(x, y); } catch (ArithmeticException e) { System.out.println("Erreur : Division par zero"); System.out.println(e.toString()); System.out.println(e.getMessage()); e.printStackTrace(); } System.out.println("Suite du programme"); } }
131

Traiter les exceptions


Le programme affiche le rsultat suivant: Erreur : Division par zero java.lang.ArithmeticException: / by zero / by zero java.lang.ArithmeticException: / by zero at Erreur1.calcul(Erreur1.java:3) at Erreur1.main(Erreur1.java:8) Suite du programme La premire ligne est affiche par linstruction : System.out.println("Erreur : Division par zero");La deuxime ligne est affiche par linstruction : System.out.println(e.toString());La 3me ligne est affiche par linstruction: System.out.println(e.getMessage()); Les 3 lignes (4,5 et 6) sont affiches par la mthode printStackTrace de lexception : e.printStackTrace(); La dernire ligne indique quaprs traitement de lexception, le programme poursuit son excution .Elle est affiche par linstruction : System.out.println("Suite du programme");

132

66

POO Java : Par MR YOUSSFI

Relancer ou jeter une exception


Pour gnrer une nouvelle exception, on utilise la commande throw suivie par la cration dun nouveau objet dun type dexception. Exemple : la mthode retirer de la classe Compte gnre une exception dont le message est Solde insuffisant , si le montant retirer est suprieur au solde. Lentte de la mthode retirer se termine par throws Exception pour indiquer que cette mthode est susceptible de gnrer une exception de type Exception public class Compte { private float solde; public void retirer(float mt) throws Exception{ if(mt>solde) throw new Exception("Solde insuffisant"); solde-=mt; } }

133

Relancer ou jeter une exception


Dans lapplication, chaque fois que la mthode retirer est appele, il faut prvoir le traitement de lexception en utilisant:
Soit le bloc try catch :

Compte c=new Compte();


try { c.retirer(5000); } catch (Exception e) { System.out.println(e.getMessage()); } Soit en ajoutant la mthode qui fait appel retirer(), lindicateur throws Exception, pour indiquer que Si lexception survient, elle ne sera pas attrape, par la suite, elle va remonter vers le niveau suprieur. public static void main(String[] args) throws Exception {

public class Test { public static void main(String[] args) { Compte c=new Compte(); try { c.retirer(5000); } catch (Exception e) { System.out.println(e.getMessage()); }}}
134

67

POO Java : Par MR YOUSSFI

Exceptions lies aux entres-sorties


Supposant que nous voulions faire un programme java qui demande lutilisateur de saisir une chane de caractres au clavier et permet de lafficher. Notez tout dabord que : La mthode readLine() de la classe BufferedReader permet de lire une ligne partir dune entre quelconque. La syntaxe, pour crer un objet de cette classe, pour le cas dune saisie au clavier, est la suivante : BufferedReader br =new BufferedReader(new InputStreamReader(System.in)); Pour lire partir du clavier, on utilise la syntaxe suivante : String S=br.readLine() ;
BufferedReader readLine():String InputStreamReader read():int

System.in read():byte

Clavier

135

Exceptions lies aux entres-sorties


Si nous consultons la documentation de Java, nous constatons que la signature de la mthode readline() est : public String readLine() throws IOException Cela veut dire que cette mthode est susceptible de lancer une exception de type IOException. Or IOException est une exception surveille. Ce qui oblige le programmeur crer un handler de traitement de cette exception pour chaque utilisation de la mthode readLine(). Toute tentative dutilisation de cette mthode sans bloc trycatch, provoque une erreur au niveau de la compilation. Vrifions le par le petit programme suivant :

136

68

POO Java : Par MR YOUSSFI

Exceptions lies aux entres-sorties


import java.io.*; class TestSaisie{ public static void main(String[] arg){ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String S=br.readLine(); System.out.println("vous avez tap:"+S); } } La compilation de ce programme affiche le message suivant : TestSaisie.java:5:Exception java.io.IOException must be caught, or it must be declared in the throws clause of this method. String S=br.readLine(); ^ 1 error Cela est d au fait que les exceptions de type IOException sont surveilles et doivent donc recevoir, de la part du programmeur, un traitement spcial. Ce traitement peut prendre deux formes :

137

Exceptions lies aux entres-sorties


Attraper l'exception :
import java.io.*; class TestSaisie2{ public static void main(String[] arg){ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String S=""; try{ S=br.readLine(); } catch(IOException e){ System.out.println("Erreur de saisie au clavier"); } System.out.println("vous avez tap:"+S); } }

138

69

POO Java : Par MR YOUSSFI

Exceptions lies aux entres-sorties


Signaler que l'exception n'est pas attrape : import java.io.*; class TestSaisie3{ public static void main(String[] arg)throws IOException{ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String S=br.readLine(); System.out.println("vous avez tap:"+S); } } Dans ce cas : Lexception nest pas attrape (absence du handler catch) en signalant que la fonction main() est susceptible de lancer une exception de type IOException. Si une erreur dentre-sortie se produit pendant lexcution (Exemple le clavier nest pas connect), lexception sera renvoye au niveau suprieur, c'est--dire linterprteur java, qui va linterprter ce qui afficherait un message derreur et arrterait le programme. Sinon, lexcution se fait sans problme.
139

Entrs Sorties

M.Youssfi

140

70

POO Java : Par MR YOUSSFI

Entres Sorties

Programme
Donnes

Donnes

Streams dentre Streams de sortie

Clavier Un autre Programme

Imprimante

Moniteur Streams De sortie Streams Dentre


141

Principe des entres/sorties


Pour effectuer une entre ou une sortie de donnes en Java, le principe est simple et se rsume aux oprations suivantes :
Ouverture d'un moyen de communication. criture ou lecture des donnes. Fermeture du moyen de communication.

En Java, les moyens de communication sont reprsents par des objets particuliers appels (en anglais) stream. Ce mot, qui signifie courant, ou flot
142

71

POO Java : Par MR YOUSSFI

Streams
Communication Binaires
InputStream
E.B

Streams Traitement

Caractres
Reader
E.C

B
IS
E.B

C
OS
S.B

OutputStream
S.B

Writer
S.C

R
E.C

W
S.C

Il existe deux types de streams:


Streams de Communication: tablit une liaison entre le programme et une destination.
Streams binaires : Exemple FileInputStream, FileOutputStream Streams de caractres : Exemple FileReader, FileWriter

Streams de Traitement : Permet de traiter les information des streams de communication.


Streams binaires : ex BufferedInputStream, ZipInputStream, ZipOutputStream, Streams de caractres : BufferedReader, BufferedWriter,
143

Classe File
Cration dobjet de la classe File:
File f=new File("fichier.ext"); File f=new File ("c:\jdk"); File f=new File ("c:\", "autoexec.bat"); Mthodes de la classe File:
String getName(); String getPath(); String getAbsolutePath(); String getParent(); boolean renameTo(File newFile); boolean exists() ; boolean canRead(); boolean canWrite(); boolean isDirectory(); boolean isFile(); long length(); boolean delete(); boolean mkdir(); String[] list(); Retourne le nom du fichier. Retourne la localisation du fichier en relatif. Idem mais en absolu. Retourne le nom du rpertoire parent. Permet de renommer un fichier. Est-ce que le fichier existe ? Le fichier est t-il lisible ? Le fichier est t-il modifiable ? Permet de savoir si c'est un rpertoire. Permet de savoir si c'est un fichier. Quelle est sa longueur (en octets) ? Permet d'effacer le fichier. Permet de crer un rpertoire. On demande la liste des fichiers localiss dans le rpertoire.

Exemple : Afficher un repertoire File f=new File("c:\jdk"); if(f.exists()){ String[] contenu=f.list(); for(int i=0;i<contenu.lenght;i++){ File f2=new File("c:\jdk",contenu[i]); if(f2.isDirectory()) System.out.println("Rep:"+ contenu[i]); else System.out.println("File:"+ contenu[i]); } } else 144 System.out.print("Dossier introuvable");

72

POO Java : Par MR YOUSSFI

Lire et crire sur un fichier texte

fr:FileReader
read():int

f1:File Fichier1.txt

fw:FileWriter
write(int c):void

f2:File Fichier2.txt
File f1=new File("c:/Fichier1.txt"); FileReader fr=new FileReader(f1); File f2=new File("c:/Fichier2.txt"); FileWriter fw=new FileWriter(f2); int c; while((c=fr.read())!=-1){ fw.write(c); } fr.close();fw.close();
145

Lire et crire sur un fichier binaire

fis:FileInputStream
read():int

f1:File image1.jpg

fos:FileOutputStream
write(int c ):void

f2:File image2.jpg
File f1=new File("c:/image1.jpg"); FileInputStream fis=new FileInputStream(f1); File f2=new File("c:/image2.jpg"); FileOutputStream fos=new FileOutPutStream(f2); int c; while((c=fis.read())!=-1){ fos.write(c); } fis.close();fos.close();
146

73

POO Java : Par MR YOUSSFI

Lire et crire sur un fichier texte ligne par ligne : Streams de traitement : BufferedReader et BufferedWriter
br:BufferedReader
readLine():String

fr:FileReader
read():int

f1:File Fichier1.txt

bw:BufferedWriter
write(String s):void newLine():void

fw:FileWriter
write(int c):void

f2:File Fichier2.txt

File f1=new File("c:/Fichier1.txt"); FileReader fr=new FileReader(f1); BufferedReader br=new BufferedReader(fr); File f2=new File("c:/Fichier2.txt"); FileWriter fw=new FileWriter(f2); BufferedWriter bw=new BufferedWriter(fw); String s; while((s=br.readLine())!=null){ bw.write(s);bw.newLine(); } br.close();bw.close();

147

Compression ZIP : Stream de traitement : ZipOutputStream


f1:File Fichier.doc
read():int zos:ZipOutputStream write():void setMethod():void putNextEntry():void bos:BufferedOutputStream read():int fos:FileOutputStream

bis:BufferedInputStream

fis:FileInputStream

f2:File Fichier.zip

write(int c):void

read():int

File f1=new File("c:/","Fichier.doc"); FileInputStream fis=new FileInputStream(f1); BufferedInputStream bis=new BufferedInputStream(fis); File f2=new File("Fichier.zip"); FileOutputStream fos=new FileOutputStream(f2); BufferedOutputStream bos=new BufferedOutputStream(fos); ZipOutputStream zos=new ZipOutputStream(bos); zos.setMethod(ZipOutputStream.DEFLATED); zos.putNextEntry(new ZipEntry(f1.getName())); int c; while ((c=bis.read())!=-1){ zos.write(c); } zos.close();bis.close();

148

74

POO Java : Par MR YOUSSFI

Dcompression ZIP : Stream de traitement : ZipInputStream


f1:File Fichier.zip
read():int bos:BufferedOutputStream read():int fos:FileOutputStream

zos:ZipInputStream read():int getNextEntry()

bis:BufferedInputStream

fis:FileInputStream

f2:File Fichier.doc

write(int c):void

read():int

File f1=new File("Fichier.zip"); FileInputStream fis=new FileInputStream(f1); BufferedInputStream bis=new BufferedInputStream(fis); ZipInputStream zis=new ZipInputStream(bis); ZipEntry ze=zis.getNextEntry(); File f2=new File(ze.getName()); FileOutputStream fos=new FileOutputStream(f2); BufferedOutputStream bos=new BufferedOutputStream(fos); int c; while ((c=zis.read())!=-1){ bos.write(c); } zis.close();bos.close();

149

Srialisation

oos:ObjectOutputStream

fos:FileOutputStream

f:File Fichier.dat

writeObject(Object o):void

write(int c)

Voiture v1 = new Voiture("V6", "Cabriolet"); // Crer un objet de la classe Voiture Voiture v2 = new Voiture("V5", "peujeot"); v1.setCarburant(50); v2.setCarburant(100); File f=new File("Fichier.dat"); FileOutputStream fos= new FileOutputStream(f); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(v1); // Srialiser lobjet v1 oos.writeObject(v2); // Srialiser lobjet v2 oos.close();
150

75

POO Java : Par MR YOUSSFI

Classes Srialiser
import java.io.Serializable; public class Voiture implements Serializable { private String moteur; private String carrosserie; private transient int essence; public Voiture (String m, String c) { moteur =m; carrosserie = c; } public String getMoteur() {return moteur;} public String getCarrosserie() {return carrosserie;} public void setCarburant(int e) {essence += e;} public int getCarburant() {return essence;} }
151

DSrialisation

ois:ObjectInputStream

fis:FileInputStream

f:File Fichier.dat

readObject():Object

read():int

File f=new File("Fichier.dat"); FileInputStream fis = new FileInputStream(f); ObjectInputStream ois = new ObjectInputStream(fis); Voiture v1 = (Voiture)ois.readObject(); Voiture v2 = (Voiture)ois.readObject(); ois.close(); System.out.println("Carrosserie : " + v1.getCarrosserie()); System.out.println("Moteur : " + v1.getMoteur()); System.out.println("Carburant : " + v1.getCarburant()); System.out.println("Carrosserie : " + v2.getCarrosserie()); System.out.println("Moteur : " + v2.getMoteur()); System.out.println("Carburant : " + v2.getCarburant());

152

76

POO Java : Par MR YOUSSFI

Applications

153

Traitement dun ficher texte caractre par caractre : Cryptage


import java.io.*; public class App1 { public static void main(String[] args) { try { File f1=new File("Notes.tct"); FileReader fr=new FileReader(f1); File f2=new File("Notes2.tct"); FileWriter fw=new FileWriter(f2); int c; while((c=fr.read())!=-1){ fw.write(c+1); } fr.close();fw.close(); } catch (Exception e) { e.printStackTrace(); } } }
Fichier Notes.txt :

E1;Math;12 E2;Math;14 E1;Info;12 E2;Info;17


Fichier Rsultat Notes2.txt :

F2<Nbui<23F3<Nbui<25F2<J ogp<23F3<Jogp<28

154

77

POO Java : Par MR YOUSSFI

Traitement dun ficher texte Ligne par ligne: Afficher la moyenne des notes
import java.io.*; public class App2 { public static void main(String[] args) { try { File f1=new File("Notes.tct"); FileReader fr=new FileReader(f1); BufferedReader br=new BufferedReader(fr); String s; float somme=0;int nb=0; while((s=br.readLine())!=null){ ++nb; String[] tab=s.split(";"); int note=Integer.parseInt(tab[2]); somme=somme+note; } br.close(); System.out.println("Moyenne="+somme/nb); } catch (Exception e) { e.printStackTrace(); } } }
Fichier Notes.txt :

E1;Math;12 E2;Math;14 E1;Info;12 E2;Info;17


Rsultat affich:

Moyenne=13.75

155

Srialisation
Classe srialisable Etudiant.java :
import java.io.Serializable; public class Etudiant implements Serializable{ private String code; private String matiere; private float note; public Etudiant(String code, String matiere, float note) { this.code = code; this.matiere = matiere; this.note = note; } public Etudiant() { } public String toString() { return "Etudiant [code=" + code + ", matiere=" + matiere + ", note="+ note + "]"; } // Getters et Setters }
Fichier Notes.txt :

E1;Math;12 E2;Math;14 E1;Info;12 E2;Info;17

156

78

POO Java : Par MR YOUSSFI

Srialisation

Application qui permet de :


lire le ficher Notes.txt ligne par ligne

Stocker les donnes de chaque ligne dans un objet de la classe Etudiant Fichier Notes.txt : Srialiser les objets tudiants dans un ficher E1;Math;12 import java.io.*; E2;Math;14 public class App3 { E1;Info;12 public static void main(String[] args) { E2;Info;17

try { File f1=new File("Notes.tct");FileReader fr=new FileReader(f1); BufferedReader br=new BufferedReader(fr); File f2=new File("Scolarite.txt"); FileOutputStream fos=new FileOutputStream(f2); ObjectOutputStream oos=new ObjectOutputStream(fos); String s; while((s=br.readLine())!=null){ String[] tab=s.split(";"); Etudiant et=new Etudiant(tab[0],tab[1],Float.parseFloat(tab[2])); System.out.println(et.toString()); oos.writeObject(et); } oos.close(); } catch (Exception e) { e.printStackTrace(); }} }
157

Dsrialisation

Application qui permet de :


lire le ficher scolarite.txt qui contient des objets Etudiant Dsrialier et afficher ces tudiants en affichant la moyenne

import java.io.*; public class App4 { public static void main(String[] args) { float somme=0;int nb=0; try { File f =new File("Scolarite.txt"); FileInputStream fis=new FileInputStream(f); ObjectInputStream ois=new ObjectInputStream(fis); Object o; while(true){ ++nb; Etudiant et=(Etudiant)ois.readObject(); somme=somme+et.getNote(); System.out.println(et.toString()); } } catch (Exception e) { } System.out.println("Moyenne="+somme/nb); } }
158

79

POO Java : Par MR YOUSSFI

Compression dun fichier au format ZIP


import java.io.*; import java.util.zip.*; class Zip{ public static void main(String[] arg)throws Exception{ File f=new File("c:/","entree.doc"); File f2=new File("entree.zip"); if (f.exists()){ FileInputStream ent=new FileInputStream(f); FileOutputStream sort=new FileOutputStream(f2); BufferedInputStream bent=new BufferedInputStream(ent); BufferedOutputStream bsort=new BufferedOutputStream(sort); ZipOutputStream zsort=new ZipOutputStream(bsort); zsort.setMethod(ZipOutputStream.DEFLATED); zsort.putNextEntry(new ZipEntry(f.getName())); int s; while ((s=bent.read())!=-1){ zsort.write(s); } zsort.close(); bent.close(); } else System.out.println("n'existe pas"); } }
159

Dcompression dun fichier ZIP


import java.io.*; import java.util.zip.*; class Unzip{ public static void main(String[] arg)throws IOException, FileNotFoundException{ File f2=new File("entree.zip"); if (f2.exists()){ FileInputStream ent=new FileInputStream(f2); BufferedInputStream bent=new BufferedInputStream(ent); ZipInputStream zbent=new ZipInputStream(bent); ZipEntry ze=zbent.getNextEntry(); File f=new File(ze.getName()); FileOutputStream sort=new FileOutputStream(f); BufferedOutputStream bsort=new BufferedOutputStream(sort); int s; while ((s=zbent.read())!=-1){ bsort.write(s); } zbent.close(); bsort.close(); }else System.out.println("n'existe pas"); } }
160

80

POO Java : Par MR YOUSSFI

Interfaces graphique dans java

Par M.youssfi

161

Interfaces graphiques
En java, il existe deux types de composants graphiques:
Composants AWT (Abstract Window ToolKit): Composants qui font appel aux composants graphiques de lOS Composants SWING : Composants crit compltement avec java et sont indpendant de lOS
OS JVM Application
AWT : Composants lgers SWING : Composants lourds

162

81

POO Java : Par MR YOUSSFI

Composants AWT
Nous avons notre disposition principalement trois types d'objets :
Les Components qui sont des composants graphiques. Exemple (Button, Label, TextField) Les Containers qui contiennent les Components. Exemple (Frame, Pannel, .) Les Layouts qui sont en fait des stratgies de placement de Components pour les Containers. Exemple (FlowLayout, BorderLayout, GridLayout)

163

Premier Exemple AWT et SWING


import java.awt.*; public class AppAWT { public static void main(String[] args){ // Crer une fentre Frame f=new Frame("Titre"); // Crer une zone de texte TextField t=new TextField(12); // Crer un bouton OK Button b=new Button("OK"); // Dfinir une technique de placement f.setLayout(new FlowLayout()); //ajouter la zone de texte t frame f f.add(t); // ajouter le bouton b la frame f f.add(b); // Dfinir les dimensions de la frame f.setBounds(10,10,500,500); // Afficher la frame f.setVisible(true); } } import javax.swing.*; import java.awt.FlowLayout; public class AppSWING { public static void main(String[] args){ JFrame f=new JFrame("Titre"); JTextField t=new JTextField(12); JButton b=new JButton("OK"); f.setLayout(new FlowLayout()); f.add(t); f.add(b); f.setBounds(10,10,500,500); f.setVisible(true); } }

AWT

SWING
164

82

POO Java : Par MR YOUSSFI

Une autre manire plus pratique : Hrier de la classe Frame


import java.awt.*; public class MaFenetreAWT extends Frame{ // Crer une zone de texte TextField t=new TextField(12); // Crer un bouton OK Button b=new Button("OK"); public MaFenetreAWT() { // Dfinir une technique de placement this.setLayout(new FlowLayout()); //ajouter la zone de texte t la frame this this.add(t); // ajouter le bouton b la frame this this.add(b); // Dfinir les dimensions de la frame this.setBounds(10,10,500,500); // Afficher la frame this.setVisible(true); } public static void main(String[] args) { MaFenetreAWT f=new MaFenetreAWT(); } }

165

Gestion des vnements


Dans java, pour qun objet puisse rpondre un vnement, il faut luis attacher un couteur (Listener). Il existe diffrents types de Listeners:
WindowsListener : pour grer les vnement sur la fentre ActionListener :pour grer les vnements produits sur les composants graphiques. KeyListener : pour grer les vnements du clavier MouseListener : pour grer les vnements de la souris. .

166

83

POO Java : Par MR YOUSSFI

Gestionnaire dvnement ActionListener


AcltionListener est une interface qui dfinit une seule mthode:
public void actionPerformed(ActionEvent e);

Lvnement actionPerformed est produit quand on valide une action par un clique ou par la touche de validation du clavier. Pour grer cet vnement dans une application, il faut crer un classe implmentant linterface ActionListener et redfinir la rponse aux vnements utilisateur, produits dans linterface, dans la mthode actionPerformed. La classe implmentant cette interface sappelle un listener (couteur) ou un gestionnaire dvnements. Quand on clique, par exemple, sur un bouton qui est branch sur cet couteur, la mthode actionPerformed de lcouteur sexcute

167

import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class TestEvent extends Frame implements ActionListener { Label l=new Label("Votre Nom:"); TextField t=new TextField("******"); Button b=new Button("Ajouter"); List liste=new List(); Button b2=new Button("Quitter"); public TestEvent() { this.setLayout(new FlowLayout()); this.add(l);this.add(t);this.add(b); this.add(b2);this.add(liste); this.setBounds(10,10, 400, 400); b.addActionListener(this); b2.addActionListener(this); this.setVisible(true); } // Gestionaire des vnnements public void actionPerformed(ActionEvent e) { // Si la sourse de l'vnement est le bouton b if(e.getSource()==b){ // Lire le contenu de la zone de texte String s=t.getText(); // Ajouter la valeur de s la liste liste.add(s); } // Si la sourse de l'vnnement est b2 else if(e.getSource()==b2){ // Quitter l'application System.exit(0); } } public static void main(String[] args) { new TestEvent(); }

Gestion des vnements


: ActionListener
actionPerformed()

168

84

POO Java : Par MR YOUSSFI

En utilisant une classe interne


import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class TestEvent2 extends Frame{ Label l=new Label("Votre Nom:"); TextField t=new TextField("******"); Button b=new Button("Ajouter"); List liste=new List(); Button b2=new Button("Quitter"); class Handler implements ActionListener{ public void actionPerformed(ActionEvent e) { if(e.getSource()==b){ String s=t.getText(); liste.add(s); } else if(e.getSource()==b2){ System.exit(0); } } } public TestEvent2() { this.setLayout(new FlowLayout()); this.add(l);this.add(t);this.add(b); this.add(b2);this.add(liste); this.setBounds(10,10, 400, 400); Handler h=new Handler(); b.addActionListener(h); b2.addActionListener(h); this.setVisible(true); } public static void main(String[] args) { new TestEvent2(); } }

h: ActionListener
public void actionPerformed(ActionEvent e)

169

import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class TestEvent extends Frame{ Label l=new Label("Votre Nom:"); TextField t=new TextField(12); Button b=new Button("Ajouter"); List liste=new List(); Button b2=new Button("Quitter"); public TestEvent() { this.setLayout(new FlowLayout()); this.add(l);this.add(t);this.add(b); this.add(b2);this.add(liste); this.setBounds(10,10, 400, 400); // Si on clique le bouton b1 b.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e) { String s=t.getText(); liste.add(s); } } ); // Si on clique le bouton b2 b2.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e) { System.exit(0); } } ); // Si on clique le bouton fermer de la fentre this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.exit(0); } }); this.setVisible(true); } public static void main(String[] args) { new TestEvent(); }}

En crant directement un objet de ActionListener

: ActionListener
public void actionPerformed(ActionEvent e)

: WindowListener
public void windowClosing(WindowEvent e)

170

85

POO Java : Par MR YOUSSFI

Exemple dapplication SWING


Interface concernant le TP entre sorties (Rcepteur)

171

Code de lapplication : Cration des composants


import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class RecepteurSWING extends JFrame implements ActionListener { private JLabel jl=new JLabel("Rcepteur"); private JTextField jtf1=new JTextField(12); private JButton jb1=new JButton("Add"); private JButton jb2=new JButton("Charcger"); private JButton jb3=new JButton("Srialiser"); private List liste1=new List(); private List liste2=new List(); private JLabel jlErr=new JLabel("OK");

172

86

POO Java : Par MR YOUSSFI

Code de lapplication : Constructeur


public RecepteurSWING(){ this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setLayout(new BorderLayout()); JPanel jp1=new JPanel(); jp1.setLayout(new FlowLayout()); jp1.add(jl);jp1.add(jtf1);jp1.add(jb1);jp1.add(jb2); jp1.add(jb3); this.add(jp1,BorderLayout.NORTH); JPanel jp2=new JPanel(); jp2.setLayout(new GridLayout()); jp2.add(liste1); jp2.add(liste2); this.add(jp2,BorderLayout.CENTER); this.add(jlErr,BorderLayout.SOUTH); jb1.addActionListener(this); jb2.addActionListener(this); jb3.addActionListener(this); this.setBounds(10, 10, 500, 400); this.setVisible(true); }

173

Code de lapplication :Rponse au vnements


public void actionPerformed(ActionEvent e) { if(e.getSource()==jb1){ String n=jtf1.getText(); liste1.add(n); jlErr.setText("Cration d'un rcepteur"); /* A complter */ } else if(e.getSource()==jb2){ jlErr.setText("Chargement des chaines"); /* A complter */ } else if(e.getSource()==jb3){ /* A complter */ jlErr.setText("Srialisation"); } } public static void main(String[] args) { new RecepteurSWING(); } }
174

87