Encapsulation et Héritage en POO
Encapsulation et Héritage en POO
ORIENTEE OBJET
Présenté par : Makrem Mhedhbi
L’ENCAPSULATION
CHAPITRE 3 2
L’ENCAPSULATION
Ainsi, un langage orienté objets comme Java ou C++ met en
œuvre l'encapsulation en permettant de créer des classes qui
regroupent les attributs et les méthodes associées.
Dans ces mêmes langages, l'information-hiding est mis en
œuvre (de façon totalement optionnelle - à la discrétion du
programmeur) par l'utilisation des
modificateurs private ou public (entre autres).
Dans la pratique une conception orientée objets moderne fait
intervenir conjointement ces deux principes
CHAPITRE 3 3
L’ENCAPSULATION
• Le principe d'encapsulation : un objet ne doit pas exposer sa
représentation interne au monde extérieur.
• Dans le but de renforcer le contrôle de l'accès aux variables d'une
classe, il est recommandé de les déclarer private.
• L'objet est ainsi vu de l'extérieur comme une boîte noire
• Protéger l'information contenue dans un objet et ne proposer que
des méthodes de manipulation de cet objet
CHAPITRE 3 4
Les Packages
Projet • Package = repertoire.
package 1
• Les classes Java peuvent être regroupées dans
des packages.
ClassA
• Déclaration d’un package
ClassB
package pack1;
Package 2 • Import d’un package
ClassE
CHAPITRE 3 5
Encapsulation des classes
CHAPITRE 3 6
Encapsulation des classes
Classe public :
public class A {
…
}
class A {
…
}
• La classe default est visible seulement par les classes de son package.
CHAPITRE 3 8
Encapsulation des attributs
CHAPITRE 3 9
Encapsulation des attributs
L’attribut public
public class A {
public int x;
…
}
public class A {
…
}
public class A {
…
}
• La variable par défaut n'est accessible que depuis les classes faisant partie du même package.
CHAPITRE 3 12
Encapsulation des attributs
L’attribut protected
public class A {
…
protected int w ;
CHAPITRE 3 14
Encapsulation des méthodes
Méthode public
public class A {
public void meth1()
{ }
…
}
public class A {
private void meth2 ()
{ }
…
}
public class A {
void meth3 () {}
…
}
La méthode par défaut n'est accessible que depuis les classes faisant partie du même
package.
CHAPITRE 3 17
Encapsulation des méthodes
Méthode protected
public class A {
Protected void meth4()
{}
…
}
La méthode protected est accessible uniquement aux classes d'un package et à ses sous-
classes (même si elles sont définies dans un package différent.)
CHAPITRE 3 18
Les attributs static
Etudiant [class]
Variable d’instance:
Chaque instance de la classe possède
ses propres valeurs des variables.
String nom;
Etudiant(String nom){
Mohamed Anissa
this.nom=nom;
}
} Etudiant etud1 = new Etudiant (“Mohamed");
Etudiant etud2 = new Etudiant (“Anissa ");
CHAPITRE 3 19
Les attributs static
Variable d’instance:
Class Etudiant {
String nom;
Etudiant(String nom){
this.nom=nom;
} class Test {
} public static void main(String[] args){
System.out.println(etudiant.nom);
}
}
class Etudiant{
String nom;
static int nbrEtudiants;
class Test{
Etudiant(String nom){ public static void main(String[] args){
this.nom=nom;
nbrEtudiants++; System.out.println(Etudiant.nbrEtudiants);
}
} }
}
CHAPITRE 3 22
Les méthodes static
CHAPITRE 3 23
Les méthodes static
Puisque les méthodes static appartiennent à la classe, elles ne peuvent en aucun cas
accéder aux variables d'instances qui appartiennent aux instances de la classe.
CHAPITRE 3 25
L’héritage
CHAPITRE 3 26
L’héritage
Définition:
Technique offerte par les langages de programmation pour construire une
classe à partir d’une (ou plusieurs) autre classe en partageant ses attributs et
opérations.
Intérêts :
Spécialisation, enrichissement : une nouvelle classe réutilise les attributs et
les opérations d’une classe en y ajoutant des opérations particulières à la
nouvelle classe
Redéfinition : une nouvelle classe redéfinit les attributs et opérations d’une
classe de manière à en changer le sens et/ou le comportement pour le cas
particulier défini par la nouvelle classe
Réutilisation : évite de réécrire du code existant et parfois on ne possède pas
les sources de la classe à hériter CHAPITRE 3 27
Pourquoi hériter ?
CHAPITRE 3 28
Classes et Sous classes
Un objet de la classe VehiculePrioritaire ou VoitureElectrique est aussi un objet de
la classe Voiture donc il dispose de tous les attributs et opérations de la classe
Voiture.
CHAPITRE 3 29
Classes et Sous classes
Définitions :
La classe VehiculePrioritaire hérite de la classe Voiture.
Voiture est la classe mère et VehiculePrioritaire la classe fille.
Voiture est la super-classe de la classe VehiculePrioritaire.
VehiculePrioritaire est une sous-classe de Voiture.
N.B :
Un objet de la classe VehiculePrioritaire ou VoitureElectrique est forcément un objet
de la classe Voiture.
CHAPITRE 3 30
Généralisation et Spécialisation
L’héritage permet
De généraliser dans le sens abstraction
De spécialiser dans le sens raffinement
CHAPITRE 3 31
Héritage et JAVA
Héritage simple
Une classe ne peut hériter que d’une seule autre classe
Dans certains autres langages (ex : C++) possibilité d’héritage multiple
Utilisation du mot-clé extends après le nom de la classe
CHAPITRE 3 34
Surcharge et Redéfinition
Une voiture électrique est une voiture dont l’opération de démarrage est
différente
Une voiture électrique répond aux même messages que la Voiture
On démarre une voiture électrique en activant un disjoncteur
Voiture public class VoitureElectonique extends Voiture {
+ demarre() private boolean disjoncteur;
...
public void demarre() {
disjoncteur = true;
}
VoitureElectrique ...
- disjoncteur : boolean }
+ demarre() Redéfinition de la méthode
CHAPITRE 3 35
Surcharge et Redéfinition
public class Voiture {
Ne pas confondre surcharge et
… redéfinition. En surcharge la classe
public void demarre() { ajoute des méthodes de même nom,
… tandis que la redéfinition «spécialise»
}
}
des méthodes existantes dans la classe
mère
Redéfinition Surcharge
public VehiculePriotitaire extends Voiture{
public VoitureElectonique extends Voiture{ …
… public void demarre(int code)
public void demarre() { {
… …
} }
} }
CHAPITRE 3 36
Méthodes et Classes final
Définition
• Utilisation du mot-clé final
• Méthode : interdire une éventuelle redéfinition d’une méthode
CHAPITRE 3 37
Héritage et constructeurs
Possibilité comme les méthodes de réutiliser le code des constructeurs de la super-classe
Appel explicite d’un constructeur de la classe mère à l’intérieur d’un constructeur de la
classe fille
super(paramètres du constructeur);
Appel implicite d'un constructeur de la classe mère est effectué quand il n'existe pas d'appel
explicite. Java insère implicitement l'appel super()
CHAPITRE 3 38
Héritage et constructeurs
Pour initialiser les attributs hérités, le constructeur d’une classe peut invoquer un des constructeurs de la classe
mère à l’aide du mot-clé super.
Si on ne fait pas d’appel explicite au constructeur de la superclasse, c’est le constructeur par défaut de la
superclasse qui est appelé implicitement. CHAPITRE 3 39
Héritage et constructeurs
Règles
public class A {
INTERDIT
public A ( int x) {
super();
this() ;
}
} CHAPITRE 3 40
Héritage et constructeurs
Constructeur implicite :
Attention :
Dans ce cas, le constructeur sans argument doit être défini dans la super-classe
CHAPITRE 3 41
La classe Object
• La classe Object est la classe de plus haut niveau dans la hiérarchie d'héritage.
• Toute classe autre que Object possède une super-classe
• Toute classe hérite directement ou indirectement de la classe Object
• Une classe qui ne définit pas de clause extends hérite de la classe Object
* Voiture
public class Voiture extends Object {
... + Class getClass()
public Voiture(int p, Galerie g) + String toString()
{ + boolean equals(Object)
puissance = p; + int hashCode()
moteur = new Moteur(puissance);
…
galerie = g;
...
} Il n'est pas nécessaire d'écrire
...
explicitement extends Object
} CHAPITRE 3 42
La classe Object
La classe Object fournit plusieurs méthodes qui sont héritées par toutes
les classes sans Exception.
Les plus couramment utilisées sont les méthodes toString et equals
CHAPITRE 3 43
Chainage des constructeurs
• Concernant le codage des constructeurs, le compilateur JAVA
applique trois règles très importantes, reflétant les capacités de JAVA
et les situations d’erreur de compilation :
• Règle 1 : Si la classe définie n’hérite pas explicitement, le compilateur
ajoute un héritage de la classe java.lang.Object.
• Règle 2 : Si la classe ne contient aucun constructeur, le compilateur
JAVA ajoute un constructeur non paramétré (par défaut).
• Règle 3 : Si la première ligne d’un constructeur n’est ni this(…) ni
super(…), le compilateur ajoute super().
CHAPITRE 3 44
Chainage des constructeurs
• Tout constructeur, sauf celui de la classe java.lang.Object, fait appel à un
autre constructeur qui est :
CHAPITRE 3 45
Chainage des constructeurs
▪ public class A { ▪ public class B extends A { ▪ public class C extends B {
CHAPITRE 3 46
Chainage des constructeurs
Affichage:
constructeur de A
constructeur de B
autre constructeur de B
constructeur de C
Explication:
Peut-être avez-vous oublié constructeur de A, si vous n'avez plus pensé que
l'instruction super(); est ajoutée en première ligne du constructeur sans
paramètre de la classe B.
CHAPITRE 3 48
Polymorphisme
• N’importe quel objet en Java qui peut passer d’une
relation « est un » peut être considéré polymorphe.
CHAPITRE 3 49
Polymorphisme
• Le polymorphisme est le fait de référencer une classe fille avec une référence déclaré
de type une classe mère.
• Exemple: Animal
Référence déclaré en
Objet crée en Dog
tant qu’Animal().
tant que Dog().
CHAPITRE 3 50
Polymorphisme
Avec le polymorphisme : le type de la référence peut être la classe mère de
l’objet instancié.
un tableau polymorphique.
Animal
Soit : Animal [ ] animals = new Animal [3];
Déclarer un tableau de type Animal.
Un tableau qui contiendra des objets
de type Animal.
CHAPITRE 3 51
Polymorphisme : Tableau
CHAPITRE 3 52
Polymorphisme : Tableau
CHAPITRE 3 53
instanceof
CHAPITRE 3 54
Polymorphisme au runtime
Animal
Animal animal = new Dog();
Dog
A quoi ça sert ?
En général à définir les grandes lignes du comportement d'une classe d'objets
sans forcer l'implémentation des détails de l'algorithme
En java, c'est le mot clef abstract qui permet de qualifier d'abstraite une classe ou
une méthode
CHAPITRE 3 58
Classes abstraites
Pourquoi "abstraite" ?
Une classe est abstraite soit parce qu'on n'est pas capable d'écrire
l'implémentation de toutes les méthodes, soit parce qu'on ne veut pas créer
d'instance de cette classe.