Programmation orienté objet
JAVA
Deuxième partie
JAVA
Programmation orientée objet
Hafidi Imad [Link]@[Link]
1
Approche Objet
2 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Exemple
● Nombres complexes
● En C, faire une procédure 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;
z1 = 1 + j Somme( 1, 1, 2, -4, &re, &im);
z2 = 2 − 4 j printf(« %lf +j %lf », re, im);
return 0;
}
3 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Exemple
● Nombres complexes, C avec structure
● En C, faire une procédure permettant de faire la somme
de 2 nombres complexes
typedef struc
{ double Reel;
double Imag; Complexe est maintenant un nouveau type
} Complexe;
void Somme(Complexe z1, Complexe z2, Complexe *z3)
{
z3->Reel = [Link] + [Link];
z3->Imag = [Link] + [Link]; void main()
} { Complexe z1, z2, z3;
[Link] = 1; [Link] = 1;
[Link] = 2; [Link] = -4;
Somme( z1, z2, &z3);
}
4 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Exemple
● Nombres complexes, C avec structure (bis)
● En C, faire une procédure permettant de faire la somme
de 2 nombres complexes
typedef struc
{ double Reel;
double Imag; Complexe est maintenant un nouveau type
} Complexe;
Complexe Somme(Complexe z1, Complexe z2)
{
Complexe s;
[Link] = [Link] + [Link]; void main()
[Link] = [Link] + [Link]; { Complexe z1, z2, z3;
return s; [Link] = 1; [Link] = 1;
} [Link] = 2; [Link] = -4;
z3 = Somme( z1, z2);
}
5 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Exemple
● Nombres complexes, du C au JAVA
Langage C Langage JAVA
class Complexe
Données {
typedef struc
{ double Reel;
double Imag; double Reel;
} Complexe; double Imag; Champs
Complexe() {Reel=0;Imag=0;}
constructeur Complexe Plus(Complexe z)
{
Fonctions Complexe s;
Complexe Somme(Complexe z1, Complexe z2) [Link] = Reel + [Link];
{
Complexe s; [Link] = Imag + [Link];
[Link] = [Link] + [Link]; return s;
[Link] = [Link] + [Link];
return s; }
}
}; Méthodes
6 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’approche objet (1)
● L’approche objet :
● Programmation dirigé par les données et non par
les traitements
● les procédures existent toujours mais on se concentre d’abord sur
les entités que l’on va manipuler avant de se concentrer sur la façon
dont on va les manipuler
● Notion d’encapsulation
● les données et les procédures qui les manipulent (on parle de
méthodes) sont regroupés dans une même entité (la classe).
7 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’approche objet (2)
● L’approche objet (suite):
● Notion de classe et d’objets : la classe est un modèle
décrivant les caractéristiques communes et le
comportement d’un ensemble d’objets (on parle d’instance
d’une classe) : la classe est un moule et l’objet est ce qui est
moulé à partir de ce moule
● Ces caractéristiques communes sont les variables (on parle
d’attributs) qui caractérisent les objets et les opérations
que l’on peut effectuer sur ces objets
8 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Pourquoi la programmation objet
● Abstraction
● Séparation entre la définition et son implantation
● Réutilisation de code car basé sur la définition
● Unification
● Les données et le code sont unifiés en un seul modèle
● Réutilisation
● La conception par classe conduit à des composant
réutilisable
● Cache les détails d'implantation
● Specialisation (peu vrai dans la vrai vie)
● Le mécanisme d'héritage permet une spécialisation pour
des cas particulier
9 Hafidi Imad-ENSA de Khouribga-Cours JAVA
La classe (1) : définition
● Classe : description d’une famille d’objets ayant une même
structure et un même comportement. Elle est caractérisée
par :
● Un nom
● Une composante statique : des champs (ou attributs)
nommés ayant une valeur. Ils caractérisent l’état des objets
pendant l’exécution du programme
● Une composante dynamique : des méthodes représentant le
comportement des objets de cette classe. Elles manipulent les
champs des objets et caractérisent les actions pouvant être
effectuées par les objets.
10 Hafidi Imad -ENSA de Khouribga-Cours JAVA
La classe (2) : représentation
graphique
Homme Nom
Age : Integer
Taille : Double
Champs
Poids : Double
Nom : String
parle()
mange()
Méthodes
boit()
dort()
Une classe représentée avec la notation
UML (Unified Modeling Language)
11 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Les attributs
● Une classe définie de la structure d'un objet en
mémoire
● Une classe des champs (ou attributs) dont le type
indique la façon dont la mémoire est structurée
● Contrairement au C, en Java, l'ordre des champs en
mémoire n'est pas l'ordre des champs lors de la
déclaration
12 Hafidi Imad-ENSA de Khouribga-Cours JAVA
Accès aux attributs d’un objet (1)
[Link] Personne
nom : String
prenom : String
public class Personne age : Integer
{ getNom()
public String nom; setNom()
public String prenom;
public int age;
public void setNom(String unNom)
{
nom = unNom;
}
public String getNom()
{
return (nom);
}
}
13 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Accès aux attributs d’un objet (2)
[Link]
public class Application
{
public static void main(String args[])
{
Personne p = new Personne()
[Link] = " jabri" ;
[Link] = "ahmed" ;
}
}
Remarque :
Contrairement aux variables, les attributs d'une classe, s'ils ne sont pas
initialisés, se voient affecter automatiquement une valeur par défaut.
Cette valeur vaut : 0 pour les variables numériques, false pour les
booléens, et null pour les références.
14 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Variables de classe (1)
● Il peut s'avérer nécessaire de définir un attribut dont la
valeur soit partagée par toutes les instances d'une classe.
On parle de variable de classe.
● Ces variables sont, de plus, stockées une seule fois, pour
toutes les instances d'une classe.
● Mot réservé : static
● Accès :
● depuis une méthode de la classe comme pour tout autre
attribut,
● via une instance de la classe,
● à l'aide du nom de la classe.
15 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Variables de classe (2)
Variable de classe
public class UneClasse
{
public static int compteur = 0;
public UneClasse () Utilisation de la variable de classe
{ compteur dans le constructeur de
compteur++; la classe
}
}
public class AutreClasse Utilisation de la variable de classe
{ compteur dans une autre classe
public void uneMethode()
{
int i = [Link];
}
}
16 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Les méthodes
● En plus de définir les champs, une classe définie le code
qui va pouvoir manipuler les champs dans des
méthodes
● Une méthode est une fonction liée à une classe
17 Hafidi Imad -ENSA de Khouribga-Cours JAVA
● En Java, le code est toujours dans une méthode
● En java on a 2 grands types de méthodes les méthodes
de classe (défini avec le mot clé static comme pour la
méthode main) et les méthodes d’instance :
● une méthode est un message que l’on envoie à une classe (méthode
de classe) ou à un objet (méthode d’instance)
18 Hafidi Imad-ENSA de Khouribga-Cours JAVA
méthodes
exemple : public, type de la valeur couples d'un type et d'un
static renvoyée ou void identificateur séparés par des
«,»
<modificateur> <type-retour> <nom> (<liste-param>) {<bloc>}
public double add (double number1, double number2)
{ Notre méthode
retourne ici une
return (number1 +number2); valeur
}
19 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Méthode & fonction
● Comme une méthode est liée à une classe, il n'est pas
possible d'appeler une méthode sans envoyé un objet de
cette classe
● Une méthode est une fonction avec un paramètre caché
20 Hafidi Imad-ENSA de Khouribga-Cours JAVA
Mode de passage des paramètres
● Java n'implémente qu'un seul mode de passage des
paramètres à une méthode : le passage par valeur.
● Conséquences :
● l'argument passé à une méthode ne peut être modifié,
● si l'argument est une instance, c'est sa référence qui est
passée par valeur. Ainsi, le contenu de l'objet peut être
modifié, mais pas la référence elle-même.
21 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Portée des variables (1)
● Les variables sont connues et ne sont connues qu’à
l’intérieur du bloc dans lequel elles sont déclarées
public class Bidule
{
int i, j, k;
public void truc(int z)
{ Ce sont 2 variables différentes
int j,r;
r = z;
} k est connu au niveau de la méthode
public void machin() machin() car déclaré dans le bloc de la
{ classe. Par contre r n’est pas défini pour
k = r; machin(). On obtient une erreur à la
} compilation
}
22 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Portée des variables (2)
● En cas de conflit de nom entre des variables locales et des
variables globales, c’est toujours la variable la plus locale qui
est considérée comme étant la variable désignée par cette
partie du programme
● Attention par conséquent à ce type de conflit quand on
manipule des variables globales.
public class Bidule
{
int i, k, j;
public void truc(int z)
{
C’est le j défini en local int j,r;
qui est utilisé dans j = z;
la méthode truc() }
}
23 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Méthodes de classe (1)
● Il peut être nécessaire de disposer d'une méthode qui
puisse être appelée sans instance de la classe. C'est une
méthode de classe.
● On utilise là aussi le mot réservé static
● Puisqu'une méthode de classe peut être appelée sans
même qu'il n'existe d'instance, une méthode de classe
ne peut pas accéder à des attributs non statiques. Elle
ne peut accéder qu'à ses propres variables et à des
variables de classe.
24 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Méthodes de classe (2)
public class UneClasse La méthode main est une
{ méthode de classe donc elle
public int unAttribut;
public static void main(String args[]) ne peut accéder à un attribut
{ non lui-même attribut de
unAttribut = 5; // Erreur de compilation classe
}
}
Autres exemples de méthodes de classe courantes
[Link](x);
String [Link] (i);
25 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’instanciation (1)
● Instanciation : concrétisation d’une classe en un objet
« concret ».
● Dans nos programmes Java nous allons définir des classes
et instancier ces classes en des objets qui vont interagir.
Le fonctionnement du programme résultera de
l’interaction entre ces objets « instanciés ».
● En Programmation Orientée Objet, on décrit des classes
et l’application en elle-même va être constituée des objets
instanciés, à partir de ces classes, qui vont communiquer
et agir les uns sur les autres.
26 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’instanciation (2)
● Instance
● représentant physique d'une classe
● obtenu par moulage du dictionnaire des variables et
détenant les valeurs de ces variables.
● Son comportement est défini par les méthodes de sa classe
● Exemple :
● si nous avons une classe voiture, alors votre voiture est une
instance particulière de la classe voiture.
● Classe = concept, description
● Objet = représentant concret d’une classe
27 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Les constructeurs (1)
● L'appel de new pour créer un nouvel objet déclenche,
dans l'ordre :
● L'allocation mémoire nécessaire au stockage de ce nouvel
objet et l'initialisation par défaut de ces attributs,
● L'initialisation explicite des attributs, s'il y a lieu,
● L'exécution d'un constructeur.
● Un constructeur est une méthode d'initialisation.
public class Application
Le constructeur est ici celui
{
par défaut (pas de
public static void main(String args[])
constructeur défini dans
{
la classe Personne)
Personne p = new Personne()
[Link](« ahmed") ;
} }
28 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Les constructeurs (2)
● Lorsque l'initialisation explicite n'est pas possible (par
exemple lorsque la valeur initiale d'un attribut est
demandée dynamiquement à l'utilisateur), il est possible
de réaliser l'initialisation au travers d'un constructeur.
● Le constructeur est une méthode :
● de même nom que la classe,
● sans type de retour.
● Toute classe possède au moins un constructeur. Si le
programmeur ne l'écrit pas, il en existe un par défaut,
sans paramètres, de code vide.
29 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Les constructeurs (3)
[Link] Définition d’un
Constructeur. Le
public class Personne
constructeur par défaut
{
(Personne() )n’existe plus.
public String nom;
Le code précédent
public String prenom;
occasionnera
public int age;
une erreur
public Personne(String unNom,
String unPrenom,
int unAge) public class Application
{ {
nom=unNom; public static void main(String
prenom=unPrenom; args[])
age = unAge; {
} Personne p = new Personne()
} [Link](" ahmed") ;
Va donner une erreur à la compilation
} }
30 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Les constructeurs (4)
● Pour une même classe, il peut y avoir plusieurs
constructeurs, de signatures différentes (surcharge).
● L'appel de ces constructeurs est réalisé avec le new auquel
on fait passer les paramètres.
● p1 = new Personne(" ahmed", " jabri", 56);
● Déclenchement du "bon" constructeur
● Il se fait en fonction des paramètres passés lors de l'appel
(nombre et types). C'est le mécanisme de "lookup".
● Attention
● Si le programmeur crée un constructeur (même si c'est un
constructeur avec paramètres), le constructeur par défaut n'est
plus disponible. Attention aux erreurs de compilation !
31 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Les constructeurs (5)
[Link]
public class Personne
Redéfinition d’un
{
Constructeur sans paramètres
public String nom;
public String prenom;
public int age;
public Personne()
{
nom=null; prenom=null; On définit plusieurs constructeurs
age = 0; qui se différencient uniquement
} par leurs paramètres (on parle
public Personne(String unNom, de leur signature)
String unPrenom, int unAge)
{
nom=unNom;
prenom=unPrenom; age = unAge;
} }
32 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Classe et objet en Java
Du modèle à … … la classe Java et ... des instances
de la classe à ... de cette classe
Personne
class Personne
nom : String { Personne p1, p2;
age : Integer
String nom; p1 = new Personne ();
salaire : Double
int age; p2 = new Personne ();
float salaire;
};
L’opérateur d’instanciation en Java est new :
MaClasse monObjet = new MaClasse();
En fait, new va réserver l’espace mémoire nécessaire pour créer
l’objet « monObjet » de la classe « MaClasse »
Le new ressemble beaucoup au malloc du C
33 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Ordre des membres
● En Java, une classe est analysée par le compilateur en
plusieurs passe on peut donc déclarer les méthodes, les
champs etc dans n'importe quel ordre
● L'ordre usuel à l'intérieur d'une classe est: champs,
constructeurs, getter/setter, méthode, méthode statique
34 Hafidi Imad-ENSA de Khouribga-Cours JAVA
Destruction d’objets (1)
● Java n'a pas repris à son compte la notion de
destructeur telle qu’elle 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 référencés.
● Le ramasse-miettes fonctionne en permanence dans un
thread de faible priorité (en « tâche de fond »). Il est basé
sur le principe du compteur de références.
35 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Destruction d’objets (2)
● Ainsi, le programmeur n’a plus à gérer directement la
destruction des objets, ce qui était une importante
source d'erreurs (on parlait de fuite de mémoire ou
« memory leak » en anglais).
● Le ramasse-miettes peut être "désactivé" en lançant
l'interpréteur java avec l'option -noasyncgc.
● Inversement, le ramasse-miettes peut être lancé par une
application avec l'appel [Link]();
36 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Destruction d’objets (3)
● Il est possible au programmeur d'indiquer ce qu'il faut
faire juste avant de détruire un objet.
● C'est le but de la méthode finalize() de l'objet.
● Cette méthode est utile, par exemple, pour :
● fermer une base de données,
● fermer un fichier,
● couper une connexion réseau,
● etc.
37 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Exercice : initialisation JAVA
● Créez une classe Personne avec les méthodes et les
attributs suivants:
● String nom,
● String Prenom,
● int age
● String getNom()
● String getPrenom()
● int getAge();
● void afficher() : Affiche les informations de la personne
38 Hafidi Imad-ENSA de Khouribga-Cours JAVA
Programmation Orientée Objet
● Les paradigmes « objet »
● Encapsulation
● Regrouper données et opérations
● Héritage
● Généralisation de classes
● Polymorphisme
● Découle de l’héritage, permet aux classes les plus générales d’utiliser les
spécifications des classes plus spécifiques
● Généricité (extension de l’encapsulation)
● Modèle d’encapsulation, quelque soit le type des données
39
L’encapsulation (1)
● Notion d'encapsulation :
● les données et les procédures qui les manipulent sont
regroupées dans une même entité, l'objet.
● Les détails d'implémentation sont cachés, le monde
extérieur n'ayant accès aux données que par
l'intermédiaire d'un ensemble d'opérations constituant
l'interface de l'objet.
● Le programmeur n'a pas à se soucier de la représentation
physique des entités utilisées et peut raisonner en termes
d'abstractions.
40 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’encapsulation (2)
● Programmation dirigée par les données :
● pour traiter une application, le programmeur commence
par définir les classes d'objets appropriées, avec leurs
opérations spécifiques.
● chaque entité manipulée dans le programme est un
représentant (ou instance) d'une de ces classes.
● L'univers de l'application est par conséquent composé
d'un ensemble d'objets qui détiennent, chacun pour sa
part, les clés de leur comportement.
41 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Contrôle d’accès (1)
● Chaque attribut et chaque méthode 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 méthode 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 méthode de sa classe. Il est alors privé.
● Les mots réservés sont :
● public
● private
42 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Contrôle d’accès (2)
● En toute rigueur, il faudrait toujours que :
● les attributs ne soient pas visibles,
● Les attributs ne devraient pouvoir être lus ou modifiés que par
l'intermédiaire de méthodes prenant en charge les vérifications et
effets de bord éventuels.
● les méthodes "utilitaires" ne soient pas visibles,
● seules les fonctionnalités de l'objet, destinées à être
utilisées par d'autres objets soient visibles.
● C’est la notion d’encapsulation
● Nous verrons dans la suite que l’on peut encore affiner
le contrôle d’accès
43 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Contrôle d’accès (3)
public class Parallelogramme
{
private int longueur = 0; // déclaration + initialisation explicite
private int largeur = 0; // déclaration + initialisation explicite
public int profondeur = 0; // déclaration + initialisation explicite
public void affiche ( )
{[Link]("Longueur= " + longueur + " Largeur = " + largeur
+
" Profondeur = " + profondeur);
}}
public class ProgPpal
{
public static void main(String args[])
{
Parallelogramme p1 = new Parallelogramme();
[Link] = 5; // Invalide car l'attribut est privé
[Link] = 4; // OK
[Link]( ); // OK
}}
44 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Composition d’objets (1)
● Un objet peut être composé à partir d’autres objets
Exemple : Une voiture composée de
● 5 roues (roue de secours) chacune composée
● d’un pneu
● d’un moteur composé
● de plusieurs cylindres
● de portières
● etc…
Voiture Moteur Portière Portière
Roue Roue Roue Roue Roue
Pneu Pneu Pneu Pneu Pneu
Chaque composant est un attribut de l’objet composé
45 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Composition d’objets (2)
Syntaxe de composition d’objets
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;}
46 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Composition d’objets (3)
● Généralement, le constructeur d’un 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();}
47 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Composition d’objets (4)
● L’instanciation d’un objet composé instancie ainsi tous
les objets qui le composent
Moteur Portière Portière
Voiture
RoueAVG RoueAVD RoueARG RoueARD RoueSecours
G
Roue Roue Roue Roue Roue
diamètre diamètre diamètre diamètre diamètre
Pneu Pneu Pneu Pneu Pneu
pression pression pression pression pression
48 Hafidi Imad -ENSA de Khouribga-Cours JAVA
TP a faire
● Partie 1 : TP 1
49 Hafidi Imad-ENSA de Khouribga-Cours JAVA
Héritage en Java
50 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’héritage (1) : Concept
● La modélisation du monde réel nécessite une
classification des objets qui le composent
● Classification = distribution systématique en catégories
selon des critères précis
● Classification = hiérarchie de classes
● Exemples :
● classification des éléments chimiques
● classification des êtres vivants
51 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’héritage (2) : exemple
Forme géométrique
Polygone Ellipse
Quadrilatère Triangle Cercle
Rectangle Triangle Triangle
equilateral Rectangle
Carré
52 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’héritage (3) : définition
● Héritage : mécanisme permettant le partage et la
réutilisation de propriétés entre les objets. La relation
d’héritage est une relation de généralisation / spécialisation.
● La classe parente est la superclasse.
● La classe qui hérite est la sous-classe.
53 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’héritage (3) : représentation
graphique
Homme
Age : Integer
Taille : Double
Poids : Double
Nom : String Superclasse
parle()
mange()
boit()
dort()
Lien d’héritage
Conducteur
conduire()
Sous-classe
demarrer()
Représentation avec UML d’un héritage
(simple)
54 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’héritage avec Java (1)
● Java implémente le mécanisme d'héritage simple qui
permet de "factoriser" de l'information grâce à une
relation de généralisation / spécialisation entre deux
classes.
● Pour le programmeur, il s'agit d'indiquer, dans la sous-
classe, le nom de la superclasse dont elle hérite.
● Par défaut toutes classes Java hérite de la classe Object
● L'héritage multiple n'existe pas en Java.
● Mot réservé : extends
55 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’héritage avec Java (2)
class Personne
{ Personne
private String nom; nom : String
date_naissance : Date
private Date date_naissance;
// ...
}
class Employe extends Personne
{ Employe
salaire : Double
private float salaire;
// ...
}
class Etudiant extends Personne
{ Etudiant
private int numero_carte_etudiant; numero_carte_etudiant : Integer
// ...
}
56 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’héritage en Java (3)
● Constructeurs et héritage
● par défaut le constructeur d’une sous-classe appelle le
constructeur "par défaut" (celui qui ne reçoit pas de
paramètres) de la superclasse. Attention donc dans ce cas
que le constructeur sans paramètre existe toujours dans la
superclasse...
● Pour forcer l'appel d'un constructeur précis, on utilisera le
mot réservé super. Cet appel devra être la première
instruction du constructeur.
57 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’héritage en Java (4)
public class Personne
public class Employe extends
{
Personne
public String nom, prenom;
{
public int anNaissance;
public Employe () {}
public Personne()
public Employe (String nom,
{
String prenom,
nom=""; prenom="";
int anNaissance)
}
{
public Personne(String nom,
super(nom, prenom, anNaissance);
String prenom,
}
int
}
anNaissance)
{
Appel explicite à ce constructeur [Link]=nom;
avec le mot clé super [Link]=prenom;
[Link]=anNaissance;
}
58 Hafidi Imad -ENSA de Khouribga-Cours JAVA }
L’héritage
public class Personne
en Java (5)
{
public String nom, prenom;
public int anNaissance; public class Object
public Personne() {
{ public Object()
nom=""; prenom=""; {
} … / ...
public Personne(String nom, }
String prenom, }
int
anNaissance)
{ Appel par défaut dans le constructeur
[Link]=nom; de Personne au constructeur
[Link]=prenom; par défaut de la superclasse de
Personne, qui est Object
[Link]=anNaissance;
}
}
59 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Redéfinition de méthodes
● Une sous-classe peut redéfinir des méthodes existant dans
une de ses superclasses (directe ou indirectes), à des fins de
spécialisation.
● Le terme anglophone est "overriding". On parle aussi de
masquage.
● La méthode redéfinie doit avoir la même signature.
class Employe extends
Personne class Cadre extends Employe
{ {
redéfinition public calculePrime()
private float salaire;
public calculePrime( ) {
{ // ...
// ... }
} // ...
} }
60 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Recherche dynamique des méthodes
(1)
● Le polymorphisme
● Capacité pour une entité de prendre plusieurs formes.
● En Java, toute variable désignant un objet est
potentiellement polymorphe, à cause de l'héritage.
● Polymorphisme dit « d’héritage »
● le mécanisme de "lookup" dynamique :
● déclenchement de la méthode la plus spécifique d’un
objet, c'est-à-dire celle correspondant au type réel de
l'objet, déterminé à l'exécution uniquement (et non le type
de la référence, seul type connu à la compilation, qui peut
être plus générique).
● Cette dynamicité permet d'écrire du code plus générique.
61 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Recherche dynamique des méthodes
(2)
Employe e = new Employe();
[Link]();
Employe
salaire : Double
calculePrime()
Employe e = new Cadre();
Cadre
[Link]();
calculPrime()
62 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Surcharge de méthodes (1)
● Dans une même classe, plusieurs méthodes peuvent
posséder le même nom, pourvu qu'elles diffèrent en
nombre et/ou type de paramètres.
● On parle de surdéfinition ou surcharge, on encore en
anglais d’overloading en anglais.
● Le choix de la méthode à utiliser est fonction des
paramètres passés à l'appel.
● Ce choix est réalisé de façon statique (c'est-à-dire à la compilation).
● Très souvent les constructeurs sont surchargés (plusieurs
constructeurs prenant des paramètres différents et
initialisant de manières différentes les objets)
63 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Opérateur instanceof
● L'opérateur instanceof confère aux instances une capacité
d'introspection : il permet de savoir si une instance est
instance d'une classe donnée.
● Renvoie une valeur booléenne
if ( ... )
Personne p = new Etudiant();
else
Personne p = new Employe();
//...
if (p instanceof Employe)
// discuter affaires
else
// proposer un stage
64 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Forçage de type / transtypage (1)
● Lorsqu'une référence du type d'une classe contient une
instance d'une sous-classe, il est nécessaire de forcer le
type de la référence pour accéder aux attributs
spécifiques à la sous-classe.
● Si ce n'est pas fait, le compilateur ne peut déterminer le
type réel de l'instance, ce qui provoque une erreur de
compilation.
● On utilise également le terme de transtypage
● Similaire au « cast » en C
65 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Forçage de type / transtypage (2)
class Personne
{
A ce niveau pour le
private String nom;
compilateur dans la
private Date date_naissance;
variable «p » c’est
// ...
un objet de la classe
}
Personne, donc qui
n’a pas d’attribut
class Employe extends Personne
« salaire »
{
public float salaire;
// ... On « force » le type
} de la variable « p »
pour pouvoir accéder
Personne p = new Employe (); à l’attribut « salaire ».
float i = [Link]; // Erreur de compilation On peut le faire car c’est
float j = ( (Employe) p ).salaire; // OK bien un objet Employe
qui est dans cette
variable
66 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’autoréférence : this (1)
● Le mot réservé this, utilisé dans une méthode, désigne la
référence de l'instance à laquelle le message a été envoyée
(donc celle sur laquelle la méthode est « exécutée »).
● Il est utilisé principalement :
● lorsqu'une référence à l'instance courante doit être passée en
paramètre à une méthode,
● pour lever une ambiguïté,
● dans un constructeur, pour appeler un autre constructeur de
la même classe.
67 Hafidi Imad -ENSA de Khouribga-Cours JAVA
L’autoréférence : this (2)
class Personne
{ Pour lever l’ambiguïté sur le mot « nom »
public String nom;
Personne (String nom) et déterminer si c’est le nom du paramètre
{ ou de l’attribut
[Link]=nom;
}
}
public MaClasse(int a, int b) {...}
Appelle le constructeur
public MaClasse (int c) MaClasse(int a, int b)
{
this(c,0);
}
Appelle le constructeur
public MaClasse () MaClasse(int c)
{
this(10);
}
68 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Référence à la superclasse
● Le mot réservé super permet de faire référence au constructeur de
la superclasse directe mais aussi à d’autres informations provenant
de cette superclasse.
class Employe extends
Personne Appel à la méthode calculPrime()
{ de la superclasse de Cadre
private float salaire;
public float calculePrime()
{
return (salaire * 0,05);
}
// ... class Cadre extends Employe
} {
public calculePrime()
{
return ([Link]() / 2);
}
// ...
69 Hafidi Imad -ENSA de Khouribga-Cours JAVA }
Classes abstraites (1)
● Il peut être nécessaire au programmeur de créer une
classe déclarant une méthode sans la définir (c'est-à-dire
sans en donner le code). La définition du code est dans
ce cas laissée aux sous-classes.
● Une telle classe est appelée classe abstraite.
● Elle doit être marquée avec le mot réservé abstract.
● Toutes les méthodes de cette classe qui ne sont pas
définies doivent elles aussi être marquées par le mot
réservé abstract.
● Une classe abstraite ne peut pas être instanciée.
70 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Classes abstraites (2)
● Par contre, il est possible de déclarer et d'utiliser des
variables du type de la classe abstraite.
● Si une sous-classe d'une classe abstraite ne définit pas
toutes les méthodes abstraites de ses superclasses, elle
est abstraite elle aussi.
public abstract class Polygone
{
private int nombreCotes = 3;
public abstract void dessine (); // methode non définie
public int getNombreCotes()
{
return(nombreCotes);
}
}
71 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Interfaces
72 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Interfaces : comment classifier ?
● Java ne permet pas l’héritage multiple
● Or, il existe parfois différentes classifications possibles
selon plusieurs critères
73 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Exemple de classification
● Selon la forme Solides convexes
Polyèdres Solides de révolution
Parallélépipède
Cylindres Sphères
Cube
74 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Autre classification
● Selon la matière
matiere
Matiere organique composée minéral
carbone
75 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Autres critères
● D’autres critères qui pourraient servir à réaliser une
classification décrivent des comportements ou des
capacités
● « électrique »
● « comestible »
● « lumineux »
● Or ces « mécanismes » peuvent être commun à
différentes classes non reliées entre elles par une relation
d ’héritage
76 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Notion d’ « Interfaces »
● Pour définir qu'une certaine catégorie de classes doit
implémenter un ensemble de méthodes, on peut
regrouper les déclarations de ces méthodes dans une
interface.
● Le but est de décrire le fait que de telles classes
pourront ainsi être manipulées de manière identique.
● Exemple :
● Tous les appareils électriques peuvent être allumés ou
éteint
● Tous les objets comestibles peuvent être mangés
● Tous les objets lumineux éclairent
77 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Définition d’Interface
● Une interface est donc la description d’un ensemble des
procédures (méthodes) que les classes Java peuvent mettre
en oeuvre.
● Les classes désirant appartenir à la catégorie ainsi définie
● déclareront qu'elles implémentent cette interface,
● fourniront le code spécifique des méthodes déclarées dans
cette interface.
● Cela peut être vu comme un contrat entre la classe et
l’interface
● la classe s’engage à implémenter les méthodes définies dans
l’interface
78 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Codage d’une interface en Java
● Mot réservé : interface
● Dans un fichier nom_interface.java, on définit
la liste de toutes les méthodes de l’interface
interface nomInterface {
type_retour methode1(paramètres);
type_retour methode2(paramètres);
… }
● Les méthodes d'une interface sont abstraites : elles
seront écrites spécifiquement dans chaque classe
implémentant l’interface
● Le modificateur abstract est facultatif.
79 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Implémentation d’une interface dans
une classe
● Mot réservé : implements
● La classe doit expliciter le code de chaque méthode
définie dans l’interface
class MaClasse implements nomInterface
{
…
type_retour methode1(paramètres)
{code spécifique à la méthode1 pour cette classe};
… }
80 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Exemple d’Interface (1)
interface Electrique class Radio implements Electrique
{ {
void allumer(); // ...
void eteindre(); void allumer() {[Link](« bruit »);}
} void eteindre()
{[Link](« silence »);}
class Ampoule implements Electrique
{
// ...
void allumer() {[Link](« j’éclaire »);}
void eteindre() {[Link](« plus de lumière»);}
}
81 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Exemple d’Interface (2)
// …
Ampoule monAmpoule = new Ampoule();
Radio maRadio = new Radio();
Electrique c;
Boolean sombre;
// …
if(sombre == true)
c = monAmpoule;
else
c = maRadio;
[Link]();
…
[Link]();
// …
82 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Utilisation des interfaces
Une variable peut être définie selon le type d’une interface
Une classe peut implémenter plusieurs interfaces différentes
L’opérateur 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;[Link]();}
83 Hafidi Imad -ENSA de Khouribga-Cours JAVA
Conclusion sur les interfaces
● Un moyen d’écrire du code générique
● Une solution au problème de l’héritage multiple
● Un outil de concevoir d’applications réutilisables
84 Hafidi Imad -ENSA de Khouribga-Cours JAVA
TP a faire
● Partie 2 : TP 1
85 Hafidi Imad-ENSA de Khouribga-Cours JAVA