You are on page 1of 162

Programmation Oriente Objet java

Par M.youssfi

Quest ce que java?

Langage de programmation orient objet


Les programmes java sont multi plate-forme
Langage haute scurit
Extensible l infini
Java est utilis pour crer des programmes et
des Applets
Langage compil avec des compilateurs:

Natifs
Byte Code
JIT(Just In Time)

Diffrents modes de compilation


Natif

Byte Code

JIT

Code source

Code source

Code source

Compilation

Compilation

Compilation

Programme objet

Byte Code

Byte Code

Edition de lien
Programme.Exe

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

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

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 :

jdk12-win32.exe : Kit de dveloppement proprement dit


jre12i-win32.exe : Machine virtuelle java
jdk12-doc.zip : Documentation java

Excuter jdk12-win32.exe . JDK sera install dans


le rpertoire c:\jdk1.2 et lance automatiquement
jre12i-win32.exe pour installer la machine virtuelle
java
Utiliser WinZip pour dcompresser jdk12-doc.zip et
installer la documentation java.

Ce que contient le JDK

Les programmes ncessaire au dveloppement java


sont placs dans le rpertoire c:\jdk1.2\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.

Configuration de l environnement

La configuration de l'environnement comporte


deux aspects :
-

Le chemin d'accs aux programmes excutables.


Le chemin d'accs aux classes Java.

Ajoutez au fichier Autoexec.bat la ligne suivante la fin du


fichier :
SET PATH=C:\JDK1.2\BIN

Pour configurer le chemin d accs aux classes java, il faut dfinir la


variable d environnement CLASSPATH en ajoutant au fichier
autoexec.bat la ligne
SET CLASSPATH=[chemin].Cependant, vous n aurez pas besoin de le faire
pour le moment.

Autres outils pour dvelopper

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, Jext .
Environnement de dveloppement intgr : On peut
galement utiliser des environnement visuels et
graphiques qui simplifient normment la tache du
programmeur. Exemples : Visual Caf, Jbuilder, etc
Pour tester les applets java, vous aurez besoin d un
navigateur web ex. Internet Explorer ou Netscape.
Sinon, vous pouvez utiliser Appletviewer.exe du JDK.

Premier programme java


// Mon premier programme en Java
class PremierProgramme {
public static void main(String[] argv) {
System.out.println("Ca marche !");
}
}

Lancer un diteur de texte ASCII (exemple Bloc note ou


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

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.

Premire Applet
public class PApplet extends java.applet.Applet {
public void init() {
add(new java.awt.Label("a marche !"));
}}

Rdiger le programme source.


Enregistrer le fichier sous le nom PApplet.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="PApplet" width="200" height="150"></applet>
</body>
</html>

Vous pouvez galement AppletViewer.exe pour tester l applet :


C:\exojava>appletviewer page.htm

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

tendue

Taille

0 65 535
-128 +127
32 768 +32 767
2 147 483 648 + 2 147 483 647
de - 2 63 (+ 2 63 - 1), soit de - 9 223 372 036 854 775 808

16 bits
8 bits
16 bits
32 bits

+ 9 223 372 036 854 775 807

64 bits
32 bits
64 bits
1 bit
0 bit

de 1.4E-45 3.40282347E38
de 4.9E-324 1.7976931348623157E308
true ou false
-

Les enveloppeurs (wearpers)


Les primitives sont enveloppes dans des objets appels
enveloppeurs (Wearpers ).
Classe

Character
Byte
Short
Integer
Long
Float
Double
Boolean
Void
BigInteger BigDecimal
String

Primitive
char
byte
short
int
long
float
double
boolean
-

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;
double valeurFlottanteEnDoublePrcision;
boolean fini;
les primitives peuvent tre initialises en mme temps que la
dclaration.

int i = 12;
char c = a;
doublevaleurFlottanteEnDoublePrcision
23456.3456;
boolean fini = true;

Primitives

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.
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 surtypage.
Vers un type plus particulier. On parle alors de sous-casting ou de soustypage.

Primitives

Casting implicite: on peut faire un sur-casting


d une manire implicite.

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;

Casting explicit :

Un casting explicite peut tre effectu simplement en faisant prcder


la valeur par l'indication du nouveau type entre parenthses, par
exemple :
1: float a = (float)5.5;
2: double c = (double)a;
4: int d = 8;
5: byte f = (byte)d;

Oprateurs

Oprateur d affectation:

x=3;
x=y=z=w+5;
pour la comparaison ( if x = = 5 )

Les oprateurs arithmtiques deux oprandes


Les oprateurs arithmtiques deux oprandes sont les suivants :

+
addition

soustraction

*
multiplication

/
division

%
modulo (reste de la division)

Oprateurs

Les oprateurs arithmtiques deux oprandes

exemples de racourcis:

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

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;

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

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

Structures de contrle

L'instruction switch

la syntaxe est la suivante :


switch( variable) {
case valeur1: instructions1;break;
case valeur2: instructions2;break;
case valeur3: instructions2;break;
.
.
case valeurN: instructionsN;break;
default: instructions;break;
}

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("Vive Java !");
}

Structures de contrle

Sortie d'une boucle par return

