certification java

OCPJP 6 – Jour 7 – Les Variables

Une variable est un container mémoire contenant une série de bits. Pour les primitifs, cette série de bits représente la valeur numérique de la variable et pour les références, celle-ci représente simplement une adresse mémoire pointant vers l’objet référencé.

7.1 – Les types primitifs

7.1.1 – Déclaration et affectation

Lors de la déclaration d’une variable b1 de type byte par exemple, un espace mémoire de 8bits est réservé :

OCPJP_Variables_1

La variable b1 est ensuite initialisée et l’espace mémoire associé à cette variable reçoit la valeur 6 (soit 00000110) :

OCPJP_Variables_2

Une seconde variable b2 est créée :

OCPJP_Variables_3

Celle-ci reçoit la valeur de b1 :

OCPJP_Variables_4

La valeur de b1 est recopiée dans b2. Il n’y a donc aucun lien entre b1 et b2.

7.1.2 – Conversion par le compilateur

Le point important à retenir est qu’une constante littérale est toujours implicitement un entier de type int. Pourtant il est possible d’affecter une constante littérale à une variable de type byte par exemple :

En fait, le compilateur réalise une conversion implicite (cast) de la constante littérale en byte :

Le compilateur réalise automatiquement cette opération pour les types plus petits que le type int : byte, short, char (excepté le type boolean).

De même qu’une constante littérale est toujours de type int, le résultat d’une opération entre un type byte, short, char ou int sera aussi de type int.

Considérons le code suivant :

La dernière instruction ne compilera pas :

Même, si dans notre exemple, le résultat tient facilement dans une variable de type int, le compilateur ne peut le savoir et une conversion explicite est obligatoire :

Contrairement à l’opérateur « = », certains opérateurs (« += », « -= », « *= » et « /= »,) réalisent des conversions implicites :

Le code précédent est équivalent à :

7.1.3 – Conversion par affectation

Une conversion par affectation intervient lorsqu’une valeur d’un certain type est affectée à une variable d’un autre type. Seules les conversions sans perte d’information sont possibles ; les autres vont produire une erreur lors de la compilation. Une conversion sans perte d’information est une conversion d’un type vers un type supérieur :

Lors d’une perte d’information (conversion d’un type vers un type inférieur), une conversion explicite est nécessaire :

De même, une conversion d’un type flottant vers un type entier provoquera la même erreur. La conversion d’un type int vers un type double par exemple, entrainera une troncature et donc la perte de la partie décimale :

Une conversion explicite est donc nécessaire :

Cependant l’inverse, à savoir la conversion d’un type entier vers un type flottant, est possible sans conversion explicite :

Une variable de type entier ne peut recevoir une valeur flottante sans conversion explicite :

Le résultat sera évidemment tronqué :

Une constante littérale flottante est toujours implicitement une valeur de type double (64bits). Une constante littérale flottante ne peut donc contenir dans une variable de type flottante :

Il est nécessaire de convertir explicitement la constante littérale ou d’ajouter un f ou F à la fin de la constante :

Si une constante littérale est supérieure à la valeur maximale du type (et de même si celle-ci est inférieure à la valeur minimale du type), une conversion explicite est alors requise. Par exemple, les valeurs d’un byte sont comprises entre -128 et 127 :

Le code précédent peut être fixé de la façon suivante :

7.2 – Les références

Il est possible de créer des objets appartenant à une classe. Chaque objet est appelé instance de la classe.

Considérons le code suivant :

L’instruction suivante permet de déclarer une variable a correspondant à un objet de la classe Aircraft :

Mais lors de son exécution :

  • aucun objet (aucune instance) de la classe Aircraft n’est créé
  • l’espace mémoire nécessaire à stocker un objet de type Aircraft n’est même pas réservé.

Cependant, le code ci-dessus réserve un espace mémoire permettant de stocker une référence (une adresse mémoire). Cet espace n’est pas initialisé :

variable

Instancions maintenant l’objet a avec l’opérateur new :

Un espace mémoire est alloué permettant de stocker un objet de type Aircraft et le constructeur est appelé pour initialiser l’objet :

OCPJP_Variables_6

La référence (stockée dans l’espace mémoire réservé lors de la déclaration de la variable a) prend la valeur de l’adresse mémoire de l’objet créé avec l’opérateur new :

OCPJP_Variables_7

On dit que l’objet est référencé par la variable a.


Auteur
AuteurEdouard WATTECAMPS

0 réponses

Répondre

Se joindre à la discussion ?
Vous êtes libre de contribuer !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *