Programme libere 
Var 
pEntier :pointeur sur entier 
Début 
pEntier←nouveau Entier 
/* suite du programme */ 
... 
libérer pEntier 
pEntier←NIL 
Fin
4. Java et les références 
a. Différences entre le C et Java 
Le  langage  C  est  le  roi  des  pointeurs.  À  force  d’en  parler,  on  en  oublierait  presque  Java.  Du  fait  de  la  machine 
virtuelle, Java ne connaît pas les pointeurs au sens propre. Pourtant, n’avez­vous pas rencontré quelque chose y 
ressemblant dans le chapitre Les tableaux et structures sur les tableaux ? En effet ! Si on affecte un tableau à un 
autre, les deux variables résultantes représentent le même tableau ! Une variable référence l’autre. Ça ressemble un 
peu aux pointeurs. Cependant il existe des différences essentielles : 
q Le  C/C++  autorise  les  pointeurs  sur  n’importe  quel  type  tant  primitif  (int,  long,  float,  etc)  que  complexe 
(structures, tableaux, objets pour le C++). Java n’autorise les références que sur les variables désignant des 
objets. Les objets sont abordés au chapitre suivant, mais en Java les tableaux et structures tels que vus 
jusqu’à présent sont en fait des objets. 
q Un  pointeur  contient  l’adresse  réelle  en  mémoire  d’une  variable,  une  référence  Java,  appelée  handle 
(poignée) en anglais, ne contient qu’une  information  "virtuelle"  permettant  d’accéder à l’objet  (contenu  du 
tableau, enregistrement, etc) et fournie par la machine virtuelle. 
q Les manipulations de pointeurs peuvent vite devenir très complexes en C/C++ : risque de dépassement des 
adresses,  allocations  mémoires  compliquées,  risque  de  confondre  les  types,  etc.  Aucun  risque  en  Java  :  la 
machine virtuelle s’occupe presque de tout. 
q Les opérateurs "&" permettant d’accéder à l’adresse d’une variable et "*" pour accéder au contenu présent à 
l’adresse pointée n’existent pas en Java. Le seul opérateur présent en Java est le point, que vous avez déjà 
rencontré avec les enregistrements. 
Ne croyez pas que l’absence des pointeurs en Java soit une limitation, c’est même tout le contraire. Tout d’abord Java 
est un langage évolué de haut niveau dont le rôle n’est pas la manipulation bas niveau d’adresses physiques. De ce 
fait  le  programmeur,  vous,  est  entièrement  débarrassé  de  toute  la  gestion  de  ces  adresses  puisque  la  machine 
virtuelle s’occupe de tout. C’est une sorte de C++ débarrassé de toute sa complexité. Le développement en Java est 
donc très simplifié en se concentrant sur les fonctionnalités. 
b. Les références sur les objets 
En Java, toute variable dont le contenu est déclaré avec l’instruction "new" est une référence sur le type de variable 
associé. Par exemple quand vous déclarez un tableau : 
int tab[]; 
tab=new int[10];
La variable tab est une référence vers un tableau d’entiers. Donc si vous déclarez une variable du même type et que 
vous lui affectez tab, cette nouvelle variable sera elle­même une référence du tableau référencé par tab. 
Du  coup,  toutes  ces  variables  sont  des  références,  ce  qui  veut  dire  que  quand  vous  affectez  un  tableau,  une 
structure ou un objet à une autre variable, vous ne créez pas une copie mais ajoutez une référence dessus. Tous ces 
types sont des objets. Et toute variable qui reçoit un objet n’en reçoit pas une copie mais référence cet objet. Ce 
phénomène a été mis en évidence dans le chapitre Les tableaux et structures avec l’affectation d’un tableau à un 
autre : les deux variables référencent le même tableau. Le principe va plus loin car puisqu’une variable ainsi affectée 
est  une  référence,  ça  veut  dire  que  si  vous  passez  un  objet  (tableau,  structure,  objet,  etc.)  en  paramètre  d’une 
fonction, vous passez la référence sur cet objet et non le contenu associé. Regardez l’exemple suivant : 
class chap8_ref1 { 
- 8 -
© ENI Editions - All rigths reserved - Jonifar lina
170
Précédent

- 170/220

Suivant