Dans ce chapitre on va parler des références (addresses en mémoire) ainsi que du fonctionnement du .equals()
et du .toString()
Qu’est ce qu’une référence “null”
Plus tot, en particulier avec les tableaux, on pouvait se retrouver avec une valeur null
symolisant l’absence de valeur.
En réalité une valeur null symbolise plus précisément l’absence d’addresse (l’absence de référence). Et il est très important de toujours prendre en compte les cas dans le programme où une valeur nulle pourrait être retournée et la traiter en fonction.
== vs .equals()
Comme vu dans le chapitre sur les Strings le .equals()
n’est pas la même chose que l’opérateur booléen ==
sur les objets.
La raison est que ==
va comparer les références tandis que .equals()
va comparer les valeurs des propriétés.
Héritage et Object
Quand on crée une classe en Java, notre classe va automatiquement “hériter” tout un tas de méthodes et/ou propriétés d’une autre clase par défault dans Java appellée “Object”.
Nous allons donc avoir certaines méthodes par défault tel que .equals ou .toString. Mais il faut en général redéfinir ces derniers.
Redéfinition du .equals()
La raison pour laquelle il faut redéfinir le .equals est que par défault, il va avoir le même effet que ==
(comparer les références plus tot que les valeurs). Donc voici un exemple de redéfinition :
Ce code (sans les commentaires) a été automatiquement généré par Eclipse (en allant dans Source
puis Generate hashCode() and equals()
puis cocher les attributs et la case Use instanceof to compare types
)
Petite précision : Dans le code on utilise pas de
else
car quand unreturn
arrive, la suite du code n’est pas exécuté donc ce n’est pas nécessaire.
Deuxième précision : Dans Eclipse, on doit cocher la case pour instanceof sinon Eclipse va utiliser une méthode par défault appellée
.getClass()
et le comportement sera différent. Si une nouvelle classeMyColor
hérite (prends tous les attributs et méthodes) deColor
, avec instanceof on peut comparer des objets deColor
etMyColor
tandis qu’avecgetClass()
on ne pourra comparer que desMyColor
ensemble ou desColor
ensemble.
Redéfinition du .toString()
Le toString
est utilisé pour avoir une représentation textuelle de l’objet (qui doit être courte et informative).
Il y a aussi un outil dans Eclipse pour faire cela mais il est merdique et beaucoup plus compliqué que de l’écrire en code directement.
Résumé
Les références :
- Une référence
null
signifie une absence de valeur (une absence d’addresse en mémoire)
Equals et == :
==
compare les références et non les valeurs.equals()
sert à comparer les valeurs (propriétés), c’est ce qu’il faut utiliser pour comparer des objets.
L’héritage de Object :
- L’héritage signifie qu’une classe “hérite” de toutes les méthodes et attributs d’une autre
- Toutes les classes par défault dans Java héritent de la classe
Object
- Il faut donc redéfinir certaines méthodes par défault
Redéfinition de méthodes :
- On peut utiliser le mot clé
@Override
pour signifier que la méthode est une redéfinition d’une autre .equals()
doit être redéfini pour ne pas avoir le même comportement que==
.toString()
est utilisé pour avoir une courte représentation textuelle d’un objet et doit lui aussi être redéfini