Existe-t-il un concept de «pointeurs» ou de «code non sécurisé» en Java?

Hier, j’assistais à une conférence d’un directeur technique d’une entreprise européenne réputée et il m’a dit jusqu’à récemment qu’il ne savait pas que Java avait des indications. En le confrontant, il a dit qu’il était absolument certain de l’existence de pointeurs / de codes dangereux dans Java.

Il y a une classe appelée sun.misc.Unsafe , c’est vrai. Mais il n’utilise pas de pointeurs dans le code Java (car Java n’a pas de pointeurs, bien que je sois d’accord sur le fait que les références Java sont similaires dans leur concept), la plupart sont implémentées à l’aide de code natif.

Comme je l’ai mentionné dans les commentaires, cela ne fait pas partie de l’API publique et ne devrait pas être utilisé par le code client. Cependant, vous pouvez le voir à l’œuvre lorsque vous consultez les sources des classes Atomic* du package java.util.concurrent.atomic .

Il n’y a pas de pointeur en Java, seulement des références sûres. Malheureusement, votre CTO très réputé avait tort.

Le code non sécurisé est intégré via JNI.

http://en.wikipedia.org/wiki/Java_Native_Interface

Java a des pointeurs.

La confusion entre Java et les pointeurs est fortement liée à la question de savoir si Java est appel par référence ou appel par valeur.

Les personnes non informées pensent que Java n’a pas de pointeur et, comme une méthode peut changer un object transmis avec les effets de ce changement visible pour l’appelant, il considère que c’est un appel par référence.

Ce n’est pas correct cependant.

En réalité, les pointeurs Java sont passés par valeur . Il n’y a pas d’autres types de variables en Java pour les objects que les variables de pointeur et il n’y a pas d’appel par référence.

L’histoire “peu sûre” est tout autre chose. Ceci est normalement différent de la question de savoir si Java a des pointeurs ou non. Les pointeurs de Java sont sûrs. ils pointent sur des objects et en utilisant les constructions de langage normales, ils ne peuvent pas être manipulés pour pointer vers des emplacements de mémoire arbitraires.

Il existe cependant JNI, mais le code natif fait des choses potentiellement dangereuses, pas le code Java.

Il existe également Java en temps réel (jsr-1), où vous pouvez absolument avoir access à des emplacements de mémoire spécifiques de votre système. Il s’agit toutefois d’une version très spécifique et plutôt rare de Java qui est principalement utilisée à des fins incorporées. Si cela voulait dire je suppose que cela aurait été explicitement mentionné.

Java n’a pas de pointeur, mais uniquement des références à des objects. Une référence est similaire à un pointeur, car elle pointe vers une variable, un object, mais vous ne pouvez pas afficher ou modifier la mémoire d’adresse de cette référence, ce que vous pouvez faire en C.

Autre chose. En C, vous pouvez gérer les pointeurs avec l’opération de référencement / déréférencement, en mettant un * en premier du nom du pointeur. En Java, cette opération de référencement / déréférencement est totalement absente, car totalement automatique, elle est cachée pour l’utilisateur.

Autres informations sur Wikipedia et Oracle .

Le pointeur est le concept de désigner la référence. En C et C ++, vous pouvez accéder explicitement au pointeur, mais en Java, nous utilisons référence pour pointer les objects. Par exemple, si vous transmettez une instance à une méthode, nous soaps que sa référence est transmise mais que le pointeur est finalement transmis. lorsque vous modifiez l’état de l’instance dans la méthode, cela est reflété lorsque cette instance est utilisée après la fin de l’appel de la méthode.

Nous utilisons une référence en Java qui est un pointeur par rapport à JVM.

Lorsque nous utilisons new opérateur, il crée l’instance dans le tas et renvoie l’adresse à la référence par son pointeur.

Je pense que cela répondrait à votre question si vous ne pouviez pas commenter ma réponse.

Vous pouvez appeler des fonctions natives en Java ( JNI ), vous pouvez donc utiliser des pointeurs. Mais à part cela – non, il n’y a pas d’indicateurs en Java.

Il peut avoir une légère confusion entre appel par valeur et appel par référence. S’il vient de C, il peut penser que l’appel par référence est égal à un pointeur. Juste une supposition.