Академический Документы
Профессиональный Документы
Культура Документы
Plan
1
21/02/2017
Dans les programmes que vous avez écrits jusqu’à maintenant, les notions:
• De variables/types de données
• Et de traitement de ces données
Étaient séparées :
Opèrent sur
traitements données
influencent
2
21/02/2017
• D’encapsulation
• D’abstraction
• D’héritage
• Et de polymorphisme
Principe d’encapsulation:
Regrouper dans le même objet informatique les données et les traitements
qui lui sont spécifiques:
3
21/02/2017
4
21/02/2017
Programmeur Programmeur
Utilisateur Concepteur/développeur
accord
Interface
Définition d’un
Utilisation du type nouveau type
(classe)
10
5
21/02/2017
11
12
6
21/02/2017
13
En programmation objet :
14
7
21/02/2017
Exemple:
15
Dessin.class
Rectangle.class
16
8
21/02/2017
type nom_attribut;
Exemple:
18
9
21/02/2017
L’accès aux valeurs des attributs d’une instance de nom nom_instance se fait
comme pour accéder aux champs d’une structure :
nom_instance.nom_attribut;
Exemple:
19
L’instruction :
Crée une instance de type nomClasse et initialise tous ses attributs avec des valeurs
par défaut :
int 0
double 0.0
boolean false
objets null
Exemple:
10
21/02/2017
21
22
11
21/02/2017
Il n’est donc pas nécessaire de les passer comme arguments des méthodes.
Mais elles sont simplement mises dans la classe elle-même.
23
-> il ne faut donc pas passer les attributs comme arguments aux
méthodes de la classe!
24
12
21/02/2017
Mais ce n’est pas parce qu’on n’a pas besoin de passer les attributs de la
classe comme arguments aux méthodes de cette classe, que les méthodes
n’ont jamais de paramètres!
Les méthodes peuvent avoir des paramètres : ceux qui sont nécessaires (et
donc extérieurs à l’instance) pour exécuter la méthode en question!
Exemple:
25
nomInstance.nomMethode(valArg1, ….);
Exemple:
la méthode double surface() définie pour la classe Rectangle peut être appelée pour
une instance rect1 de cette classe par : rect1.surface();
26
13
21/02/2017
Surface()
longueur
largeur
28
14
21/02/2017
Tout ce qu’il n’est pas nécessaire de connaitre à l’extérieur d’un objet devrait
être dans le corps de l’objet et identifié par le mot clé : private
class Rectangle {
private double hauteur;
private double largeur;
}
29
30
15
21/02/2017
31
32
16
21/02/2017
33
34
17
21/02/2017
class Rectangle {
public double largeur;
public double hauteur;
}
Mais dans ce cas …
35
36
18
21/02/2017
Si dans une méthode, un attribut est masqué alors la valeur de l’attribut peut
quand même être référencée a l’aide du mot réservé this.
37
19
21/02/2017
Affectée à une variable, elle indique que celle-ci ne référence aucun objet :
39
• Elle implique que tous les attributs fasse partie de l’interface (public) ou soient
assortis d’un manipulateur → casse l’encapsulation
40
20
21/02/2017
Pour faire ces initialisations, il existe en java des méthodes particulières appelées
constructeurs.
41
Exemple :
42
21
21/02/2017
Les constructeurs sont des méthodes presque comme les autres. Les
différences sont :
• Pas de type de retour (pas même void)
• même nom que la classe
• Invoqués systématiquement à chaque fois qu’une instance est créée.
43
44
22
21/02/2017
Exemple :
// le constructeur par défaut
Rectangle() { hauteur=2.0; largeur=6.0; }
// deuxième constructeur
Rectangle(double l) { hauteur=2.0; largeur=l; }
// troisième constructeur
Rectangle(double h, double l) { hauteur=h; largeur=l; }
45
ATTENTION!
46
23
21/02/2017
A:
C:
B:
47
48
24
21/02/2017
r1 et r2 sont deux instances distinctes mais ayant des mêmes valeurs pour
leurs attributs.
49
Syntaxe:
Exemple:
50
25
21/02/2017
51
Exemple:
52
26
21/02/2017
53
54
27
21/02/2017
Si l’on veut que l’objet référencé par r2 soit une copie distincte de celui
référencé par r1, il ne faut pas utiliser l’opérateur = mais plutôt un
constructeur de copie (ou la méthode clone() ).
55
→ String toString()
La méthode toString() est invoquée automatiquement par System.out.println
56
28
21/02/2017
Exemple:
Exemple:
58
29
21/02/2017
Donc que faire si l’on souhaite comparer le contenu de deux objets de type
Rectangle?
Java prévoit que vous puissiez définir la méthode equals(), par exemple avec
l’entête suivant : boolean equals(Rctangle arg)
59
Exemple :
60
30
21/02/2017
Exemple (suite) :
61
62
31
21/02/2017
63
Classe Vehicule
------------------------
#Marque
#dateAchat
#Prix
------------------------
+vehicule
+affiche : void
32
21/02/2017
65
• Par ailleurs :
Des attributs et/ou méthodes supplémentaires peuvent être
définis par la sous-classe c1
→ enrichissement
33
21/02/2017
Lorsqu’une sous-classe c1 (ici Voiture ou Avion) est créée à partir d’une super-
classe c (ici Vehicule) :
67
Attention !
68
34
21/02/2017
Classe Vehicule
------------------------
#Marque
#dateAchat
#Prix
------------------------
+Vehicule
+affiche : void
Classe Avion
Classe Voiture
--------------------------
------------------------
#Moteur
#nbPortes
#heuresVol
------------------------
--------------------------
+voiture
+Avion
+affiche : void
+affiche : void
Classe Voitureelec
----------------------------
#temps de recharge
----------------------------
+Voitureelec
+affiche : void
69
70
35
21/02/2017
Une super-classe :
• Est une classe « parente »
• Déclare les attributs/méthodes communs
• Peut avoir plusieurs sous-classes
Une sous-classe est :
• Une classe « enfant »
• Étend une seule super-classe
• Hérite des attributs, des méthodes et du type de la super-classe
Syntaxe:
Exemple:
72
36
21/02/2017
Class Vehicule {
//…
}
73
37
21/02/2017
75
Exemple:
Class Vehicule {
//…
protected double vitesse;
}
38
21/02/2017
77
Classe Vehicule
------------------------
#Marque
#dateAchat
#Prix
------------------------
+Vehicule
+affiche : void
Classe Avion
Classe Voiture
--------------------------
------------------------
#Moteur
#nbPortes
#heuresVol
------------------------
--------------------------
+voiture
+Avion
+affiche : void
+affiche : void
Classe Voitureelec
----------------------------
#temps de recharge
----------------------------
+Voitureelec
+affiche : void
78
39
21/02/2017
79
80
40
21/02/2017
Mais …
Il ne doit pas être à la charge du concepteur des sous-classes de réaliser lui-
même l’initialisation des attributs hérités
L’initialisation des attributs hérités doit donc se faire au niveau des classes ou
ils sont explicitement définis.
41
21/02/2017
Syntaxe :
84
42
21/02/2017
85
86
43
21/02/2017
Les arguments fournis à super doivent être ceux d’au moins un des
constructeurs de la super-classe.
87
88
44
21/02/2017
89
Plus précisément, quand une même méthode est définie à la fois dans la
classe mère et dans la classe fille, son exécution est réalisée en fonction de
l’objet associé à l’appel
90
45
21/02/2017
Considérons cette situation dans laquelle les classes Point et Poincol sont
censées disposer chacune d’une méthode affiche()
class Point {
public Point(int x, int y){…}
public void affiche() {…}
}
91
Point p;
p = new Point(3,5);
92
46
21/02/2017
→Java ne se fonde pas sur le type de la variable p mais bel et bien sur le
type effectif de l’objet référencé au moment de l’appel.
94
47
21/02/2017
En résumé
Le polymorphisme en Java se traduit par :
95
96
48
21/02/2017
97
98
49
21/02/2017
99
Exemple:
100
50
21/02/2017
De plus, on aimerait :
→ imposer aux sous-classes (Rectangle, Cercle…) d’avoir leur méthode
surface() spécifique.
101
Mais comment faire si on sait pas comment calculer la surface d’une Figure
générique?
Et de plus…
Comment imposer a cette méthode surface soit redéfinie dans les sous-
classes?
102
51
21/02/2017
Première solution :
Ajouter une méthode quelconque définie arbitrairement :
103
Bonne solution :
Signaler que la méthode doit exister dans chaque sous-classe sans qu’il soit
nécessaire de la définir dans la super-classe.
104
52
21/02/2017
Syntaxe:
Exemple:
105
Une classe abstraite est une classe au moyen du mot réservé abstract:
Un exemple concret…
106
53
21/02/2017
Cercle n’est une classe abstraite Rectangle reste par contre une
classe abstraite
107
108
54
21/02/2017
109
110
55
21/02/2017
Un attribut final peut être initialisé dans le constructeur mais ne doit plus être
modifié par la suite.
Un exemple …
111
112
56
21/02/2017
113
Variable d’instance:
57
21/02/2017
115
Exemple:
Intégrons à une classe Employe le fait que 63 ans est l'âge officiel de départ
à la retraite.
116
58
21/02/2017
Similairement, si l’on ajoute static à une méthode on peut alors y accéder sans
aucun objet.
117
le compilateur ne peut pas être sur que l’objet this existe pendant
l’exécution de la méthode
Il ne peut donc pas admettre l’accès aux variables/méthodes d’instance
(car elles dépendent de this)
118
59
21/02/2017
119
120
60
21/02/2017
121
Syntaxe :
Exemple :
122
61
21/02/2017
Exemple :
123
Composants possibles :
62