Les références peuvent être implémentées en stockant l'adresse. Habituellement, les références Java sont implémentées en tant que pointeurs, mais cela n'est pas requis par la spécification. Ils peuvent utiliser une couche supplémentaire d'indirection pour permettre un ramassage des ordures plus facile. Mais au final, cela se résumera (presque toujours) à des pointeurs (de style C) impliqués dans la mise en œuvre de références (de style Java).
Vous ne pouvez pas faire de l'arithmétique de pointeur avec des références. La différence la plus importante entre un pointeur en C et une référence en Java est qu’il est impossible d’obtenir (et de manipuler) la valeur sous-jacente d’une référence en Java. En d'autres termes: vous ne pouvez pas faire de l'arithmétique de pointeur.
En C, vous pouvez ajouter quelque chose à un pointeur (c'est-à-dire l'adresse) ou soustraire quelque chose pour pointer sur des choses "proches" ou sur des endroits situés à n'importe quel endroit.
En Java, une référence pointe vers une chose et cette chose seulement. Vous pouvez faire en sorte qu'une variable contienne une référence différente , mais vous ne pouvez pas lui demander simplement de désigner "la chose après la chose d'origine".
Les références sont fortement typées. Une autre différence est que le type d'une référence est beaucoup plus strictement contrôlé en Java que le type d'un pointeur est en C. En C, vous pouvez avoir un int*
et le convertir en un char*
et simplement réinterpréter la mémoire à cet emplacement. Cette réinterprétation ne fonctionne pas en Java: vous pouvez uniquement interpréter l’objet à l’autre extrémité de la référence comme quelque chose qu’il est déjà (c’est-à-dire que vous pouvez transformer une Object
référence en String
référence uniquement si l’objet pointé est réellement un String
).
Ces différences rendent les pointeurs C plus puissants, mais aussi plus dangereux. Ces deux possibilités (arithmétique de pointeur et réinterprétation des valeurs pointées) ajoutent de la flexibilité à C et sont à l'origine d'une partie de la puissance du langage. Mais ils constituent également une source importante de problèmes, car s'ils ne sont pas utilisés correctement, ils peuvent facilement briser les hypothèses selon lesquelles votre code est construit. Et c'est assez facile de les utiliser incorrectement.