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’avezvous 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 ellemê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
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’avezvous 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 ellemê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
