Cours les types primitifs et types références

Formation JAVA/J2EE, tutoriel & guide de travaux pratiques en pdf.

Variables references et objets

Introduction

Que se passe t il lorsque nous creons une variable dont le type est une classe ?
Date d = new Date() ;
(On suppose que Date est la classe definie dans le cours sur les classes et les objets). Une nouvelle variable, d est cree. Par ailleurs, new Date() cree une instance de la classe Date, un objet. Le point cle est le suivant : contrairement aux variables primitives du paragraphe precedent, d ne contient pas un objet , mais une ref´erence´ a` un objet. Si une variable primitive contient des bits qui representent la valeur qu’elle contient, une variable de type complexe contient des bits qui representent une fac¸on d’acceder a l’objet. Elle ne contient pas l’objet lui mˆeme, mais quelque chose qui permet de retrouver l’adresse ou` se situe l’objet en m´emoire. C’est pourquoi n ous disons que ces variables contiennent l’adresse de l’objet ou encore un pointeur sur l’objet. Nous appellerons ces variables des variables references.
Nous n’avons pas besoin de savoir comment la JVM impl´emente les r´ef´erences aux objets. C’est sans importance parce que nous ne pouvons les utiliser que pour acc´eder a` l’objet. Nous savons en revanche que pour une JVM donn´ee, toutes les r´ef´erences s ont de mˆeme taille quelque soit l’objet qui est referencé.

Detail de la creation d’un objet

Nous pouvons maintenant d´etailler le processus qui est a` d´eclaration de variable r´ef´erence. Prenons l’exemple d e Date se d´ecompose en trois etapes´ :
l ‘oeuvre lors de l’ex´ecution d’une d = new Date(). Ce processus
1. Date d = new Date() : d´eclaration d’une variable r´ef´erence.
De l’espace m´emoire est allou´e pour une variable r´ef´ere nce de nom d. Cet espace m´emoire est de taille fixe, suffisant pour contenir une adresse. La taille de l’espace m´emoire r´eserv´ pour d ne d´epend en rien de la taille qu’il faut pour stocker un objet Date, mais d´epend de la taille qu’il faut pour stocker une adresse m´emoire. A la suite de Personne p = new Personne() ; par exemple, l’espace allou´e a` p serait strictement de mˆeme taille que celui allou´e a` d. A cette etape,´ p et d ne contiennent encore aucune adresse.
2. Date d = new Date() : cr´eation d’un objet Date.
Appelons cet objet objet1. C’est l’op´erateur new qui s’occupe de r´eserver de l’espace m´emoire pour stocker un objet. Il d´etermine combien d’espace est n´ecessaire pour stocker cet objet et d´etermine l’adresse ou` sera stock´e cet objet. Imaginons , pour fixer les esprits, que cette adresse soit 0x321 :
objet1
0X321
3. Date d = new Date() : Liaison de l’objet a` la r´ef´erence. L’adresse ou r´eside l’objet en m´emoire, 0x321 pour notre exemple, est donn´ee comme valeur a` la variable ref´erence d :
0X321
Comme nous ne connaissons pas r´eellement l’adresse de l’objet, nous pr´ef´erons la repr´esenter graphi-quement par une fl`eche vers l’espace m´emoire contenant l’o bjet. Nous repr´esenterons les 2 sortes de variables de la fac

Manipuler les references

Une variable r´ef´erence contient une adresse vers un objet d’un certain type. Comme toute autre variable, on peut lui donner une valeur par affectation. Comme Java est typ´e, on ne peut lui donner qu’une valeur de mˆeme type, c’est a` dire une adresse vers un objet de mˆeme type. Mais nous ne connaissons pas explicitement les adresses, donc les deux seules fac¸ons de donner une valeur a` une variable r´ef´erence sont d’utiliser new, comme nous venons de le voir, ou de lui affecter la valeur d’une autre variable r´ef´erence de mˆeme type.
A la suite des 2 premi`eres instructions, nous avons 2 r´ef´ rences et 2 objets. En ligne 3, nous avons 3 r´ef´erences mais seulement 2 objets : d3, prend comme valeur celle de d2, donc l’adresse de l’objet2.
d2 et d3 r´ef´erencent le mˆeme objet. Ce sont deux fac¸ons diff´ere ntes d’acc´eder au mˆeme objet. En ligne 4, nous avons toujours 3 r´ef´erences et 2 objets : d2 prends maintenant l’adresse de l’objet1. d1 et d2 r´ef´erencent le mˆeme objet.

Manipuler les objets ref´erences

Une variable r´ef´erence contient une adresse, un moyen d’a cc´eder a` un objet, pas l’objet lui mˆeme.
Mais comment acc´eder via la variable a` cet objet et comment le modifier ? Nous le savons d´ej`a : par la notation point´ee.
Si d1 est une variable qui r´ef´erence une date, sa valeur est une a dresse, mais d1. d´esigne l’objet date qu’elle r´ef´erence. Nous pouvons ainsi lui appliquer toutes les m´ethodes des dates et acc´eder au variables d’instances jour, mois, annee :
Listing 11.3 – (lien vers le code brut)
1 p u b l i c c l a s s C h a p 1 2 a {
2 p u b l i c s t a t i c v o i d m a i n ( S t r i n g [ ] a r g s ) {
3 D a t e d 1 = new D a t e ( ) ;
4 d 1 . a f f i c h e r D a t e ( ) ;
5 d 1 . l e n d e m a i n ( ) ;
6 d 1 . j o u r = d 1 . j o u r + 1 ;
7 T e r m i n a l . e c r i r e S t r i n g l n ( ” Annee ” + d 1 . a n n e e ) ;
8 }
9 }

Cours gratuitTélécharger le cours complet

Télécharger aussi :

Laisser un commentaire

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