Les méthodes d’instance
Gaël Thomas
1
Petits rappels : l’objet
● Une structure de données (tuple ou tableau) s’appelle un objet
● Un objet possède un type
● Le type d’un objet s’appelle une classe
● Si la classe d’un objet o est C, alors on dit que o est une instance de C
● En Java, les objets ne sont accessibles qu’à travers une référence
2
Limite de la programmation impérative
● Prog. impérative = celle que vous utilisez jusqu’à maintenant dans ce cours
● Un programme est constitué de
○ Structures de données
○ Et de méthodes qui manipulent ces structures
● Pour réutiliser une structure de données dans un autre projet
○ Il faut trouver la structure de données et la copier
○ Mais il faut aussi trouver les méthodes qui manipulent la structure de données et les copier
⇒ nécessite une structure claire du code
3
Solution partielle utilisée jusqu’à présent
● Faire preuve de discipline quand on programme
○ Regrouper les méthodes qui manipulent une structure de données dans la classe qui définit la structure de données
○ Éviter de manipuler directement une structure de données à partir de l’extérieur de la classe
● Solution partiellement satisfaisante car aucune aide fournie par le langage
● Méthode d’instance : aide à faire preuve de discipline
4
La méthode d’instance
● But : simplifier la définition des méthodes qui manipulent une structure de données
● Principe : associer des méthodes aux instances
○ Méthode d’instance = méthode sans mot clé static
○ Méthode qui manipule une structure de données
○ Associée à la classe dans laquelle la méthode est définie
○ Reçoit un paramètre caché nommé this du type de l’instance
⇒ pas besoin de spécifier explicitement ce paramètre
⇒ simplifie le code
5
Méthode d’instance vs de classe
Avec méthode d’instance Avec méthode de classe
class Monster { class Monster {
int health; int health;
void kill() { static void kill(Monster m) {
[Link] = 0; [Link] = 0;
} }
} }
Pas de static
⇒ paramètre Monster this implicitement ajouté
6
Méthode d’instance vs de classe
Avec méthode d’instance Avec méthode de classe
class Monster { class Monster {
int health; On dit que thisintest le receveur
health;
void kill() { de l’appel
static void kill(Monster m) {
[Link] = 0; [Link] = 0;
} }
} }
Pas de static
⇒ paramètre Monster this implicitement ajouté
7
Invocation d’une méthode d’instance
Le receveur d’un appel de méthode d’instance se met à gauche de la méthode d’instance, séparé par un point (.)
Monster aMonster = [Link](aPicture);
[Link]();
Un peu comme si on invoquait
[Link](aMonster);
receveur (i.e., this reçoit la valeur aMonster)
Méthode d’instance
appelée
8
Invocation d’une méthode d’instance
Le receveur d’un appel de méthode d’instance se met à gauche de la méthode d’instance, séparé par un point (.)
Monster aMonster = [Link](aPicture);
[Link]();
Remarque :
Un peu comme si on invoquait
[Link](aMonster);
On appelle le kill de Monster
receveur car la classe du receveur
(i.e., this reçoit la valeur aMonster)
(aMonster) est Monster
Méthode d’instance
appelée
9
Invocation d’une méthode d’instance
Le receveur d’un appel de méthode d’instance se met à gauche de la méthode d’instance, séparé par un point (.)
Monster aMonster = [Link](aPicture);
[Link]();
Remarque :
Un peu comme si on invoquait
[Link](aMonster);
On appelle le kill de Monster
receveur car la classe du receveur
(i.e., this reçoit la valeur aMonster)
(aMonster) est Monster
Méthode d’instance Remarque : si aMonster vaut null
appelée ⇒ erreur de type NullPointerException
10
Omission de this
class Monster { class Monster {
int health; int health;
void kill() { ⇔ void kill() {
[Link] = 0; health = 0;
} }
} }
En l’absence d’ambiguïté, this peut être omis
(health attribut de Monster
⇒ remplacé par [Link] à la compilation)
11
Omission de this
class Monster { class Monster {
int health; int health;
!
ntion void
Atte⇔
void kill() { kill() {
[Link] = 0; health = 0;
}
a
}
un r e c e v e u r
}
i e z p a s q u ’ il y}
N’oubl e s m é t h o d e s
s c a c h é p o u r l
t h i
En l’absence d’ambiguïté, this peut être omisstance
d’in
(health champ de Monster
⇒ remplacé par [Link] à la compilation)
12
En cas d’ambiguïté, utilisez this
Java utilise la portée lexicale : le compilateur cherche le symbole le plus proche en suivant les blocs de code
class Monster {
int health;
int x;
int y;
void move(int x, int y) { this.x = x; this.y = y; }
}
this est nécessaire pour lever l’ambiguïté entre
l’attribut x et l’argument x
13
Notions clés
● Avec static, la méthode s’appelle une méthode de classe
○ Voir le cours sur les méthodes de classe
○ N’accède uniquement qu’aux paramètres explicites, donnés en argument
static void kill(Monster monster)
● Sans static, la méthode s’appelle une méthode d’instance
○ Reçoit un paramètre caché nommé this du type de la classe
void kill()
⇔
static void kill(Monster this)
○ Invocation avec receveur à gauche : [Link]();
14
Notions clés
Attention !
Avec static , la méthode s’appelle une méthode de classe
• Marquée par le mot clé static
• Uniquement les paramètres explicites
e n t i el
static void kill(Monster monster)
a i s e s s
Ce cou rs est court, m
Sans static , la méthode s’appelle une méthode d’instance
• Reçoit un paramètre caché nommé this du type de la classe
o d e s d e c l a s s e void kill()
z pa s l es m é t h ⇔
Ne confonde s d ’i n s t a n ce ! static void kill(Monster this)
•
et les méthode
Invocation avec receveur à gauche : [Link]();
15