for (int i = 0; i < 10; i++) {


if (tableau[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);
}

Structures de contrle

L instruction While

while (condition){
BlocInstructions;
}

L instruction do ..
while

do{
BlocInstructions;
}
while (condition);

Exemple :
int s=0,i=O;
while (i<10){

s+=i;
i++;
}

Exemple :
int s=0,i=O;
do{

s+=i;
i++;
}
while (i<10);

Concepts de lorient objet avec java

La programmation 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, on
se pose plus souvent la question qu'est-ce que je
manipule ? , que 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.

Concepts de lorient objet avec java

Dans ce cours de programmation oriente


objet, nous allons dcouvrir les concepts de
lorient objet implments par java savoir :

Objet et classe
Hritage
Encapsulation (Accessibilit)
Polymorphisme

Quest ce quun objet?

Un objet est une structure informatique caractrise


par un tat et un ensemble d'oprations excutables
par cet objet qui caractrise son comportement.
Objet = tat + comportement (oprations)
Exemples:
Une Fentre :

Etat : position, taille, bordure, titre, couleur,...


Oprations: dessiner, dplacer, agrandir...

Un Fichier

Etat : nom, directory, id, protections, propritaire,


contenu,.
Oprations : ouvrir, fermer, dtruire,

Reprsentation graphique dun objet en UML

Exemple un objet Voiture nomm c5


c5:Voiture
couleur=bleu
puissance=130
curburant=30

dmarrer()
acclrer()
freiner()

Etat

Comportement

Les objets ayant les mmes caractristiques


sont regroups dans une structure formelle,
appeles classe

Classe

La classe dcrit le domaine de dfinition


dobjets.
Chaque objet appartient une classe.
Les gnralits sont contenues dans la classe
alors que les particularits dans les objets.
Les objets informatiques sont construits
partir de la classe par un processus appel
instanciation.
De ce fait tout objet est une instance de
classe.

Caractristiques dune classe

Une classe est dfinie par les attributs et les


oprations (mthodes).
Attributs :

Appels galement champs, ou donnes membres,


correspondent aux proprits de la classe.
Ils sont dfinis par un nom, un type de donnes et
ventuellement une valeur initiale.
Un attribut est une variable qui stocke des donnes.

Employ
code
: int
nom
: String
nbEmploys : static int
Trois attributs de la classe Employ

Caractristiques dune classe

Attributs :

Exemple :la classe Employ caractrise par les attributs


code, nom et nbEmploys (nombre demploys)
Les attributs code et nom sont des caractristiques de
chaque objet Employ contrairement au champ nbEmploys
qui est une caractristique commune tous les objets. On
dira que nbEmploys est attribut statique.
Chaque objet, instance dune classe, donne des valeurs
particulires tous les attributs dfinis dans sa classe sauf
les attributs statiques ce qui dtermine son tat.

Employ
code
: int
nom
: String
nbEmploys : static int
Trois attributs de la classe Employ

Caractristiques dune classe

Deux objets de la classe Employ:

: Employ
code =1
nom ="jamil"

: Employ
code =2
nom ="alami "

Dfinition :

Un attribut statique dune classe est un attribut qui


appartient la classe et qui est partag par tous les objets
de cette classe. Un attribut statique est considr comme
tant une variable globale tous les objets. Les attributs
statiques ne sont pas instancis dans les objets.

Caractristiques dune classe : Mthodes

Mthodes :

Les mthodes permettent de dcrire les


comportements des objets.
Elles reprsentent des procdures ou des
fonctions qui permettent dexcuter un certain
nombre dinstructions.
Parmi les mthodes dune classe existe une
mthode particulire, qui porte le mme nom
que la classe, qui sappelle le constructeur.
Le rle du constructeur tant crer les objets
de la classe en les initialisant.

Caractristiques dune classe : Mthodes

Mthodes : Exemple

Dans lexemple prcdent, nous pourrons dfinir les


mthodes afficheCode() et afficheNom() qui affichent
respectivement le code et le nom dun employ.
Employ

Attributs :
code
: int
nom
: String
nbEmploys : static int
Constructeur :
Employ()
Mthodes :
afficheCode():void
afficheNom():void

Reprsentation graphique de
la classe Employ En UML

Caractristiques dune classe : Mthodes


Exemple dimplmentation la classe Employ avec java :
class Employe{
// Les attributs
int code ;
String nom ;
static int nbEmployes = 0 ;
//Constructeur
Employe(){
++nbEmployes ; // incrmenter le nombre dmploys
code=nbEmployes ; // affecter nbEmployes au code
}
// Les mthodes
void afficheCode(){
System.out.println("Le code est : " + code) ;
}
void afficheNom(){
System.out.println("Le nom est : " + nom) ;
}
}

Constructeur

Le constructeur d une classe est une


mthode particulire qui possde le
mme nom que la classe.
Il s excute automatiquement lors de la
cration d une instance de cette classe.
Son rle est gnralement est
d initialiser les instances d une classe.

Cration dun objet partir


dune classe

Pour crer un objet (ou instance ) partir


d une classe, on utilise la commande new
suivie du nom du constructeur de la classe

ex : new Employ();

Lobjet ainsi cr nest pas identifi par un


nom. Cest un objet qui ne peut pas tre
exploit une fois quil est cr. Cest donc un
objet perdu en mmoire.
En fait pour manipuler un objet qui nest pas
identifi par un nom, il faut faire appel lune
de ses mthode au moment de la cration:

Exemple : (new Employ()).afficheCode();

Identifier les objet avec les


handles

En java les objets sont identifis par un handle (poigne).


Pour crer un handle, on crit le nom de la classe suivi du
nom du handle : ex Employe alpha;
alpha est une variable qui est destine pointer sur une
instance de la classe Employe. Pour l instant, elle ne pointe
sur aucun objet. (alpha=null)
Pour affecter un objet au handle alpha, on utilise les deux
instruction suivantes:
Employe alpha;
alpha=new Employe();

Handle :
alpha
Addresse de lobjet

ou encore en une seule instruction:


Employe alpha=new Employe();

Objet :
:Employe
code=1
nom= "jamil "
afficheCode()
afficheNom()

Accder aux membres dun


objet

Pour accder aux membres dun objet cr, on utilise son


handle suivi dun point, puis du nom de lattribut ou de la
mthode.
Exemple :

appha.nom= "jamil " ;


alpha.afficheNom() ;
System.out.println(alpha.code) ;
System.out.println(alpha.nbEmployes) ;
System.out.println(Employe.nbEmployes) ;

Les membre statiques sont accessibles en utilisant soit le


handle dun objet quelconque de la classe, soit directement
le nom de la classe.

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.

Exemple Test
class TestEmploye{
public static void main(String[] args){
new Employe();
Employe e2 ;
e2=new Employe();
Employe e3=new Employe();
e2.nom="Jamil";
e2.afficheCode();
e2.afficheNom();
e3.afficheCode();
System.out.println("Nombre d'employs en utilisant l'objet e2="+e2.nbEmployes);
System.out.println("Nombre d'employs en utilisant l'objet e3="+e3.nbEmployes);
System.out.println("Nombre d'employs en utilisant la classe Employe="+Employe.nbEmployes);
}
}

Exemple Test
class Employ
Attributs :
code : int
nom : String
nbEmploys : static int =2
Constructeur :
Employ()
Mthodes :
afficheCode()
afficheNom()

new Employe() ;
:Employe
Attributs :
code =1
nom =null

Employe e2 ;
e2=new Employe() ;
e2:Employe
Attributs :
code =2
nom =Jamil

afficheCode()
afficheNom()

afficheCode()
afficheNom()

Premier Objet

Deuxime Objet

Employe e3=new Employe() ;


e3:Employe
Attributs :
code =3
nom =null

afficheCode()
afficheNom()

Troisime Objet

Exercice1:Modlisation d un segment
class Segment
extr1

extr2

int extr1

int extr2

Segment(int a, int b)

Un segment est dfini par les valeurs de ces


deux extrmits extr1 et extr2. Pour crer un
segment, il faut prciser les valeurs des deux
extrmits. Les oprations que lon souhaite
excuter sur ce segment sont les suivantes:

ordonne() : mthode sans paramtres qui


permet d ordonner les valeurs de extr1 et
extr2
int longueur() :mthode qui revoie la
longueur du segment.
boolean appartient(int x) qui renvoie true si
x appartient au segment, false sinon.
String toString() : mthode qui renvoie une
chane de caractres se composant de
segment[ext1,extr2]

void ordonne()
int longueur()
boolean appartient(int x)

String toString()

Exercice1:Modlisation d un segment

Questions:

extr1

extr2

Ecrire le code de la classe Segment


Ecrire le code de la classe TestSegment qui contient la
fonction main(String argv[]) qui traduisant le actions
suivantes:

Rcuprer les 3 paramtres envoys sur ligne de commande


lors de l excution du programme. Les deux premiers
paramtres e1 et e2 sont supposs tre la premire et la
deuxime extrmit du segment tandis que le troisime p
reprsente le point pour lequel nous voulions savoir s il
appartient au segment ou non.
Crer une instance de la classe Segment en utilisant les valeurs
des deux premiers paramtres e1 et e2
Afficher la valeur de la mthode toString() de cette instance.
Afficher la longueur du segment.
Afficher si le point p appartient au segment cr ou non.
Changer les valeurs des champs extr1 et extr2 avec des valeurs
quelconques
Afficher nouveau la longueur du segment.

Concepts de lhritage

Considrons le modle suivant:


Object
Animal

Chien

Teckel

Labrador

Chat

Caniche

Canari

Concepts de lhritage

Animal
Attributs :
vivant
: boolean
ge
: int

Constructeur :
Animal(int a)
Mthodes :

crie()
vieillit()
meurt()

La classe Animal peut s crire :


class Animal {
boolean vivant;
int ge;
Animal (int a) {
ge = a;
vivant = true;
}
void vieillit() {
++ge;
}
void meurt() {
vivant = false;
}
void crie() {
}
}

Dans ce cas, la cration d'un Animal se ferait l'aide de l'instruction suivante :


Animal nouvelAnimal = new Animal(3);

L'hritage

La classe Canari hrite de la classe Animal.


Pour faire l hritage avec java, on emploi la
commande extends.
class Canari extends Animal{
}

La classe canari hrite de la classe Animal


tous ses membres sauf le constructeur. Il
faudra doc redfinir le constructeur de la
classe Canari.

L'hritage

Rfrence la classe parente:

Pour viter de rcrire le mme code du constructeur de la classe Animal,


on fera rfrence la classe parente en utilisant le mot super
La classe Canari devient:
class Canari extends Animal{
Canari(int a){
super(a);
}
}

Redfinition des mthodes:

La classe Canari hrite de la classe Animal la mthode crie() qui


est vide.
On peut redfinir cette mthode du moment que nous connaissons
le cri d un canari.
La classe Canari devient:
class Canari extends Animal{
Canari(int a){
super(a);
}
void crie() {
System.out.println("Cui-cui !");
}
}

Surcharge

Surcharger une mthode:

La classe Animal possde une mthode vieillit() sans paramtre et


qui incrmente l ge d une unit .
Nous pouvons ajouter la classe Animal une autre mthode qui
porte le mme nom mais qui possde un paramtre a qui indique
le nombre d annes ajouter pendant l anniversaire de l animal.
Voici le code des deux mthodes:
void vieillit() {
++ge;
System.out.println("C'est l'anniversaire de
System.out.println("Il a maintenant " + ge
}
void vieillit(int a) {
ge += a;
System.out.println("C'est l'anniversaire de
System.out.println("Il a maintenant " + ge
}

cet animal.");
+ " an(s).");

cet animal.");
+ " an(s).");

Surcharge

Pour viter de rcrire les mmes instructions dans les


deux mthodes, on peut constater que la mthode
vieillit() est un cas particulier de la mthode vieillit(int a).
Les deux mthodes scriront alors:
void vieillit() {
vieillit(1)
}
void vieillit(int a) {
ge += a;
System.out.println("C'est l'anniversaire de cet animal.");
System.out.println("Il a maintenant " + ge + " an(s).");

Lappel des deux mthodes peut se faire comme suit:

Animal a1=new Animal(3);


a1.vieillit();
a1.vieillit(6);

Surcharge

Signature d une mthode .


La signature d'une mthode dsigne la liste de ses
paramtres avec leur type.

Les deux mthode vieillit(int a) et vieillit() ont le


mme nom et deux signatures diffrentes.
Les deux mthodes suivantes:

mthode(int a, long b)
mthode(long b, int a)

ont deux signatures diffrentes.

Alors que les mthodes :


mthode(int a, long b) et mthode(int
c, long d)

Surcharge

Surcharger le Constructeur.
Les constructeurs peuvent galement tre surchargs.
On peut crer deux constructeurs pour la classe Animal:
Animal() {
this(1);
}
Animal(int a) {
ge = a;
vivant = true;
System.out.println("Un animal de " + a
+ " an(s) vient d'tre cr");
}

On pourra crer une instance de la classe Animal en utilisant l un


des deux constructeurs:

Animal A1=new Animal();


Animal A2= new Animal(4);

Surcharge

Surcharger le Constructeur.
On peut galement constater que le premier
constructeur est un cas particulier du deuxime.
Un constructeur peut appeler un autre en
utilisant le mot this qui dsigne lobjet courant.
Animal() {
this(1)
}
Animal(int a) {
ge = a;
vivant = true;
System.out.println("Un animal de"+a+"an(s) cr");
}
Animal A1=new Animal();
Animal A2= new Animal(4);

Les constructeurs par


dfaut

Java

fournit

automatiquement
un
constructeur par dfaut.
Le constructeur par dfaut est le suivant :
NomDeLaClasse() {}

Rsum

Pour quune classe hrite dune autre, on utilise le mot extends.


Une classe peut hriter dune autre tout sauf les constructeurs.
Il faut toujours dfinir le constructeur de la nouvelle classe drive.
Le constructeur de la nouvelle classe drive peut faire appel au
constructeur de la classe parente en utilisant le mot super suivi des
valeurs des arguments entre parenthse.
Lors de lhritage, la nouvelle classe drive peut redfinir les
mthodes hrites de la classe parente.
Dans une classe, on peur surcharger une mthode : On peut crer
plusieurs mthodes qui ont le mme nom, mais avec des signatures
diffrentes.
Dans une classe on peut galement surcharger le constructeur : On
peut crer plusieurs constructeurs avec des signatures diffrentes.
Un constructeur peut faire appel un autre constructeur dans la mme
classe en utilisant le mot this suivi des valeurs des arguments entre
parenthses.
Si vous ne dfinissez pas un constructeur dans votre classe, le
compilateur java dfinit un constructeur par dfaut.

class TestAnimaux {
public static void
main(String[] args) {
Canari titi = new Canari(3);
Canari mimi=new Canari() ;
titi.ageMaxi=5 ;
titi.vieillit();
titi.crie();
titi.vieillit(4);
mimi.vieillit(5);
mimi.crie() ;
}
}

class Animal {
boolean vivant;
int ge;
int geMaxi = 10;
Animal(int a) {
ge = a;
vivant = true;
System.out.println("Un animal de " + a
+ " an(s) vient d'tre cr");
}
Animal() {
this(1);
}

Programme Test
void vieillit(int a) {
ge += a;
if (ge > geMaxi)
meurt();
else{
System.out.println("C'est l'anniversaire
de cet animal.");
System.out.println("Il a maintenant " +
ge + " an(s)");
}
}
void vieillit() {
vieillit(1);
}
void meurt() {
vivant = false;
System.out.println("Cet animal est
mort");
}
void crie() {
}
}

class Canari extends Animal {


Canari(int a) {
super(a);
}
Canari() {
this(1);
}
void crie() {
System.out.println("Cui-cui !");
}
}

Exercice2 : Comptes Bancaires

Un compte bancaire possde tout moment une


donne : son solde. Ce solde peut tre positif
(compte crditeur) ou ngatif (compte dbiteur).
Chaque compte est caractris par un code
incrment automatiquement.
A sa cration, un compte bancaire a un solde initial et
un code incrment.
Utiliser son compte consiste pouvoir y faire des
dpts et des retraits. Pour ces deux oprations, il
faut connatre le montant de l'opration.
L'utilisateur peut aussi consulter le solde de son
compte par la mthode getSolde().

Exercice2 : Comptes Bancaires

Faire une reprsentation graphique de la classe


Compte
Ecrire le code java de la classe Compte
Ecrire le code java de la classe TestCompte qui
contient la fonction main() qui excute les actions
suivantes:

Crer un compte avec un solde de 40000


Crer un compte avec un solde de 3000
Faire des retraits des versements sur les deux
comptes.
Afficher ltat des deux comptes

Exercice3 : Comptes Bancaires


CompteBancaire
solde : rel
code : entier
CompteBancaire()

CompteBancaire(soldeInitial : rel)
deposer(montant : rel)
retirer(montant : rel)
getSolde() : rel

Figure 1 : modle objet de la classe CompteBancaire

Exercice2 : Comptes Bancaires

Un compte bancaire possde tout moment une donne : son solde.


Ce solde peut tre positif (compte crditeur) ou ngatif (compte
dbiteur).
Chaque compte est caractris par un code incrment
automatiquement.
A sa cration, un compte bancaire a un solde nul et un code
incrment.
Il est aussi possible de crer un compte en prcisant son solde initial.
Utiliser son compte consiste pouvoir y faire des dpts et des retraits.
Pour ces deux oprations, il faut connatre le montant de l'opration.
L'utilisateur peut aussi consulter le solde de son compte par la mthode
toString().
Un compte Epargne est un compte bancaire qui possde en plus un
champ TauxIntert =6 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 varsement est payante et vaut 5 dh

Exercice3 : Comptes Bancaires


Questions :

Faire le diagramme des classes


Dfinir la classe CompteBancaire .
Dfinir la classe CompteEpargne.
Dfinir la classe ComptePayant.
Dfinir une classe contenant la fonction main() permettant de tester les classes
CompteBancaire et CompteEpargne avec les actions suivantes:
Crer une instance de la classe CompteBancaire , une autre de la classe
CompteEpargne et une instance de la classe ComptePayant
Faire appel la mthode deposer() de chaque instance pour dposer une
somme quelconque dans ces comptes.
Faire appel la mthode retirer() de chaque instance pour retirer une somme
quelconque de ces comptes.
Faire appel la mthode calculIntert() du compte Epargne.
Afficher le solde des 3 comptes.

Accessibilit

Dans les chapitres prcdents, tous les


identificateurs que nous avons utiliss taient
accessibles pratiquement sans restriction.
Les variables pouvaient tre lues et modifies sans
contraintes.
Les classes pouvaient tre instancies volont.
En usage normal, cette situation est dangereuse.
Par exemple, si vous concevez une classe pour la
mettre la disposition de programmeurs, il est
souhaitable que vous puissiez exercer un certain
contrle sur la faon dont ceux-ci pourront l'utiliser.

Accessibilit : Exemple

Voiture
capacite
carburant

On considre l exemple d une voiture caractrise par:


la capacit du rservoir
la quantit du carburant
Il est vident que le champ capacit est une caractristique
commune toutes les voitures. Il devra donc tre dclar
statique.
En plus les utilisateurs ne doivent pas avoir la possibilit de
modifier cette la valeur de capacit.
En revanche, il serait utile de leurs donner la possibilit de
lire cette valeur.
Il est aussi vident que les utilisateurs de cette classe
doivent avoir la possibilit de lire et de modifier la valeur du
champ carburant.

Accessibilit :
Exemple

Voiture
capacite

getCapacite()

carburant

getCarburant()
setCarburant(int c)

Il faudra galement s assurer que l utilisateur ne puisse pas donner une


valeur au champ carburant qui dpasse la capacit de la voiture.
Nous pourrions dfinir deux mthodes capacite() et carburant()
permettant de renvoyer respectivement les valeurs de capacite et
carburant.
Ce genre de mthodes s appellent Accesseurs .
Gnralement, le nom de ces mthodes commencent par get : on
nommera alors les mthodes capacite() et carburant() resp. getCapacite()
et getCarburant().
Nous pourrions galement dfinir une mthode qui permet de modifier la
valeur de carburant nomme setCarburant(int c).
Ce genre de mthodes s appellent mutateur . Le nom de ces
mthodes commencent gnralement par set.

Accessibilit : Exemple
Voiture

v1:Voiture

- carburant : int
- capacit :int

- carburant =0

+ Voiture()
+ setCarburant(int c) : void
+ getCarburant() :int
+ getCapacite() :int

+ Voiture()
+ setCarburant(int c) : void
+ getCarburant() :int
+ getCapacite() :int

class Parc{
public static void main(String[] args){
Voiture v1=new Voiture();
v1.carburant=20; // interdit
v1.setCarburant(20) ; // solution
int car=v1.carburant ; // interdit
int car=v1.getCarburant() ; Solution
v1.capacite=100 ; // interdit de modifier
System.out.println(v1.capacite) ;interdit
System.out.println(v1.getCapacite()); Sol.
}
}

class Voiture{
private int carburant ;
private static int capacite=80 ;
Voiture(){
carburant=0 ;
}
public void setCarburant(int c){
if ((c<capacite)&&(c>0))
carburant=c ;
}
public int getCarburant(){
return carburant;
}
public int getCapacite(){
return capacite;
}
}

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

Les packages (O)


Dans l'exemple du programme utilisant la classe Employe , la
mthode afficherCode()
utilise une classe appele System :
void afficherCode() {
System.out.println(matricule);
}

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

Les packages (O)

Les packages (O)

Java dispose d'un mcanisme pour la recherche des classes.


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

Sous Windows, la variable d'environnement CLASSPATH peut tre


dfi-nie l'aide de la commande :
set classpath=.;c:\programmation\java;c:\appli\java\util
Sous Unix, la syntaxe utiliser est :
setenv classpath .:/home/programmation/java:/home/appli/java/util

Les packages (O)

L'instruction 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.

Les packages (O)

L'instruction package:

L'indication du package ne suffit pas. En effet, les fichiers .class


rsultant de la compilation ne sont pas placs automatiquement dans
le rpertoire correspondant.
En revanche, leur appartenance un package est code dans le fichier
compil, qui ne peut plus tre utilis autrement que depuis le chemin
d'accs correspondant.
Exemple :Compilez les deux fichiers Employe.java et Test.java
suivants:

package monpackage;
public class Test {
public class Employe { public static void main(String[] argv) {
int matricule;
new monpackage.Employe();
static int nombre;
}
public Employe() {
}
matricule = ++nombre;
afficherMatricule();
}
void afficherMatricule() {
System.out.println(matricule);
}
}

Les packages (O)

Tout se passera bien la compilation du premier, mais vous


obtiendrez un message d'erreur la compilation du second :

Test.Java:3: Class monpackage.Employe not found in type declaration.


new monpackage.Employe();
^
1 error

Cela est tout simplement d au fait que, la classe Employe tant


dclare appartenir au package monpackage, le fichier
Employe.class doit se trouver dans le rpertoire correspondant,
alors qu'il se trouve pour l'instant dans le rpertoire courant, tout
comme le fichier Test.class.
Pour que la classe Test puisse tre compile, il suffit de dplacer le
fichier Employe.class dans un rpertoire appel monpackage,
que vous devez crer pour l'occasion dans un des rpertoires
accessibles par dfaut.
Crer ce rpertoire dans le rpertoire en cours et dplacez le fichier
Employe.class dans ce rpertoire.

Les packages (O)

Placement automatique des fichiers .class dans


les rpertoires correspondant aux packages

Plutt que de dplacer manuellement les fichiers .class, vous


pouvez demander au compilateur de le faire pour vous, grce
l'option de compilation -d rpertoire.
La commande suivante:

javac -d . Employe.java

permet de:

placer le fichier Employe.class dans le rpertoire correspondant


son package. C est dire dans le rpertoire monpackage du
rpertoire en cours. Option -d .
Si le rpertoire monpackage n est pas cr l avance, l option
-d . le cre automatiquement dans le rpertoire en cours.

Les packages (O)

Application:

Enregistrer les deux fichiers suivants sous les noms Employe.java et


Test.java dans le rpertoire c:\javapack2.

package a.b.c;
public class Employe {
int matricule;
static int nombre;
public Employe() {
matricule = ++nombre;
afficherMatricule();
}
void afficherMatricule() {
System.out.println(matricule);
}
}

public class Test {


public static void main(String[] argv) {
new a.b.c.Employe();
}
}

Compiler le fichier Employe.java sur ligne de commande:


c:\javapack>javac -d . Employe.java
Compiler ensuite le fichier Test.java sur ligne de commande :
c:\javapack>javac Test.java
Executer le fichier Test.class sur ligne de commande:
c:\javapack>java Test

Les packages (O)

Chemin d'accs par dfaut pour les


packages

Par dfaut, c'est--dire en l'absence de toute


dfinition de la variable CLASSPATH, deux chemins
d'accs sont utiliss pour rechercher les packages :
Le rpertoire courant (pour toutes les classes).
Le chemin d'accs des classes standard Java.
(/jdk1.2/jre/lib/) o se trouvent tous les packages
(fichiers .jar)

Les packages (O)

L'instruction import

Dans un programme, il peut tre pnible de systmatiquement faire


rfrence une classe en indiquant explicitement le package auquel
elle appartient.
Ainsi, si votre programme cre une instance de la classe Button, vous
devez utiliser la syntaxe :

Une autre faon de procder consiste rendre la classe Button


disponible dans votre programme au moyen de l'instruction :

import java.awt.Button;

Cette instruction n'a pas pour effet de charger la classe Button, mais
simplement de la rendre disponible de faon plus simple.
Vous pouvez alors y faire rfrence sous la forme :

java.awt.Button bouton = new java.awt.Button();

Button bouton = new Button();

Si vous voulez "importer" toutes les classes d'un package, vous pouvez
utiliser la syntaxe : import java.awt.*;
Ainsi, toutes les classes du package java.awt seront accessibles sans
qu'il soit besoin de spcifier leur chemin d'accs.

Les packages (O)

Packages accessibles par dfaut


Deux packages sont accessibles par dfaut. Ce sont, par ordre
de priorit :
Le package java.lang, qui contient un certain nombre de
classes d'usage gnral comme System, que nous avons
dj utilise frquemment, ou Math, qui contient des
mthodes permettant d'effectuer des calculs
mathmatiques.
Le "package par dfaut", qui contient toutes les classes pour
lesquelles aucun package n'a t indiqu, et qui se trouve
dans un des rpertoires accessibles par dfaut.
Attention : La spcification d'un chemin d'accs pour les classes
l'aide de la variable d'environnement CLASSPATH rend le
rpertoire courant inaccessible par dfaut (obligeant ajouter
explicitement une rfrence ce rpertoire dans la variable). En
revanche, le chemin d'accs au package java.lang, ainsi
qu'aux autres packages standard de Java n'est pas affect par
la dfinition de CLASSPATH.

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 2 sur le disque C:, le chemin d'accs complet la
classe System est donc : c:\jdk1.2\jre\lib\rt.jar\java\lang\System

Les packages (O)

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 :

jar cf archive.jar a

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.

Ce qui peut tre fait(static)

Java dispose de mots cls permettant de modifier la


faon dont les lments peuvent tre utiliss.

static :

Un lment dclar static appartient une classe et non


ses instances.
Dans l'exemple cit au dbut de ce chapitre, la primitive
capacit aurait t dclare static. Les objets instancis
partir d'une classe ne possdent pas les lments de
cette classe qui ont t dclars static.
Un seul lment existe pour la classe et il est partag par
toutes les instances.
Cependant, cela ne limite pas l'accessibilit, mais
conditionne simplement le rsultat obtenu lors des accs.

Ce qui peut tre fait(static)

Les variables static

Si la classe Voiture contient la primitive statique capacit et la


primitive non statique carburant, et si nous instancions cette
classe pour crer l'objet maVoiture, cet objet possde sa
propre variable carburant, laquelle il est possible d'accder
grce la syntaxe :
maVoiture.carburant
L'objet maVoiture ne possde pas de variable capacit.
Normalement, capacit appartient la classe Voiture, et il est
possible d'y accder en utilisant la syntaxe :
Voiture.capacit
Cependant, Java nous permet galement d'utiliser la syntaxe :
maVoiture.capacit

Ce qui peut tre fait(static)

Les mthodes static

class Voiture{
private int carburant ;
private static int capacite=80 ;
Voiture(){
carburant=0 ;
}
public setCarburant(int c){
if ((c<capacite)&&(c>0))
carburant=c ;
}
public int getCarburant(){
return carburant;
}
public static int getCapacite(){
return capacite;
}
}

La mthode getCapacit() peut tre


dclare static car elle ne fait rfrence
qu' des membres static .
Ce n'est pas une obligation. Le
programme fonctionne aussi si la
mthode n'est pas dclare static. Dans
ce cas,la mthode est duplique chaque
fois qu'une instance est cre, ce qui
n'est pas trs efficace.
Comme dans le cas des variables, les
mthodes static peuvent tre rfrences
l'aide du nom de la classe ou du nom de
l'instance.

Ce qui peut tre fait(final)

final
Java ne dispose pas de constantes.
Ce n'est pas une limitation, car Java dispose d'un
mcanisme beaucoup plus puissant qui permet non
seulement d'utiliser une forme de constantes, mais
galement d'appliquer ce concept d'autres lments
comme les mthodes ou les classes.
Les variables final
Une variable dclare final ne peut plus voir sa valeur
modifie.
Ex : final float pi = 3.14;
Les variables final non initialises

Ce type de variable peut tre initialis ultrieurement.


Une fois l'initialisation effectue, la valeur ne peut plus tre
modifie.
Exemple de dclaration : final int a;

Ce qui peut tre fait(final)

Les mthodes final

Les mthodes final ne peuvent pas tre redfinies


dans les classes drives.
Exemple :
final int calcul (int i, in j) {
//code
}

Les classes final

Une classe peut galement tre dclare final,


dans un but de scurit ou d'optimisation.
Une classe final ne peut pas tre tendue pour
crer des sous-classes.
Par consquent, ses mthodes ne peuvent pas
tre redfinies

Ce qui peut tre fait(abstract)

abstract

Une mthode dclare abstract ne peut pas tre excute.


En fait, elle n'a pas d'existence relle. Sa dclaration indique
simplement que les classes drives doivent la redfinir.
Ainsi, dans l'exemple Animaux, la mthode crie() de la
classe Animal aurait pu tre dclare abstract :
abstract void crie();
Une classe qui contient une mthode abstract doit tre
dclare abstract elle-mme.
Une classe abstract ne peut pas tre instancie.
Une classe peut tre dclare abstract, mme si elle ne
comporte pas de mthodes abstract.
Pour pouvoir tre instancie, une sous-classe d'une classe
abstract doit redfinir toutes les mthodes abstract de la
classe parente.
Si une des mthodes n'est pas redfinie de faon concrte,
la sous-classe est elle-mme abstract et doit tre dclare
explicitement comme telle.
Les mthodes abstract n'ont pas de dfinition. Leur
dclaration doit tre suivie d'un point-virgule.

Les Interfaces

Une classe peut contenir des mthodes abstract et des mthodes


non abstract.
Cependant, il existe une catgorie particulire de classes qui ne
contient que des mthodes abstract. Il s'agit des interfaces.
Les interfaces sont toujours abstract, sans qu'il soit ncessaire de
l'indiquer explicitement.
De la mme faon, il n'est pas ncessaire de dclarer leurs
mthodes abstract.
Les interfaces obissent par ailleurs certaines rgles
supplmentaires:
Elles ne peuvent contenir que des variables static et final.
Elles peuvent tre tendues comme les autres classes, avec une
diffrence majeure : une interface peut driver de plusieurs
autres interfaces.
Une classe drive toujours d'une autre classe et peut driver, en
plus, d'une ou de plusieurs interfaces.

Les Interfaces

Dfinition dune interface qui hrite de plusieurs interfaces :

interface nomInterface extends interf1, interf2,interface3,.{


MAX=3 ;
MIN=1 ;
.
void afficher() ;
int getNom() ;
.
}

Dfinition dune classe qui hrite dune autre classe et de


plusieurs interfaces :

class maClasse extends autreClasse implements interf1,interf2,interf3,{


}

Ce qui peut tre fait (Autres


modificateurs)

transient

synchronized :

(Voir Threads)

native

( voir Srialisation)

(mthode crite dans un autre langage)

Volatile

(ne fait pas objet doptimisation)

Ce qui peut tre fait(Quoi)

native

Une mthode peut galement tre dclare native, ce qui a


des consquences importantes sur la faon de l'utiliser.
En effet, une mthode native n'est pas crite en Java, mais
dans un autre langage.
Les mthodes native ne sont donc pas portables d'un
environnement un autre.
Les mthodes native n'ont pas de dfinition. Leur
dclaration doit tre suivie d'un pointvirgule.

transient

Le mot cl transient s'applique aux variables d'instances


(primitives et objets). Il indique que la variable
correspondante est transitoire et que sa valeur ne doit pas
tre conserve lors des oprations de srialisation.
La srialisation permet d'enregistrer sur disque un objet
Java afin de le conserver pour une session ultrieure, ou de
l'envoyer travers un rseau.
Lors de la srialisation, tous les champs de l'objet sont
sauvegards l'exception de ceux dclars transient.

Ce qui peut tre fait(Quoi)

volatile

Le mot cl volatile s'applique aux variables pour


indiquer qu'elles ne doivent pas tre l'objet
d'optimisation.
En effet, le compilateur effectue certaines
manipulations pour acclrer le traitement.
Par exemple, certaines variables peuvent tre
recopies dans une zone de mmoire dont l'accs
est plus rapide. Si, pendant ce temps, un autre
processus modifie la valeur de la variable, la
version utilise risque de ne pas tre jour.
Il est donc possible d'empcher cette optimisation
par mesure de scurit.
Evidemment, cela ne concerne que les
programmes utilisant plusieurs processus
simultans.
Nous y reviendrons dans un prochain chapitre.

Qui peut le faire (Qui)

En Java, il existe quatre catgories


d'autorisations d'accs, spcifies par les
modificateurs suivants :

private
protected
public
package

Qui peut le faire


(Qui):public (+)

Les classes, les interfaces, les variables (primitives ou


objets) et les mthodes peuvent tre dclares
public.
Les lments public peuvent tre utiliss par
n'importe qui sans restriction.
Certains lments doivent imprativement tre
public.

Ainsi, la classe contenant la mthode main().


Les accesseurs et les mutateurs sont le plus souvent
dclars public alors que l'accs direct aux variables est plus
restreint. Cela permet de contrler la faon dont les
variables sont modifies.

Qui peut le faire


(Qui):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.

Cette autorisation s'applique uniquement aux membres de


classes, c'est--dire aux variables (primitives et objets), aux
mthodes et aux classes internes.
Les classes qui ne sont pas membres d'une autre classe ne
peuvent pas tre dclares protected.

Qui peut le faire


(Qui):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.
Les classes drives ne peuvent donc y accder que
si elles ont t explicitement dclares dans le mme
package.

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 mutateur
ou d'un accesseur.
Les mutateurs et les accesseurs, de leur ct, sont dclars
public afin que tout le monde puisse utiliser la classe. Ainsi,
comme le montre l exemple suivant:

Exercice

Un parc auto se compose des voitures et des camions qui ont des caractristiques
communes regroupes dans la classe Vehicule.
Chaque vhicule est caractris par son matricule, lanne de son modle, son prix.
Tous les vhicules ont le nombre de roues gale 4.
Lors de la cration dun vhicule, son matricule est incrment selon le nombre de vhicules
crs.
Tous les attributs de la classe vhicule sont supposs privs. ce qui oblige la cration des
accsseurs (get) et des mutateurs (set.).
La classe Vehicules possde galement deux mthodes abstraites demarrer() et accelerer()
qui seront dfinies dans les classes drives et qui afficheront des mssages personnaliss.
La mthode toString() de la classe Vehicule retourne une chane de caractres qui contient
les valeurs du matricule, de lanne du modle et du prix.
Les classes Voiture et Camion tendent la classe Vehicule en dfinissant concrtement les
mthodes accelerer() et demarrer() en affichant des messages personnaliss.
Les trois classes prcdentes appartiennent un package nomm igsi.parc
Crer la classe Vehicule.
Crer la classe Voiture.
Crer la classe Camion.
Crer une classe Test qui appartient au package par dfaut et qui permet de tester la classe
Voiture et la classe Camion.

Autorisation daccs aux constructeurs :

class Lapin {
private static int nombre = 0;
private static int maxi = 3;
private boolean vivant = true;
private Lapin() {
System.out.println("Un lapin vient de natre.");
System.out.println("Vous possdez " + (++nombre) + "
lapin(s).");
}
public void passeALaCasserole() {
if (vivant) {
vivant = false;
System.out.println("Un lapin vient de passer la
casserole.");
System.out.println("Vous possdez " + (--nombre) + "
lapin(s).");
}
else {
System.out.println("Ce lapin a dj t mang !");
}
}

public static Lapin creerLapin(){


if (nombre < maxi) {
return new Lapin();
}
else {
System.out.println("Elevage
surpeupl. Naissance
impossible.");
return null;
}
}
}
public class Elevage {
public static void main(String[]
argv) {
Lapin l1=new Lapin(); //interdit
Lapin l1 = Lapin.creerLapin();
Lapin l2 = Lapin.creerLapin();
Lapin l3 = Lapin.creerLapin();
Lapin l4 = Lapin.creerLapin();
}
}

Rsum

Vous connaissez maintenant les principaux


modificateurs qui peuvent tre utiliss avec les
classes, les mthodes et les variables Java. En effet
les trois critres permettant d'utiliser une classe sont
Qui, Quoi, O. Il faut donc :
Que l'utilisateur soit autoris (Qui). (public,
protected, package, private )
Que le type d'utilisation souhait soit autoris
(Quoi).( static, final, abstract, synchronized, native,
transient, volatil)
Que l'adresse de la classe soit connue (O). (les
packages )
Nous allons pouvoir aborder la partie intressante de
notre tude. Le prochain chapitre sera consacr au
polymorphisme, qui est un des aspects les plus
fascinants de la Programmation Oriente Objet Java.

Rsum (les packages)

Un package est un dossier qui contient un ensemble


de classes (fichiers.class) qui est souvent archiv
dans un fichier.jar
Pour utiliser une classe, il faut connatre dans quel
package se trouve cette classe
Pour quune classe cre appartienne un package,
il faut utiliser linstruction package suivie du nom du
package au dbut du fichier de la classe.
Pour viter dindiquer chaque fois le nom du
package chaque utilisation dune classe de ce
package, on utilise linstruction import

Rsum (static)

Un attribut static dune classe est un attribut qui


appartient la classe et partag par tous les objets
de cette classe ( on lappelle aussi variable de classe)
Une mthode static dune classe est une mthode qui
appartient la classe et partage par tous les objets
de cette classe
Les membres (attribut ou mthode) static dune
classe sont accessibles via le nom de la classe ou via
un objet quelconque de cette classe.
Une mthode static dune classe ne peut manipuler
que les membres static de cette classe.
En UML les membres statiques sont souligns

Rsum (final)

Une variable final dune classe est une


variable qui ne peut pas changer de
valeur (constante)
Une mthode final dune classe est une
mthode qui ne peut pas tre redfinie
dans les classes drive de cette classe
Une classe final est une classe qui ne
peut pas tre tendue (pas dhritage)

Rsum (abstract)

Une mthode abstract est une mthode qui


na pas de dfinition (qui ne sexcute pas).
Elle doit tre redfinie pas les classes
drives.
Une classe abstract est une classe qui ne
peut pas tre instancie.
Une classe abstract qui ne contient que des
mthodes abstract est appele Interface

Qui peut le faire


(Qui):public (+)

Les classes, les interfaces, les variables (primitives ou


objets) et les mthodes peuvent tre dclares
public.
Les lments public peuvent tre utiliss par
n'importe qui sans restriction.
Certains lments doivent imprativement tre
public.

Ainsi, la classe contenant la mthode main().


Les accesseurs et les mutateurs sont le plus souvent
dclars public alors que l'accs direct aux variables est plus
restreint. Cela permet de contrler la faon dont les
variables sont modifies.

Qui peut le faire


(Qui):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.

Cette autorisation s'applique uniquement aux membres de


classes, c'est--dire aux variables (primitives et objets), aux
mthodes et aux classes internes.
Les classes qui ne sont pas membres d'une autre classe ne
peuvent pas tre dclares protected.

Qui peut le faire


(Qui):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.
Les classes drives ne peuvent donc y accder que
si elles ont t explicitement dclares dans le mme
package.

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 mutateur
ou d'un accesseur.
Les mutateurs et les accesseurs, de leur ct, sont dclars
public afin que tout le monde puisse utiliser la classe. Ainsi,
comme le montre l exemple suivant:

Rsum (public)

Un membre public dune classe peut


tre utilis par nimporte quelle autres
classe.
En UML le membres public sont
indiqus par le signe +

Rsum (protected)

Un membre protected dune classe ne


peut tre utilis que par autres classe.
En UML le membres public sont
indiqus par le signe +

Exercice : Vhicules

On considre un parc de moyens de transport constitu par :

Des voitures
Des camions
Des Autocars

Vhicule

Voiture

Camion

Autocars

Le problme doit rpondre aux critres suivants :


Le parc ne doit pas dpasser un nombre limit de voitures (nbMaxVoitures), un
nombre limit de camions (nbMaxCamions), un nombre limit dautocars
(nbAutocars).
Chaque type de vhicule possde un matricule incrment selon le type
Pendant la cration dun vhicule, il faut prciser lanne du modle.
Chaque type vhicule possde une capacit du rservoir.
Chaque vhicule possde une quantit de carburant
Les vhicules sont destins la vente
Les vhicules peuvent tre en panne ou nom
Les quatre classes Vhicule, Voiture, Camion et Autocar appartiennent au mme
package transport

Exercice : Vhicules
Questions:

Etablir le diagramme de classes


Ecrire le code java de la classe Vhicule
Ecrire le code java de la classe Camion
Ecrire le code java de la classe Autocar
Ecrire un programme Test

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

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

Polymorphisme

Instanciation et hritage

Soit lexemple suivant

public class Polymorphisme {


public static void main(String[] argv) {
Pomme pomme = new Pomme(85);
Orange orange = new Orange(107);
pse(orange);
}
static void pse(Fruit f) {
int p = f.poids;
System.out.println("Ce fruit pese " + p + "
grammes.");
}
}

abstract class Fruit {


int poids;
Fruit() {
System.out.println("Creation d'un Fruit.");
}
}
class Pomme extends Fruit {
Pomme(int p) {
poids = p;
System.out.println("Creation d'une Pomme.");
}
}
class Orange extends Fruit {
Orange(int p) {
poids = p;
System.out.println("Creation d'une Orange.");
}
}

Polymorphisme

Le rsultat
est:
Cration
Cration
Cration
Cration
Ce fruit

affich

par

le

programme

d'un Fruit.
d'une Pomme.
d'un Fruit.
d'une Orange.
pese 107 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
La partie la plus intressante du programme se
trouve la dernire ligne de la mthode main. Celleci appelle la mthode pse avec un argument
apparemment de type Orange: pse(orange);

Polymorphisme

Or, il n'existe qu'une seule version de la mthode


pse et elle prend un argument de type Fruit:static
void pse(Fruit f) {

pourtant l excution se passe sans


problme
En effet, l'objet pass la mthode est certes de
type Orange, mais galement de type Fruit. L'objet
point par le handle orange peut donc tre affect
sans problme au paramtre f, qui est dclar de
type Fruit.
Le fait d'tablir le lien entre l'objet et la classe
parente (Fruit) est un sur-casting.
Le sur-casting est effectu automatiquement par Java
lorsque cela est ncessaire (sur-casting implicite).
Sans le sur-casting, il nous faudrait crire une mthode pour
peser les oranges et une autre pour peser les pommes.

Polymorphisme

Le sous-casting

public class Polymorphisme {


public static void main(String[] argv) {
Pomme pomme = new Pomme(85);
Orange orange = new Orange(107);
pse(orange);
}
static void pse(Fruit f) {
int p = f.poids;
System.out.println("Ce fruit pese " + p + " grammes.");
quoi(f);
}
static void quoi(Pomme p) {
System.out.println("C'est une Pomme.");
}
static void quoi(Orange o) {
System.out.println("C'est une Orange.");
}
}

class Pomme extends Fruit {


Pomme(int p) {
poids = p;
System.out.println("Creation d'une Pomme.");
}
}
class Orange extends Fruit {
Orange(int p) {
poids = p;
System.out.println("Creation d'une Orange.");
}
}
abstract class Fruit {
int poids;
Fruit() {
System.out.println("Creation d'un Fruit.");
}
}

Polymorphisme
Le sous-casting

Nous souhaiterions que la mthode pse


affiche, aprs le poids,un message indiquant
s'il s'agit d'une Pomme ou d'une Orange
Malheureusement, ce programme provoque
une erreur de compilation : Incompatible
type for method. Explicit cast needed
to convert Fruit to Orange.

En effet, Java n'a aucun moyen de savoir


comment effectuer le sous-casting. Celui-ci
doit donc tre effectu explicitement,

Polymorphisme

Le "late binding"

public class Polymorphisme9 {


public static void main(String[] argv) {
Pomme pomme = new Pomme(85);
Orange orange = new Orange(107);
pse(pomme);
}
static void pse(Fruit f) {
int p = f.poids;
System.out.println("Ce fruit pese " + p + " grammes.");
f.quoi();
}
}
class Fruit {
int poids;
Fruit() {
System.out.println("Creation d'un Fruit.");
}
void quoi() {}
}

class Pomme extends Fruit {


Pomme(int p) {
poids = p;
System.out.println("Creation d'une Pomme.");
}
void quoi() {
System.out.println("C'est une Pomme.");
}
}
class Orange extends Fruit {
Orange(int p) {
poids = p;
System.out.println("Creation d'une Orange.");
}
void quoi() {
System.out.println("C'est une Orange.");
}
}

Polymorphisme
Le "late binding"

A la fin de la mthode pse, nous appelons la


mthode quoi de l'objet f.
Or, l'objet f, tout en tant une instance de Fruit, est
galement une instance de Pomme.
Java lie donc l'appel de la mthode avec la mthode
correspondant au type le plus spcifique de l'objet.

Polymorphisme
Le "late binding"

Notre problme peut tout de mme tre rsolu grce au fait que Java
utilise une technique particulire pour dterminer quelle mthode doit
tre appele.
Dans la plupart des langages, lorsque le compilateur rencontre un
appel de mthode (ou de fonction ou procdure, selon la terminologie
employe), 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, il nous suffit d'utiliser une mthode pour chaque classe
(Pomme et Orange) ainsi que pour la classe parente Fruit, au lieu
d'une mthode statique dans la classe principale (Polymorphisme).
Ainsi, la mthode la plus spcifique (celle de la classe Pomme ou
Orange, selon le cas) sera utilise chaque fois que la mthode sera
appele avec un argument de type Fruit. Soit le programme suivant :

Polymorphisme
Le polymorphisme et les interfaces

De la mme faon qu'un objet est la fois une instance de sa classe et


de toutes ses classes parentes, un objet sera valablement reconnu
comme une instance d'une quelconque de ses interfaces. Le
programme suivant en montre un exemple :

public class Midi2 {


public static void main(String[] argv) {
Sequence maSequence = new Sequence();
System.out.println(maSequence instanceof
Sequence);
System.out.println(maSequence instanceof Object);
System.out.println(maSequence instanceof
Synthetiseur);
System.out.println(maSequence instanceof BAR);
System.out.println(maSequence instanceof
Roland);
System.out.println(maSequence instanceof T1);
}
}
interface Yamaha {
final static int
CAISSE_CLAIRE = 48,
GROSSE_CAISSE = 57,
CHARLEY_PIED = 87,
CHARLEY_MAIN = 89,
TOM_BASSE = 66;
}

interface Roland {
final static int
CAISSE_CLAIRE = 68,
GROSSE_CAISSE = 69,
CHARLEY_PIED = 72,
CHARLEY_MAIN = 74,
TOM_BASSE = 80;
}

interface T1 {
final static int
PIANO = 1,
GUITARE = 22;
// etc.
}

interface EX7 {
final static int
PIANO = 1,
ACCOUSTIC_BASS = 22;
// etc.
}

interface BAR extends Roland {}

interface Synthetiseur extends T1 {}


class Sequence implements Synthetiseur, BAR {
}

Ce programme affiche :
true
true
true
true
true
true

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.

Polymorphisme

Polymorphisme
Rsum

Dans ce chapitre, nous avons prsent les


diffrents aspects d'un lment essentiel des
langages orients objets, et de Java en
particulier : le polymorphisme, qui permet un
objet d'appartenir plusieurs types la fois.
Nous avons vu qu'il existait deux formes
diffrentes de polymorphisme :

Un polymorphisme "hirarchique", qui fait qu'un objet


instance d'une classe est automatiquement instance des
classes parentes
Un polymorphisme "non hirarchique", qui permet qu'un
objet soit considr comme une instance d'un nombre
quelconque d'interfaces.

Association

Agence

grer

Client possder

Compte

Une agence gre plusieurs clients.


Un client possde un et un seul compte courant.

Multiplicits les plus courantes


grer

Agence

1
0..1
M..N
*
0..*
1..*

Client possder Compte


*

Un et un seul
Zro ou un
De M N (entiers naturels)
De zro plusieurs
De zro plusieurs
D'un plusieurs

Association simple: une


rfrence comme attribut
Client
identifiant : entier
anneOuvertureCompte : entier
compteCourant : CompteBancaire
CompteBancaire

Lattribut compteCourant est une


rfrence sur un objet de la classe
CompteBancaire

Association multiple : Tableau


de rfrences sur des objets
uneAgence:Agence
nom
adresse
lesClients

* 500

BNP

EVRY

indice 0

unClient:Client

500

Une traduction d'associations


Agence
directeur : chane
adresse : chane

Client

grer

changerDirecteur(...)
ajouterUnClient(...)

Agence
directeur : chane
adresse : chane
lesClients : Clients[500]
changerDirecteur(...)
ajouterUnClient(...)

nom : chane
ge : entier
vieillir()
changerNom(...)

Compte

possder

Client
nom
: chane
ge
: entier
compte : Compte
vieillir()
changerNom(...)

lesDpts : entier[100]
lesRetraits : entier[100]
dposer(...)
retirer(...)

Une agence gre une liste


de clients.
La rfrence de son
compte fait partie des
attributs dun client.

Les Exceptions
Throwable

Error

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

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

Les Exceptions

Exemple : considrons le programme suivant :

public class Erreur {


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"

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

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

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 .

Dans Quelle direction sont


lances les exceptions
public class Erreur2 {
public static void main( String[] args ) {
int x = 10, y = 0, z = 0;
try {
z = calcul(x, y);
}
catch (ArithmeticException e) {
}
}
static int calcul(int a, int b) {
return a / b;
}
}

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.

Traiter les exceptions


public class Erreur2 {
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());
e.printStackTrace();
}
System.out.println("Suite du programme");
}
static int calcul(int a, int b) {
return a / b;
}
}

Traiter les exceptions

Le programme affiche le rsultat suivant:

Erreur : Division par zero


java.lang.ArithmeticException: / by zero
java.lang.ArithmeticException: / by zero
at Erreur2.calcul(Erreur2.java:15)
at Erreur2.main(Erreur2.java:5)
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());

Les 3 lignes (3,4 et 5) 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");

Relancer ou jeter une exception


public class Erreur3 {
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");
throw e ;
}
System.out.println("Suite du programme");
}
static int calcul(int a, int b) {
return a / b;
}
}

Relancer ou jeter une exception

Le rsultat affich est le suivant :

Erreur : Division par zero


java.lang.ArithmeticException: / by zero
at Erreur3.calcul(Erreur3.java:14)
at Erreur3.main(Erreur3.java:5)
Exception in thread "main"

Lorsque on lance une exception avec linstruction throw, elle monte au


niveau suprieur, ici linterprteur de java, ce dernier la traite, affiche
le message et arrte lexcution.

Dans notre programme, nous avons attrap lexception pour afficher le


message Erreur : Division par zero , nous lavons relanc
linterprteur pour quil la traite .

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() ;

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 :

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 :

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

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.

Entres Sorties
Programme
Donnes

Flot dentre

Flot de sortie
Clavier

Donnes

Imprimante

Moniteur

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

Streams

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,

Copie dun fichier texte


caractre par caractre
ent

FileReader

File

Autoexec.bat

read()
sort

FileWriter

File

Write()

copie.bat

Copie dun fichier texte Ligne par


Ligne avec conversion de fin de ligne
bent

ent

BufferedReader

FileReader

File

readLine()

read()

bsort

sort

BufferedWriter

FileWriter

File

Write()
newLine()

Autoexec.bat

Write()

copie.bat

Copie dun fichier Binaire


bent

ent

BufferedReader

FileReader

readLine()
newLine()

f
File

read()

bsort

sort

BufferedWriter

FileWriter

File

Write()

Autoexec.bat

Write()

copie.bat

Streams de
communication
Un stream de communication tablit une liaison entre le programme et
une destination qui peut tre :
La mmoire :
Donnes binaires :ByteArrayInputStream, ByteArrayOutputStream,
StringBufferInputStream

Caractres : CharArrayReader, CharArrayWriter, StringReader, StringWriter


Un Fichier :
Donnes binaires : FileInputStream, FileOutputStream
Caractres : FileReader, FileWriter

Un chanage de streams (pipe) :


Donnes binaires : PipedInputStream, PipedOutputStream
Caractres : PipedReader, PipedWriter

Lecture et criture dun


fichier
Utilisation des streams de communication FileReader
et FileWriter :
import java.io.*;
public class CopieTXT {
public static void main (String[] args) throws IOException {
int c;
FileReader entre = new FileReader("original.txt");
FileWriter sortie = new FileWriter("copie.txt");
while ((c = entre.read()) != -1)
sortie.write(c);
entre.close();
sortie.close();
}
}

Les streams de traitement


Les streams de traitement peuvent tre classs en fonction
du type de traitement que subissent les donnes :
Tamponnage
Donnes binaires :BufferedInputStream, BufferedOutputStream
Caractres : BufferedReader, BufferedWriter
Filtrage:
Donnes binaires : FilterInputStream, FilterOutputStream
Caractres : FilterReader, FilterWriter
Concatnation :
Donnes binaires : SequenceInputStream
Conversion de donnes :
Donnes binaires : DataInputStream, DataOutputStream
Caractres : InputStreamReader,OutputStreamWriter

Les streams de traitement


Comptage :
Caractres : LineNumberReader

Srialisation :
Donnes binaires : ObjectInputStream, ObjectOutputStream

Lecture anticipe
Donnes binaires : PushBackInputStream
Caractres : PushBackReader

Affichage et impression
Donnes binaires : PrintStream
Caractres : PrintReader

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

Composants AWT
Nous avons notre disposition
principalement trois types d'objets :

Les Components qui sont des


composants graphiques,
Les Containers qui contiennent les
Components
Les Layouts qui sont en fait des stratgies
de placement de Components pour les
Containers.

Java et JDBC
Application Java

JDBC

Oracle

MySQL

SQL Server

Crer une application JDBC


Pour crer une application lmentaire de manipulation dune base
de donnes il faut suivre les tapes suivantes :

Importation des classes ncessaires ;

Chargement du Pilote JDBC ;

Identification de la source de donnes ;

Allocation dun objet Connection

Allocation dun objet Instruction Statement ;

Excution dune requte laide de lobjet Statement ;

Rcupration de donnes partir de lobjet renvoy


ResultSet ;

Fermeture de lobjet ResultSet ;

Fermeture de lobjet Statement ;


Fermeture de lobjet Connection.

Crer une application JDBC


DriverManager

Cre

Connection

Cre

Statement

Cre

ResultSet

SQL

Lien tabli
vers la base

Donnes

Pilote

Base de donnes

Charger un pilote
Utiliser la mthode forName de la classe Class, en
prcisant le nom de la classe pilote.
Exemple: pour un pilote Jdbc-Odbc, on crira:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver ") ;

You might also like