Vous êtes sur la page 1sur 82

JAVA

Programmation oriente objet


1
Programmation orient objet
JAVA
Pr Hafidi Imad imad.hafidi@gmail.com
deuxime partie
Hafidi Imad -ENSA de Khouribga-Cours JAVA
Hafidi Imad -ENSA de Khouribga-Cours JAVA
2
Approche Objet
3
Exemple
Nombres complexes
En C, faire une procdure permettant de faire la
somme de 2 nombres complexes
void Somme(double a1, double b1,
double a2, double b2, double *a, double *b)
{
*a = a1 + a2;
*b = b1 + b2;
}
int main(void)
{
double re,im;
Somme( 1, 1, 2, -4, &re, &im);
printf( %lf +j %lf , re, im);
return 0;
}
j z 1
1
j z 4 2
2

Hafidi Imad -ENSA de Khouribga-Cours JAVA
4
Exemple
Nombres complexes, C avec structure
En C, faire une procdure permettant de faire la
somme de 2 nombres complexes
void Somme(Complexe z1, Complexe z2, Complexe *z3)
{
z3->Reel = z1.Reel + z2.Reel;
z3->Imag = z1.Imag + z2.Imag;
}
typedef struc
{ double Reel;
double Imag;
} Complexe;
Complexe est maintenant un nouveau type
void main()
{ Complexe z1, z2, z3;
z1.Reel = 1; z1.Imag = 1;
z2.Reel = 2; z2.Imag = -4;
Somme( z1, z2, &z3);
}
Hafidi Imad -ENSA de Khouribga-Cours JAVA
5
Exemple
Nombres complexes, C avec structure (bis)
En C, faire une procdure permettant de faire la
somme de 2 nombres complexes
Complexe Somme(Complexe z1, Complexe z2)
{
Complexe s;
s.Reel = z1.Reel + z2.Reel;
s.Imag = z1.Imag + z2.Imag;
return s;
}
typedef struc
{ double Reel;
double Imag;
} Complexe;
Complexe est maintenant un nouveau type
void main()
{ Complexe z1, z2, z3;
z1.Reel = 1; z1.Imag = 1;
z2.Reel = 2; z2.Imag = -4;
z3 = Somme( z1, z2);
}
Hafidi Imad -ENSA de Khouribga-Cours JAVA
6
Complexe Somme(Complexe z1, Complexe z2)
{
Complexe s;
s.Reel = z1.Reel + z2.Reel;
s.Imag = z1.Imag + z2.Imag;
return s;
}
Exemple
Nombres complexes, du C au JAVA
typedef struc
{ double Reel;
double Imag;
} Complexe;
typedef struc
{ double Reel;
double Imag;
} Complexe;
Champs
Mthodes
Donnes
Fonctions
class Complexe
{
double Reel;
double Imag;
Complexe() {Reel=0;Imag=0;}
Complexe Plus(Complexe z)
{
Complexe s;
s.Reel = Reel + z.Reel;
s.Imag = Imag + z.Imag;
return s;
}
};
Langage C Langage JAVA
constructeur
Hafidi Imad -ENSA de Khouribga-Cours JAVA
Lapproche objet (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
7
Lapproche objet :
Programmation dirig par les donnes et non par
les traitements
les procdures existent toujours mais on se concentre
dabord sur les entits que lon va manipuler avant de se
concentrer sur la faon dont on va les manipuler
Notion dencapsulation
les donnes et les procdures qui les manipulent (on parle
de mthodes) sont regroups dans une mme entit (la
classe).
Lapproche objet (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
8
Lapproche objet (suite):
Notion de classe et dobjets : la classe est un
modle dcrivant les caractristiques communes et
le comportement dun ensemble dobjets (on parle
dinstance dune classe) : la classe est un moule et
lobjet est ce qui est moul partir de ce moule
Ces caractristiques communes sont les variables
(on parle dattributs) qui caractrisent les objets et
les oprations que lon peut effectuer sur ces objets
La classe (1) : dfinition
Hafidi Imad -ENSA de Khouribga-Cours JAVA
9
Classe : description dune famille dobjets ayant une
mme structure et un mme comportement. Elle est
caractrise par :
Un nom
Une composante statique : des champs (ou attributs)
nomms ayant une valeur. Ils caractrisent ltat des
objets pendant lexcution du programme
Une composante dynamique : des mthodes
reprsentant le comportement des objets de cette
classe. Elles manipulent les champs des objets et
caractrisent les actions pouvant tre effectues par les
objets.
La classe (2) : reprsentation
graphique
Hafidi Imad -ENSA de Khouribga-Cours JAVA
10
Une classe reprsente avec la notation
UML (Unified Modeling Language)
Nom
Mthodes
Champs
Linstanciation (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
11
Instanciation : concrtisation dune classe en un
objet concret .
Dans nos programmes Java nous allons dfinir des
classes et instancier ces classes en des objets qui
vont interagir. Le fonctionnement du programme
rsultera de linteraction entre ces objets
instancis .
En Programmation Oriente Objet, on dcrit des
classes et lapplication en elle-mme va tre
constitue des objets instancis, partir de ces
classes, qui vont communiquer et agir les uns sur
les autres.
Linstanciation (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
12
Instance
reprsentant physique d'une classe
obtenu par moulage du dictionnaire des variables et
dtenant les valeurs de ces variables.
Son comportement est dfini par les mthodes de
sa classe
Exemple :
si nous avons une classe voiture, alors votre voiture
est une instance particulire de la classe voiture.
Classe = concept, description
Objet = reprsentant concret dune classe
Les constructeurs (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
13
L'appel de new pour crer un nouvel objet
dclenche, dans l'ordre :
L'allocation mmoire ncessaire au stockage de ce
nouvel objet et l'initialisation par dfaut de ces
attributs,
L'initialisation explicite des attributs, s'il y a lieu,
L'excution d'un constructeur.
Un constructeur est une mthode d'initialisation.
public class Application
{
public static void main(String args[])
{
Personne p = new Personne()
p.setNom( ahmed") ;
} }
Le constructeur est ici celui
par dfaut (pas de
constructeur dfini dans
la classe Personne)
Les constructeurs (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
14
Lorsque l'initialisation explicite n'est pas possible
(par exemple lorsque la valeur initiale d'un attribut
est demande dynamiquement l'utilisateur), il
est possible de raliser l'initialisation au travers
d'un constructeur.
Le constructeur est une mthode :
de mme nom que la classe,
sans type de retour.
Toute classe possde au moins un constructeur.
Si le programmeur ne l'crit pas, il en existe un
par dfaut, sans paramtres, de code vide.
Les constructeurs (3)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
15
public class Personne
{
public String nom;
public String prenom;
public int age;
public Personne(String unNom,
String unPrenom,
int unAge)
{
nom=unNom;
prenom=unPrenom;
age = unAge;
}
}
Personne.java
Va donner une erreur la compilation
public class Application
{
public static void main(String
args[])
{
Personne p = new Personne()
p.setNom(" ahmed") ;
} }
Dfinition dun
Constructeur. Le
constructeur par dfaut
(Personne() )nexiste plus.
Le code prcdent
occasionnera
une erreur
Les constructeurs (4)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
16
Pour une mme classe, il peut y avoir plusieurs
constructeurs, de signatures diffrentes (surcharge).
L'appel de ces constructeurs est ralis avec le new
auquel on fait passer les paramtres.
p1 = new Personne(" ahmed", " jabri", 56);
Dclenchement du "bon" constructeur
Il se fait en fonction des paramtres passs lors de
l'appel (nombre et types). C'est le mcanisme de
"lookup".
Attention
Si le programmeur cre un constructeur (mme si c'est
un constructeur avec paramtres), le constructeur par
dfaut n'est plus disponible. Attention aux erreurs de
compilation !
Les constructeurs (5)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
17
public class Personne
{
public String nom;
public String prenom;
public int age;
public void Personne()
{
nom=null; prenom=null;
age = 0;
}
public String Personne(String
unNom,
String unPrenom, int unAge)
{
nom=unNom;
prenom=unPrenom; age = unAge;
} }
Personne.java
Redfinition dun
Constructeur sans paramtres
On dfinit plusieurs constructeurs
qui se diffrencient uniquement
par leurs paramtres (on parle
de leur signature)
Classe et objet en Java
Hafidi Imad -ENSA de Khouribga-Cours JAVA
18
Du modle
class Personne
{
String nom;
int age;
float salaire;
};
la classe Java et
de la classe ...
... des instances
de cette classe
Personne p1, p2;
p1 = new Personne ();
p2 = new Personne ();
Loprateur dinstanciation en Java est new :
MaClasse monObjet = new MaClasse();
En fait, new va rserver lespace mmoire ncessaire pour crer
lobjet monObjet de la classe MaClasse
Le new ressemble beaucoup au malloc du C
Objets, tableaux, types de base
Hafidi Imad -ENSA de Khouribga-Cours JAVA
19
Lorsqu'une variable est d'un type objet ou
tableau, ce n'est pas l'objet ou le tableau lui-
mme qui est stock dans la variable mais une
rfrence vers cet objet ou ce tableau (on
retrouve la notion dadresse mmoire ou du
pointeur en C).
Lorsqu'une variable est d'un type de base, la
variable contient la valeur.
Rfrences
Hafidi Imad -ENSA de Khouribga-Cours JAVA
20
La rfrence est, en quelque sorte, un pointeur
pour lequel le langage assure une manipulation
transparente, comme si c'tait une valeur (pas de
drfrencement).
Par contre, du fait qu'une rfrence n'est pas une
valeur, c'est au programmeur de prvoir
l'allocation mmoire ncessaire pour stocker
effectivement l'objet (utilisation du new).
Diffrences entre objets et types de
base
Hafidi Imad -ENSA de Khouribga-Cours JAVA
21
int x=3,y=3;
x == y est vrai
String s1="abc",s2="abc";
s1 == s2 est faux...
Mmoire
3
3
0x768
Abc
....
0x852
Abc
....
Quand on compare 2 variables dun type de base
on compare leur valeur. Quand on compare 2 objet
avec les oprateurs on compare leur rfrence (leur
adresse en mmoire). Introduction de la mthode
equals() pour les objets : s1.equals(s2) est vrai
Accs aux attributs dun objet (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
22
public class Personne
{
public String nom;
public String prenom;
public int age;
public void setNom(String unNom)
{
nom = unNom;
}
public String getNom()
{
return (nom);
}
}
Personne.java
Accs aux attributs dun objet (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
23
public class Application
{
public static void main(String args[])
{
Personne p = new Personne()
p.nom = " jabri" ;
p.prenom = "ahmed" ;
}
}
Application.java
Remarque :
Contrairement aux variables, les attributs d'une classe, s'ils ne sont pas
initialiss, se voient affecter automatiquement une valeur par dfaut.
Cette valeur vaut : 0 pour les variables numriques, false pour les
boolens, et null pour les rfrences.
Accs aux mthodes dun objet (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
24
public class Personne
{
public String nom;
public String prenom;
public int age;
public void setNom(String unNom)
{
nom = unNom;
}
public String getNom()
{
return (nom);
}
}
Personne.java
Accs aux mthodes dun objet (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
25
public class Application
{
public static void main(String args[])
{
Personne p = new Personne()
p.setNom("Jabri") ;
}
}
Application.java
Notion de mthodes et de
paramtres (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
26
La notion de mthodes dans les langages objets
Proches de la notion de procdure ou de fonction dans
les langages procduraux.
La mthode cest avant tout le regroupement dun
ensemble dinstructions suffisamment gnrique pour
pouvoir tre rutilises
Comme pour les procdures ou les fonctions (au sens
mathmatiques) on peut passer des paramtres aux
mthodes et ces dernires peuvent renvoyer des
valeurs (grce au mot cl return).
En java on a 2 grands types de mthodes les mthodes
de classe (dfini avec le mot cl static comme pour la
mthode main) et les mthodes dinstance :
une mthode est un message que lon envoie une classe
(mthode de classe) ou un objet (mthode dinstance)
mthodes (rappel)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
27
<modificateur> <type-retour> <nom> (<liste-param>) {<bloc>}
public double add (double number1, double number2)
{
return (number1 +number2);
}
exemple : public,
static
type de la valeur
renvoye ou
void
couples d'un type et d'un
identificateur spars par des
,
Notre mthode
retourne ici une
valeur
Mode de passage des paramtres
Hafidi Imad -ENSA de Khouribga-Cours JAVA
28
Java n'implmente qu'un seul mode de passage
des paramtres une mthode : le passage par
valeur.
Consquences :
l'argument pass une mthode ne peut tre
modifi,
si l'argument est une instance, c'est sa rfrence
qui est passe par valeur. Ainsi, le contenu de
l'objet peut tre modifi, mais pas la rfrence elle-
mme.
Notion de mthodes et de
paramtres (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
29
<modificateur> <type-retour> <nom> (<liste-param>) {<bloc>}
public double add (double number1, double number2)
{
return (number1 +number2);
}
exemple : public,
static
type de la valeur
renvoye ou
void
couples d'un type et d'un
identificateur spars par des
,
Notre mthode
retourne ici une
valeur
Porte des variables (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
30
Les variables sont connues et ne sont connues qu
lintrieur du bloc dans lequel elles sont dclares
public class Bidule
{
int i, j, k;
public void truc(int z)
{
int j,r;
r = z;
}
public void machin()
{
k = r;
}
}
Ce sont 2 variables diffrentes
k est connu au niveau de la mthode
machin() car dclar dans le bloc de la
classe. Par contre r nest pas dfini pour
machin(). On obtient une erreur la
compilation
Porte des variables (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
31
En cas de conflit de nom entre des variables locales
et des variables globales, cest toujours la variable la
plus locale qui est considre comme tant la
variable dsigne par cette partie du programme
Attention par consquent ce type de conflit quand on
manipule des variables globales.
public class Bidule
{
int i, k, j;
public void truc(int z)
{
int j,r;
j = z;
}
}
Cest le j dfini en local
qui est utilis dans
la mthode truc()
Destruction dobjets (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
32
Java n'a pas repris son compte la notion de
destructeur telle quelle existe en C++ par
exemple.
C'est le ramasse-miettes (ou Garbage Collector -
GC en anglais) qui s'occupe de collecter les
objets qui ne sont plus rfrencs.
Le ramasse-miettes fonctionne en permanence
dans un thread de faible priorit (en tche de
fond ). Il est bas sur le principe du compteur de
rfrences.
Destruction dobjets (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
33
Ainsi, le programmeur na plus grer
directement la destruction des objets, ce qui tait
une importante source d'erreurs (on parlait de
fuite de mmoire ou memory leak en anglais).
Le ramasse-miettes peut tre "dsactiv" en
lanant l'interprteur java avec l'option -
noasyncgc.
Inversement, le ramasse-miettes peut tre lanc
par une application avec l'appel System.gc();
Destruction dobjets (3)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
34
Il est possible au programmeur d'indiquer ce qu'il
faut faire juste avant de dtruire un objet.
C'est le but de la mthode finalize() de l'objet.
Cette mthode est utile, par exemple, pour :
fermer une base de donnes,
fermer un fichier,
couper une connexion rseau,
etc.
Lencapsulation (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
35
Notion d'encapsulation :
les donnes et les procdures qui les manipulent
sont regroupes dans une mme entit, l'objet.
Les dtails d'implmentation sont cachs, le monde
extrieur n'ayant accs aux donnes que par
l'intermdiaire d'un ensemble d'oprations
constituant l'interface de l'objet.
Le programmeur n'a pas se soucier de la
reprsentation physique des entits utilises et peut
raisonner en termes d'abstractions.
Lencapsulation (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
36
Programmation dirige par les donnes :
pour traiter une application, le programmeur
commence par dfinir les classes d'objets
appropries, avec leurs oprations spcifiques.
chaque entit manipule dans le programme est un
reprsentant (ou instance) d'une de ces classes.
L'univers de l'application est par consquent
compos d'un ensemble d'objets qui dtiennent,
chacun pour sa part, les cls de leur comportement.
Contrle daccs (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
37
Chaque attribut et chaque mthode d'une classe peut
tre :
visible depuis les instances de toutes les classes d'une
application. En d'autres termes, son nom peut tre utilis
dans l'criture d'une mthode de ces classes. Il est alors
public.
visible uniquement depuis les instances de sa classe.
En d'autres termes, son nom peut tre utilis
uniquement dans l'criture d'une mthode de sa classe.
Il est alors priv.
Les mots rservs sont :
public
private
Contrle daccs (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
38
En toute rigueur, il faudrait toujours que :
les attributs ne soient pas visibles,
Les attributs ne devraient pouvoir tre lus ou modifis que
par l'intermdiaire de mthodes prenant en charge les
vrifications et effets de bord ventuels.
les mthodes "utilitaires" ne soient pas visibles,
seules les fonctionnalits de l'objet, destines tre
utilises par d'autres objets soient visibles.
Cest la notion dencapsulation
Nous verrons dans la suite que lon peut encore
affiner le contrle daccs
Contrle daccs (3)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
39
public class Parallelogramme
{
private int longueur = 0; // dclaration + initialisation explicite
private int largeur = 0; // dclaration + initialisation explicite
public int profondeur = 0; // dclaration + initialisation explicite
public void affiche ( )
{System.out.println("Longueur= " + longueur + " Largeur = " + largeur
+
" Profondeur = " + profondeur);
}}
public class ProgPpal
{
public static void main(String args[])
{
Parallelogramme p1 = new Parallelogramme();
p1.longueur = 5; // Invalide car l'attribut est priv
p1.profondeur = 4; // OK
p1.affiche( ); // OK
} }
Variables de classe (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
40
Il peut s'avrer ncessaire de dfinir un attribut dont
la valeur soit partage par toutes les instances d'une
classe. On parle de variable de classe.
Ces variables sont, de plus, stockes une seule fois,
pour toutes les instances d'une classe.
Mot rserv : static
Accs :
depuis une mthode de la classe comme pour tout autre
attribut,
via une instance de la classe,
l'aide du nom de la classe.
Variables de classe (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
41
public class UneClasse
{
public static int compteur = 0;
public UneClasse ()
{
compteur++;
}
}
public class AutreClasse
{
public void uneMethode()
{
int i = UneClasse.compteur;
}
}
Variable de classe
Utilisation de la variable de classe
compteur dans le constructeur de
la classe
Utilisation de la variable de classe
compteur dans une autre classe
Mthodes de classe (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
42
Il peut tre ncessaire de disposer d'une
mthode qui puisse tre appele sans instance
de la classe. C'est une mthode de classe.
On utilise l aussi le mot rserv static
Puisqu'une mthode de classe peut tre appele
sans mme qu'il n'existe d'instance, une mthode
de classe ne peut pas accder des attributs non
statiques. Elle ne peut accder qu' ses propres
variables et des variables de classe.
Mthodes de classe (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
43
public class UneClasse
{
public int unAttribut;
public static void main(String args[])
{
unAttribut = 5; // Erreur de compilation
}
}
Math.sin(x);
String String.valueOf (i);
Autres exemples de mthodes de classe courantes
La mthode main est une
mthode de classe donc elle
ne peut accder un attribut
non lui-mme attribut de
classe
Composition dobjets (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
44
Un objet peut tre compos partir dautres objets
Exemple : Une voiture compose de
5 roues (roue de secours) chacune compose
dun pneu
dun moteur compos
de plusieurs cylindres
de portires
etc
Voiture
Roue Roue Roue Roue Roue
Portire Portire Moteur
Pneu Pneu Pneu Pneu Pneu
Chaque composant est un attribut de lobjet compos
Composition dobjets (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
45
Syntaxe de composition dobjets
class Pneu {
private float pression ;
void gonfler();
void degonfler();}
class Roue {
private float diametre;
Pneu pneu ;}
class Voiture {
Roue roueAVG,roueAVD, roueARG, roueARD , roueSecours ;
Portiere portiereG, portiereD;
Moteur moteur;}
Composition dobjets (3)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
46
Gnralement, le constructeur dun objet compos
doit appeler le constructeur de ses composants
public Roue () {
pneu := new Pneu();}
public Voiture () {
roueAVG := new Roue();
roueAVD := new Roue();
roueARG := new Roue();
roueARD := new Roue();
portiereG := new Portiere();
portiereD := new Portiere();
moteur := new Moteur();}
Composition dobjets (4)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
47
Linstanciation dun objet compos instancie ainsi
tous les objets qui le composent
Roue
diamtre
Pneu
pression
Roue
diamtre
Pneu
pression
Voiture
Portire Portire
Roue
diamtre
Pneu
pression
Moteur
RoueAV
GG
RoueAV
D
RoueAR
G
RoueAR
D
RoueSecours
Roue
diamtre
Pneu
pression
Roue
diamtre
Pneu
pression
Hafidi Imad -ENSA de Khouribga-Cours JAVA
48
Hritage en Java
Lhritage (1) : Concept
Hafidi Imad -ENSA de Khouribga-Cours JAVA
49
La modlisation du monde rel ncessite une
classification des objets qui le composent
Classification = distribution systmatique en
catgories selon des critres prcis
Classification = hirarchie de classes
Exemples :
classification des lments chimiques
classification des tres vivants
Lhritage (2) : exemple
Hafidi Imad -ENSA de Khouribga-Cours JAVA
50
Forme gomtrique
Polygone Ellipse
Cercle Triangle Quadrilatre
Triangle
Rectangle
Triangle
equilateral
Rectangle
Carr
Lhritage (3) : dfinition
Hafidi Imad -ENSA de Khouribga-Cours JAVA
51
Hritage : mcanisme permettant le partage et la
rutilisation de proprits entre les objets. La relation
dhritage est une relation de gnralisation /
spcialisation.
La classe parente est la superclasse.
La classe qui hrite est la sous-classe.
Lhritage (3) : reprsentation
graphique
Hafidi Imad -ENSA de Khouribga-Cours JAVA
52
Reprsentation avec UML dun hritage
(simple)
Superclasse
Lien dhritage
Sous-classe
Lhritage avec Java (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
53
Java implmente le mcanisme d'hritage simple
qui permet de "factoriser" de l'information grce
une relation de gnralisation / spcialisation
entre deux classes.
Pour le programmeur, il s'agit d'indiquer, dans la
sous-classe, le nom de la superclasse dont elle
hrite.
Par dfaut toutes classes Java hrite de la classe
Object
L'hritage multiple n'existe pas en Java.
Mot rserv : extends
Lhritage avec Java (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
54
class Personne
{
private String nom;
private Date date_naissance;
// ...
}
class Employe extends Personne
{
private float salaire;
// ...
}
class Etudiant extends Personne
{
private int numero_carte_etudiant;
// ...
}
Lhritage en Java (3)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
55
Constructeurs et hritage
par dfaut le constructeur dune sous-classe
appelle le constructeur "par dfaut" (celui qui ne
reoit pas de paramtres) de la superclasse.
Attention donc dans ce cas que le constructeur
sans paramtre existe toujours dans la
superclasse...
Pour forcer l'appel d'un constructeur prcis, on
utilisera le mot rserv super. Cet appel devra tre
la premire instruction du constructeur.
Lhritage en Java (4)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
56
public class Employe extends
Personne
{
public Employe () {}
public Employe (String nom,
String prenom,
int anNaissance)
{
super(nom, prenom, anNaissance);
}
}
public class Personne
{
public String nom, prenom;
public int anNaissance;
public Personne()
{
nom=""; prenom="";
}
public Personne(String nom,
String
prenom,
int
anNaissance)
{
this.nom=nom;
this.prenom=prenom;
this.anNaissance=anNaissance;
}
}
Appel explicite ce constructeur
avec le mot cl super
Lhritage en Java (5)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
57
public class Object
{
public Object()
{
/ ...
}
}
public class Personne
{
public String nom, prenom;
public int anNaissance;
public Personne()
{
nom=""; prenom="";
}
public Personne(String nom,
String
prenom,
int
anNaissance)
{
this.nom=nom;
this.prenom=prenom;
this.anNaissance=anNaissance;
}
}
Appel par dfaut dans le constructeur
de Personne au constructeur
par dfaut de la superclasse de
Personne, qui est Object
Redfinition de mthodes
Hafidi Imad -ENSA de Khouribga-Cours JAVA
58
Une sous-classe peut redfinir des mthodes existant
dans une de ses superclasses (directe ou indirectes),
des fins de spcialisation.
Le terme anglophone est "overriding". On parle aussi
de masquage.
La mthode redfinie doit avoir la mme signature.
class Employe extends
Personne
{
private float salaire;
public calculePrime( )
{
// ...
}
}
class Cadre extends
Employe
{
public calculePrime()
{
return super.
calculePrime()+2000;
}
// ...
}
redfinition
Recherche dynamique des mthodes
(1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
59
Le polymorphisme
Capacit pour une entit de prendre plusieurs formes.
En Java, toute variable dsignant un objet est
potentiellement polymorphe, cause de l'hritage.
Polymorphisme dit dhritage
le mcanisme de "lookup" dynamique :
dclenchement de la mthode la plus spcifique dun
objet, c'est--dire celle correspondant au type rel de
l'objet, dtermin l'excution uniquement (et non le
type de la rfrence, seul type connu la compilation,
qui peut tre plus gnrique).
Cette dynamicit permet d'crire du code plus
gnrique.
Recherche dynamique des mthodes
(2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
60
Employe e = new Employe();
e.calculePrime();
Employe e = new Cadre();
e.calculePrime();
Surcharge de mthodes (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
61
Dans une mme classe, plusieurs mthodes peuvent
possder le mme nom, pourvu qu'elles diffrent en
nombre et/ou type de paramtres.
On parle de surdfinition ou surcharge, on encore en
anglais doverloading en anglais.
Le choix de la mthode utiliser est fonction des
paramtres passs l'appel.
Ce choix est ralis de faon statique (c'est--dire la
compilation).
Trs souvent les constructeurs sont surchargs
(plusieurs constructeurs prenant des paramtres
diffrents et initialisant de manires diffrentes les
objets)
Oprateur instanceof
Hafidi Imad -ENSA de Khouribga-Cours JAVA
62
L'oprateur instanceof confre aux instances une
capacit d'introspection : il permet de savoir si une
instance est instance d'une classe donne.
Renvoie une valeur boolenne
if ( ... )
Personne p = new Etudiant();
else
Personne p = new Employe();
//...
if (p instanceof Employe)
// discuter affaires
else
// proposer un stage
Forage de type / transtypage (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
63
Lorsqu'une rfrence du type d'une classe contient
une instance d'une sous-classe, il est ncessaire de
forcer le type de la rfrence pour accder aux
attributs spcifiques la sous-classe.
Si ce n'est pas fait, le compilateur ne peut dterminer
le type rel de l'instance, ce qui provoque une erreur
de compilation.
On utilise galement le terme de transtypage
Similaire au cast en C
Forage de type / transtypage (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
64
class Personne
{
private String nom;
private Date date_naissance;
// ...
}
class Employe extends Personne
{
public float salaire;
// ...
}
Personne p = new Employe ();
float i = p.salaire; // Erreur de compilation
float j = ( (Employe) p ).salaire; // OK
On force le type
de la variable p
pour pouvoir accder
lattribut salaire .
On peut le faire car
cest
bien un objet Employe
qui est dans cette
variable
A ce niveau pour le
compilateur dans la
variable p cest
un objet de la classe
Personne, donc qui
na pas dattribut
salaire
Lautorfrence : this (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
65
Le mot rserv this, utilis dans une mthode,
dsigne la rfrence de l'instance laquelle le
message a t envoye (donc celle sur laquelle
la mthode est excute ).
Il est utilis principalement :
lorsqu'une rfrence l'instance courante doit tre
passe en paramtre une mthode,
pour lever une ambigut,
dans un constructeur, pour appeler un autre
constructeur de la mme classe.
Lautorfrence : this (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
66
class Personne
{
public String nom;
Personne (String nom)
{
this.nom=nom;
}
}
public MaClasse(int a, int b) {...}
public MaClasse (int c)
{
this(c,0);
}
public MaClasse ()
{
this(10);
}
Pour lever lambigut sur le mot nom
et dterminer si cest le nom du paramtre
ou de lattribut
Appelle le constructeur
MaClasse(int a, int b)
Appelle le constructeur
MaClasse(int c)
Rfrence la superclasse
Hafidi Imad -ENSA de Khouribga-Cours JAVA
67
Le mot rserv super permet de faire rfrence au
constructeur de la superclasse directe mais aussi
dautres informations provenant de cette superclasse.
class Employe extends
Personne
{
private float salaire;
public float calculePrime()
{
return (salaire * 0,05);
}
// ...
}
class Cadre extends Employe
{
public calculePrime()
{
return (super.calculePrime() / 2);
}
// ...
}
Appel la mthode calculPrime()
de la superclasse de Cadre
Classes abstraites (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
68
Il peut tre ncessaire au programmeur de crer une
classe dclarant une mthode sans la dfinir (c'est--
dire sans en donner le code). La dfinition du code
est dans ce cas laisse aux sous-classes.
Une telle classe est appele classe abstraite.
Elle doit tre marque avec le mot rserv abstract.
Toutes les mthodes de cette classe qui ne sont pas
dfinies doivent elles aussi tre marques par le mot
rserv abstract.
Une classe abstraite ne peut pas tre instancie.
Classes abstraites (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
69
Par contre, il est possible de dclarer et d'utiliser
des variables du type de la classe abstraite.
Si une sous-classe d'une classe abstraite ne
dfinit pas toutes les mthodes abstraites de ses
superclasses, elle est abstraite elle aussi.
public abstract class Polygone
{
private int nombreCotes = 3;
public abstract void dessine (); // methode non dfinie
public int getNombreCotes()
{
return(nombreCotes);
}
}
Hafidi Imad -ENSA de Khouribga-Cours JAVA
70
Interfaces
Interfaces : comment classifier ?
71
Java ne permet pas lhritage multiple
Or, il existe parfois diffrentes classifications
possibles selon plusieurs critres
Hafidi Imad -ENSA de Khouribga-Cours JAVA
Exemple de classification
Hafidi Imad -ENSA de Khouribga-Cours JAVA
72
Selon la forme
Solides convexes
Polydres
Paralllpipde
Cube
Solides de rvolution
Cylindres Sphres
Autre classification
Hafidi Imad -ENSA de Khouribga-Cours JAVA
73
Selon la matire
matiere
Matiere organique
compose
minral
carbone
Autres critres
Hafidi Imad -ENSA de Khouribga-Cours JAVA
74
Dautres critres qui pourraient servir raliser
une classification dcrivent des comportements
ou des capacits
lectrique
comestible
lumineux
Or ces mcanismes peuvent tre commun
diffrentes classes non relies entre elles par une
relation d hritage
Notion d Interfaces
Hafidi Imad -ENSA de Khouribga-Cours JAVA
75
Pour dfinir qu'une certaine catgorie de classes
doit implmenter un ensemble de mthodes, on
peut regrouper les dclarations de ces mthodes
dans une interface.
Le but est de dcrire le fait que de telles classes
pourront ainsi tre manipules de manire
identique.
Exemple :
Tous les appareils lectriques peuvent tre allums
ou teint
Tous les objets comestibles peuvent tre mangs
Tous les objets lumineux clairent
Dfinition dInterface
Hafidi Imad -ENSA de Khouribga-Cours JAVA
76
Une interface est donc la description dun ensemble des
procdures (mthodes) que les classes Java peuvent
mettre en oeuvre.
Les classes dsirant appartenir la catgorie ainsi dfinie
dclareront qu'elles implmentent cette interface,
fourniront le code spcifique des mthodes dclares dans
cette interface.
Cela peut tre vu comme un contrat entre la classe et
linterface
la classe sengage implmenter les mthodes dfinies
dans linterface
Codage dune interface en Java
Hafidi Imad -ENSA de Khouribga-Cours JAVA
77
Mot rserv : interface
Dans un fichier nom_interface.java, on dfinit la
liste de toutes les mthodes de linterface
interface nomInterface {
type_retour methode1(paramtres);
type_retour methode2(paramtres);
}
Les mthodes d'une interface sont abstraites : elles
seront crites spcifiquement dans chaque classe
implmentant linterface
Le modificateur abstract est facultatif.
Implmentation dune interface dans
une classe
Hafidi Imad -ENSA de Khouribga-Cours JAVA
78
Mot rserv : implements
La classe doit expliciter le code de chaque
mthode dfinie dans linterface
class MaClasse implements nomInterface
{

type_retour methode1(paramtres)
{code spcifique la mthode1 pour cette classe};
}
Exemple dInterface (1)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
79
interface Electrique
{
void allumer();
void eteindre();
}
class Ampoule implements Electrique
{
// ...
void allumer() {System.out.println( jclaire );}
void eteindre() {System.out.println( plus de lumire);}
}
class Radio implements Electrique
{
// ...
void allumer() {System.out.println( bruit );}
void eteindre()
{System.out.println( silence );}
Exemple dInterface (2)
Hafidi Imad -ENSA de Khouribga-Cours JAVA
80
//
Ampoule monAmpoule = new Ampoule();
Radio maRadio = new Radio();
Electrique c;
Boolean sombre;
//
if(sombre == true)
c = monAmpoule;
else
c = maRadio;
c.allumer();

c.eteindre();
//
Utilisation des interfaces
Hafidi Imad -ENSA de Khouribga-Cours JAVA
81
Une variable peut tre dfinie selon le type dune interface
Une classe peut implmenter plusieurs interfaces diffrentes
Loprateur instanceof peut tre utilis sur les interfaces
Exemple :
interface Electrique

interface Lumineux

class Ampoule implements Electrique, Lumineux

Electrique e;
Object o = new Ampoule();
if (o instanceof Electrique) {e=(Electrique)o;e.allumer();}
Conclusion sur les interfaces
Hafidi Imad -ENSA de Khouribga-Cours JAVA
82
Un moyen dcrire du code gnrique
Une solution au problme de lhritage multiple
Un outil de concevoir dapplications rutilisables