Académique Documents
Professionnel Documents
Culture Documents
2
Objectif: réutilisation
Concepts de base:
Objet et classe
Héritage
Encapsulation
Polymorphisme
Abstraction
Interface
3
Le concept de classe est une généralisation de la notion type.
La classe est une généralisation d’un ensemble d’objets ayant une structure de
données commune et disposant des mêmes méthodes.
Instancier une classe consiste à créer un objet sur son modèle
Chaque objet appartient à une classe
Un objet est caractérisé par un état (attributs) et un comportement (méthodes)
L’état d’un objet peut changer dans le temps (généralement par le
comportement)
Chaque objet possède une identité propre à lui appelée référence (adresse
mémoire)
4
Mode d’accès: visible uniquement pour les méthodes de la classe Personne
Type des attributs
Méthodes
Syntaxe:
Mode d’accès type nom;
Ps: un attribut est initialisé soit implicitement à la valeur initiale par défaut, soit
explicitement, soit avec un constructeur.
6
En Java, une méthode est définie dans une classe . Elle implémente les traitements de la classe.
Elle est définie par :
Un mode d’accès
un type de retour
un nom
une liste (éventuellement vide) de paramètres typés en entrée
une suite d’instructions (un bloc d’instructions) qui constitue le corps de la méthode
Syntaxe:
Mode d’accès typeRetour nomMethode ( « Liste des paramètres » ) {
/*
corps de la méthode
*/
}
7
Une méthode ne fournir aucun résultat (void) ou fournit un résultat en retour. cette dernière est appelé
méthode fonction
Exemple : public int calculeAge() //une méthode fonction qui retourne un entier.
Les arguments muets d’une méthode sont les paramètres utilisés lors de sa définition.
Les arguments effectifs sont utilisés lors de l’appel de la méthode.
Exemple:
Public void setName(String name){ //name est un argument muet
….
}
….
p.setName("ahmed"); //argument effectif
PS: le type de l’argument effectif doit être identique ou convertible au type de l’argument muet.
8
Constructeur: une méthode appelée au moment de la création d’un objet elle est:
sans valeur de retour
portant le nom de la classe
peut disposer d’un nombre quelconque d’arguments
Un constructeur privé ne peut pas être appelé de l’extérieur et ne peut plus être utilisé
pour instancier les objets.
9
Le constructeur initialise explicitement ou implicitement les valeurs des attributs.
Accesseurs et mutateurs
Afin d’accéder à un attribut pour changer sa valeur (en écriture) ou pour
récupérer sa valeur (en lecture) on utilise:
Accesseur (getter) pour récupérer la valeur de l’attribut nom d’un objet de type Personne:
Mutateur (setter) pour changer la valeur de l’attribut nom d’un objet de type Personne:
10
Personne ahmed;
Est correct
Ne réserve pas un espace mémoire
Réserve seulement un emplacement pour une référence à un objet de type personne
Une fois l’objet initialisé, les méthodes peuvent s’appliquer sur lui;
ahmed
p
10/04/1995
12
private, public protected
o Ces trois modificateurs peuvent être combinés pour modifier la visibilité des
classes, méthodes, variables.
public : classes, méthodes, variables déclarées « public » sont visibles par toutes les
autres méthodes que ce soit à l'intérieur ou à l'extérieur du package de définition.
(contraire au principe d’encapsulation)
protected : méthodes, variables ( protected n'est pas autorisé pour les classes)
déclarées « protected » ne sont accessibles que par les méthodes de la classe et des sous-
classe du package de l'objet de définition.
private : c'est le degré de restriction le plus fort ; seules les méthodes de la même classe
peuvent voir une entité (variable ou méthode) déclarée private .
13
14
Créés en utilisant le mot clé static,
Un attribut de classe est un champ qui existe dans toutes les instances de la classe. Il a la même valeur
quelque soit l’objet. (données globale partagée entre tous les objets de la même classe)
Exemple: public static int nombrePersonnes;
Une méthode de classe est une méthode qui opère un traitement indépendant des objets. Une méthode static
ne peut agir que sur les attributs static.
Exemple:
public static int getNombre (){
return nombrePersonnes;
}
l’appel d’un champ de classe ou méthode de classe fait directement en utilisant uniquement le nom de la
classe.
Exemple:
Personne. nombrePersonnes;
Personne.getNombre ();
15
Appelée aussi surdéfinition: plusieurs méthodes dans la même classe peuvent
porter les même noms à condition qu’elles aient des signatures différentes. (leurs
paramètres sont différents pour permettre au compilateur de choisir)
Exemple:
Supposons que la méthode public int calculerAge(String nom) existe dans la
classe personne. Java nous permet de créer aussi des méthodes comme:
public int calculerAge() //ok
public int calculerAge(LocalDate dateNaissance) //ok
public int calculerAge(String nom, LocalDate dateNaissance) //ok
Cependant, il est impossible de créer les méthodes:
public int calculerAge(String nom) //ko mêmes arguments
public float calculerAge(String nom) //ko mêmes arguments
16
Permet de disposer de plusieurs constructeurs dans la même classe. On peut
donc créer différentes instances selon le constructeur utilisé.
17
Peut créer des d’ambiguïtés (cas de conversion)
18
Programme Résultat
19
Les opérateurs == et != s'appliquent théoriquement à des objets.
L'expression a == b est vraie uniquement si a et b font référence à un seul et
même objet, et non pas seulement si les valeurs des champs de a et b sont les
mêmes.
Exemple:
Résultat: différent
20
Exemple
Résultat: égaux
21
Deux modes pour l’échange d’information avec les méthodes:
Par valeur: la méthode utilise une copie de la valeur de l’argument. L’argument lui
reste inchangée.
Par référence: la méthode reçoit une référence vers l’argument. La méthode peut
ainsi modifier directement sa valeur.
Java transfert les données par valeur. mais quand la valeur concerne un
objet (qui est au fait une référence), la méthode peut ainsi modifier l’objet
comme s’il s’agissait d’un transfert par référence.
22
Java ne propose pas d’opérateur pour détruire un objet dont on a plus
besoin.
Il existe un mécanisme de gestion automatique de la mémoire qui s’appelle le
ramasse-miettes (ou Garbadge Collector) qui libère l’espace des objets qui
n’ont aucune référence.
S’exécute manuellement ou dès que la mémoire disponible est inférieur à un
seuil.
Risque de diminution de performance
23
Une classe interne est définie au sein d’une autre classe externe
Exemple
24
o Construire une classe qui représente un point, Chaque instance (objet) de
cette classe appelée Point possède 2 attributs privés x et y qui représentent
les coordonnées du point. Les cordonnées peuvent être fixées pendant la
construction du point, sinon on peut les changer après à l’aide des getters
et des setters. Proposer une méthode changerCoordonnées(int x, int y) qui
change à la fois les attributs x et y d’un point.
o Construire une deuxième classe qui représente un cercle, chaque instance
de cette classe possède 2 attributs privés o et r qui représentent
successivement le centre (de type point) et le rayon du cercle. On définit
lors de la construction le rayon r du cercle, puis on définit un getter et un
setter pour les deux attributs.
o Dans la classe de test, construire (instancier) un objet o de type Point (en
fixant x et y pendant la construction) et un objet cercle de type Cercle. Puis
définir o comme le centre de cercle. Ensuite utiliser le getter de cercle pour
afficher les cordonnées de o.
25
Un des fondements de la programmation orientée objet, Il permet la réutilisation
de code: gain temps de développement et de maintenance.
Une classe fille (dérivée, sou-classe) hérite les attributs et les méthodes de sa
classe mère (de base, sur-classe).
Une classe fille ne va donc définir que les attributs et méthodes qui la
différencient de la classe mère
En java le mot clé extends permet de spécifier, dans la classe fille, le nom de la
classe mère.
Une classe fille hérite tout d’une classe mère. Sauf le constructeur.
Dans java toutes les classes héritent d’une seule classe
explicitement avec extends,
implicitement de la classe Object
26
27
Le constructeur de la classe fille doit prendre en charge la construction de
l’intégralité de l’objet.
Le constructeur de la classe fille peut appeler le constructeur de la classe mère
avec la méthode super() //tenir compte des paramètres!
28
Instanciation des objets: (rappel)
o Dans le cas général des classes simples, la création d'un objet (A a = new A(…)) fait
intervenir les phases suivantes:
allocation de mémoire;
initialisation par défaut des champs (aux valeurs "nulles" habituelles );
initialisation explicite, s’il y a lieu, des champs (aux valeurs données par le programmeur
lors de la déclaration);
exécution des instructions du constructeur.
29
Instanciation d’un objet d’une classe dérivée:
30
Dérivations successives :
o Le cas ou la classe fille est aussi une classe mère de plusieurs autres
classes filles….
o Exemple
32
Redéfinition des méthodes
Supposons que nous souhaitons avoir une méthode affiche() dans la classe
personne qui affiche les informations sur le nom et la date de naissance de l’objet
en cours.
La méthode serait de la forme:
33
Redéfinition des méthodes
Solution: Redéfinir la méthode affiche() dans la classe Employé tout en réutilisant celle
de la classe personne. On peut donc dans la classe Employé ajouter:
Cette possibilité existe en Java; elle se nomme redéfinition de méthode. Elle permet à
une classe dérivée de redéfinir une méthode de sa classe de base, en proposant une
nouvelle définition. Encore faut-il respecter la signature de la méthode (type des
arguments), ainsi que le type de la valeur de retour.
Résultat: l’appel de la méthode affiche par un objet Employé affichera aussi le salaire
PS: les attributs nom et dateNaissance étant privés, il est impossible d’afficher
directement leurs valeurs sans passer par la méthode affiche() de la classe Personne.
34
Redéfinition des méthodes
o La redéfinition d'une méthode s'applique à une classe et à toutes ses
descendantes jusqu'à ce que éventuellement l'une d'entre elles
redéfinisse à nouveau la méthode.
o Exemple:
(*) signale la définition ou la redéfinition d'une méthode f
35
Surcharge (ou Surdéfinition) et héritage
o Jusqu'à maintenant, nous n'avions considéré la surdéfinition qu'au sein d'une
même classe. En Java, une classe dérivée peut surdéfinir une méthode d'une classe
de base (ou, plus généralement, d'une classe ascendante). En voici un exemple :
36
Contraintes portant sur la redéfinition
o Valeur de retour
Lorsqu'on surdéfinit une méthode, on n'est pas obligé de respecter le type de la valeur de
retour. Cet exemple est légal :
37
Contraintes portant sur la redéfinition
o Valeur de retour (Suite)
En revanche, en cas de redéfinition, Java impose non seulement l'identité des signatures, mais aussi
celle du type de la valeur de retour :
Ici, on n'a pas affaire à une surdéfinition de f puisque la signature de la méthode est la même dans A et
dans B. Il devrait donc s'agir d'une redéfinition, mais comme les types de retour sont différents, on
aboutit à une erreur de compilation !!
38
Contraintes portant sur la redéfinition
o Les droits d’accès
Exemple:
Attention : La redéfinition d'une méthode ne doit pas diminuer les droits d'accès à cette méthode.
39
Notion de la POO qui complète l’héritage.
Permet d’affecter à un objet
La référence vers un objet de type correspondant
la référence à un objet de type dérivé. (conversion implicite)
40
Une variable final ne peut pas être modifiée.
Une classe finale ne peut pas avoir de classe fille
Une méthode finale ne peut pas être redéfinie dans une classe fille
41
Une classe abstraite permet de définir dans une classe mère les fonctionnalités communes entre
toutes ses classes filles
Une classe abstraite ne peut pas être utilisée pour instancier des objets.
Une classe abstraite ne sert que pour une classe mère.
Exemple:
/
42
Quelques règles:
Une classe est abstraite dès qu’elle comporte une méthode abstraite. (bien que le
mot abstract peut être omis)
Une méthode abstraite ne peut pas être finale
Une méthode abstraite doit être public
Une classe dérivée d'une classe abstraite n'est pas obligée de redéfinir toutes les
méthodes abstraites de sa classe de base.
43
Une interface est un type de classe abstraite qui ne contient que des méthodes
abstraites.
Les Interfaces permettent d’implémenter la notion de contrat.
Les interfaces peuvent contenir uniquement des définitions de constantes et
des déclarations de méthodes, sans leur définition (autrement dit, les
méthodes indiquées dans les interfaces ne comportent que le prototype sans
le corps).
Exemple:
public interface I {
public abstract void a(int x);
void b(); //public abstract facultatif
}
44
En java une classes ne peut dériver que d’une seule classe. Alors qu’elle peut implémenter
plusieurs interfaces.
Une classe qui implémente une interface doit redéfinir toutes ses méthodes.
Pour indiquer qu’une classe C implémente la méthode I :
public class C implements I{
//code pour redéfinir les méthodes a(int x) et b() de l’interface I
@Override
public void a(int x) {
// TODO Auto-generated method stub }
@Override
public void b() {
// TODO Auto-generated method stub }
}
45
Pour indiquer qu’une classe C implémente deux interfaces I1 et I2:
46
Comme pour les classes abstraites, une interface ne peut pas être instanciée,
Toute fois elle peut servir pour la création d’un objet qui contient une
référence vers une classe qui implémente l’interface en question. Ainsi:
I ref ; //est correct
I ref = new X(…) //est correct pour toute classe X qui implémente I
Résultat: Le mécanisme d’interface permet de faire du polymorphisme avec
des objets dont les classes n’appartiennent pas à la même hiérarchie
d’héritage.
47
Une interface peut définir aussi les constantes symboliques déclarées avec les
identificateur static et final.
Exemple:
public interface I {
static final int MAX = 10; //constante symbolique
//la déclaration des méthodes
}
Les constantes symbolique sont partagées par toutes les classes qui
implémentent l’interface et peut être utilisée directement moyennant le nom de
l’interface.
Exemple:
If (variable < I.MAX)……
48