Un nouveau regard sur les objets
Lors du chapitre précédent, on a vu comment créer des objets et comment effectuer des opérations sur ces derniers grâce à leurs méthodes. On a par exemple utilisé des objets de type String
pour manipuler des chaines de caractères, des objets de type Date
pour manipuler des dates, des objets de type BigInteger
pour manipuler des entiers à précision arbitraire, ou encore des objets de type PrintStream
(System.out
) pour afficher des informations sur la sortie standard. Tous ces objets sont déjà définis dans la librairie standard Java. Dans ce chapitre, on va définir nos propres objets, mais on va d'abord devoir revoir en détails la notion d'objet.
Objet
Qu'est-ce-qu'un objet ? Rappelez-vous du GSM qu'on a utilisé pour introduire les objets. Il possède des attributs (niveau de charge de la batterie, couleur, poids...) dont les valeurs lui sont propres et constituent son état. De plus, il propose des fonctionnalités (effectuer un appel, envoyer un SMS, consulter le niveau de charge de la batterie...).
Attribut
Tous les objets d'un même type possèdent les mêmes attributs, mais chacun des objets possède une valeur pour ces attributs, valeurs n'étant pas forcément égales pour tous les objets. Par exemple, tous les GSM possèdent une marque, un numéro de modèle, une couleur..., mais il est évident que tous les GSM du monde ne sont pas verts. La figure 1 montre trois objets du même type, ainsi que leurs états.
Sur l'exemple, on voit donc trois objets de type GSM
avec la valeur des attributs marque
, numéro de modèle
et couleur
. Chacun des trois objets possède son propre état. On voit par exemple que les objets g1
et g3
ont la même valeur pour l'attribut couleur
, les autres valeurs étant différentes. Chaque objet possède donc une identité propre et un état.
Fonctionnalité
Les différentes fonctionnalités d'un objet permettent de définir son comportement. Tous les objets d'un même type possèdent les mêmes fonctionnalités. En effet, tous les GSM sont capables d'effectuer un appel, de recevoir un appel, d'envoyer un SMS...
Fonctionnalités et état sont intimement liés, puisqu'une fonctionnalité est utilisée sur un objet précis et va donc pouvoir interagir avec son état. Il pourra s'agir d'une consultation de l'état ou d'une mise à jour de ce dernier. Revenons-en à notre exemple; un GSM possède un certain niveau de charge de la batterie et il pourrait y avoir une fonctionnalité qui l'affiche. Lorsqu'on utilise cette fonctionnalité, elle va consulter l'état de l'objet pour connaitre le niveau de charge de sa batterie. La fonctionnalité « afficher le niveau de charge de la batterie » va donc utiliser la valeur de l'attribut « niveau de charge de la batterie ».
Classe d'objets
En Java, les objets sont définis par des classes, modèles à partir desquels on construit des objets. Revenons à nos GSMs, ils possèdent un écran, une batterie, un clavier, une antenne... Toutes ces caractéristiques sont reprises dans un plan. Ensuite, à partir du plan, on peut construire un GSM. Certains auront un grand écran, d'autres un plus petit, certains auront une antenne visible, d'autres une cachée... Depuis un même modèle, on peut donc créer différents objets comme l'illustre la figure 2.
Dans la classe, on définit les attributs et fonctionnalités qu'auront tous les objets créés à partir de cette classe. Les attributs sont représentés par des variables d'instances et les fonctionnalités par des méthodes.
Il faut distinguer plusieurs éléments : la classe, l'objet et la variable de type objet. Ces trois éléments sont illustrés sur la figure 3. On voit tout d'abord la classe tout à droite. Celle-ci définit des attributs et des fonctionnalités. À partir d'une classe, on peut créer un objet qui se trouve au milieu. L'objet possède des valeurs particulières pour les attributs, celles-ci constituant son état. Enfin, pour pouvoir utiliser l'objet, il faut garder une référence vers celui-ci dans une variable de type objet; celle-ci se trouve tout à gauche.
La flèche représente une référence. À partir d'une classe, on va pouvoir créer des objets, appelés instances de la classe. Cette relation est représentée par la flèche . Lorsqu'on crée un nouvel objet à partir d'une classe, on dit qu'on instancie la classe ou qu'on crée une instance de la classe; il s'agit d'une instanciation de classe.