Méthodes d'instance
Vous pouvez retrouver le jeu
ici.
Dans quel cas f est une méthode d'instance ?
- int f;
- int f();
- static int f();
- public int f;
int f();. int f; et public int f;
définissent des champs, alors que static int f(); définit
une méthode de classe (et non d'instance).
Dans quel cas f est un champ ?
- int f;
- final int f();
- int f();
- static int f();
int f;. Les autres expressions définissent des méthodes (non encore étudiée pour la
première, d'instance pour la seconde et de classe pour la troisième).
Qu'affiche ce programme ?
- Une erreur
- pv: 0
- pv: 42
- pv: null
pv: 42. Comme représenté sur la figure, le paramètre this
caché de f référence l'instance de Player référencée par la variable p
dans le cadre de main.
L'affectation pv = 42 dans main est réécrite
en this.pv = 42 puisque f ne définit pas de variable
locale pv. Cette affectation modifie donc la case mémoire this.pv,
qui est aussi celle désignée par perso.pv dans le cadre de main.
Qu'affiche ce programme ?
- Une erreur
- pv: 0
- pv: 42
- pv: 666
pv: 0. Comme représenté sur la figure, au moment de l'appel, l'argument this cachée
de f reçoit une référence vers le Player
référencé par p dans main,
et la variable locale pv de f
reçoit 666.
L'affectation pv = 42 concerne la variable pv du cadre de f
et non le champ pv de this car Java utilise la portée lexicale
pour trouver les symboles.
Au résultat, le champ pv de p n'est donc modifié par f.
Qu'affiche ce programme ?
- Une erreur
- pv: 0
- pv: 42
- pv: 666
pv: 42. Dans l'affectation this.pv = pv, le pv de droite vaut 42.
En effet, ce pv désigne la variable locale pv de f puisque Java utilise la
portée lexicale. Le this.pv de gauche désigne le champ pv
de this, qui est donc affecté à 42.
Comme this dans f et p dans main référencent le même objet,
p.pv vaut 42 après l'appel à f.