Cours Java les types primitifs et types références, tutoriel & guide de travaux pratiques en pdf.
Introduction
En Java, pour declarer une variable, il faut donner son nom, précédé du type qu’on souhaite lui attribuer.
Ces types peuvent etre des types primitifs (int n;), ou bien correspondre a des classes (Date d1;). Les variables n et d1 en Java, ne sont pas de la meme sorte. La premiere contient une valeur elémentaire, tandis que la seconde contient une référence a un objet de type Date. Voila ce que nous allons étudier en détail dans ce chapitre, en commencant par les variables de type primitif et en expliquant ensuite ce qu’est une variable reférence.
Variables de type primitif
Les types primitifs sont : boolean, char, byte, short, int, long, float, double Pour représenter les valeurs de ces types, il faut un nombre fixe de bits : par exemple 8 bits pour les byte et 32 pour les int.
Lorsqu’on déclare une variable, on donne son type : Une variable déclarée de type primitif contient une valeur de type primitif. Ainsi, lors des déclarations suivantes :
Listing 11.1 – (pas de lien)
1 i n t n ;
2 c h a r c = ’ a ’ ;
3 n = 5 ;
4 d o u b l e d = 2 . 0 ;
Variables references et objets
Introduction
Que se passe t il lorsque nous créons 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 crée. Par ailleurs, new Date() crée une instance de la classe Date, un objet. Le point cl´e est le suivant : contrairement aux variables primitives du paragraphe precedent, d ne contient pas un objet , mais une référence ` 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 représentent une fac¸on d’accéder ` a l’objet. Elle ne contient pas l’objet lui meme, mais quelque chose qui permet de retrouver l’adresse o`u se situe l’objet en mémoire. C’est pourquoi nous disons que ces variables contiennent l’adresse de l’objet ou encore un pointeur sur l’objet. Nous appellerons ces variables des variables references.
Detail de la creation d’un objet
Nous pouvons maintenant détailler le processus qui est a l’oeuvre lors de l’exécution d’une déclaration de variable référence. Prenons l’exemple de Date d = new Date(). Ce processus se décompose en trois étapes :
1. Date d = new Date() : déclaration d’une variable référence.
De l’espace mémoire est alloué pour une variable référence de nom d. Cet espace mémoire est de taille fixe, suffisant pour contenir une adresse. La taille de l’espace mémoire réservé pour d ne dépend en rien de la taille qu’il faut pour stocker un objet Date, mais dépend de la taille qu’il faut pour stocker une adresse mémoire. A la suite de Personne p = new Personne(); par exemple, l’espace alloué a p serait strictement de meme taille que celui alloué `a d. A cette étape, p et d ne contiennent encore aucune adresse.
Manipuler les references
Une variable référence 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é, on ne peut lui donner qu’une valeur de meme type, c’est a dire une adresse vers un objet de meme type. Mais nous ne connaissons pas explicitement les adresses, donc les deux seules facons de donner une valeur a une variable référence sont d’utiliser new, comme nous venons de le voir, ou de lui affecter la valeur d’une autre variable référence de meme type.
Manipuler les objets references
Une variable référence contient une adresse, un moyen d’accéder a un objet, pas l’objet lui meme.
Mais comment accéder via la variable a cet objet et comment le modifier ? Nous le savons déja : par la notation pointée.
Si d1 est une variable qui référence une date, sa valeur est une adresse, mais d1. désigne l’objet date qu’elle référence. Nous pouvons ainsi lui appliquer toutes les méthodes des dates et accéder au variables d’instances jour, mois, année :
Listing 11.3 – (lien vers le code brut)
1 p u b l i c c l a s s Ch a p 1 2 a {
2 p u b l i c s t a t i c v o i d m a in ( S t r i n g [ ] a r g s ) {
3 D a t e d1 = new D a t e ( ) ;
4 d1 . a f f i c h e r D a t e ( ) ;
5 d1 . l e n d e m a i n ( ) ;
6 d1 . j o u r = d1 . 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 ” + d1 . a n n e e ) ;
8 }
9 }
Attention au partage des données
Nous avons vu que plusieurs variables peuvent référencer le meme objet. Lorsque c’est le cas, le meme objet est accessible (et donc modifiable) par l’intermédiaire de chacune des variables qui le référencent :
Listing 11.4 – (lien vers le code brut)
1 p u b l i c c l a s s Chap12b {
2 p u b l i c s t a t i c v o i d m a in ( S t r i n g [ ] a r g s ) {
3 D a t e d1 = new D a t e ( 1 , 6 , 1 9 9 8 ) ;
4 D a t e d3 = d1 ;
5 d1 . a f f i c h e r D a t e ( ) ;
6 d3 . a f f i c h e r D a t e ( ) ;
7 d3 . j o u r = 1 2 ;
8 d1 . a n n e e = 2 0 0 6 ;
9 d1 . a f f i c h e r D a t e ( ) ;
10 d3 . a f f i c h e r D a t e ( ) ;
11 }
12 }
Dans ce programme, d1 et d3 référencent le meme objet, que l’on modifie par l’intermédiaire de l’une et de l’autre. A chaque instant, la date pointée par d1 et d2 et la meme. C’est le meme objet qu’on modifie que ce soit par l’intermediaire de d1 ou de d2.
………