java pointers

¿Hay un concepto de "punteros" o "código inseguro" en Java?



pointers (7)

Ayer asistí a una charla de un CTO de una reputada compañía europea, y me dijo que hasta hace poco no sabía que Java tiene consejos. Al enfrentarlo, dijo que estaba absolutamente seguro de la existencia de punteros / código inseguro en Java.


Java no tiene punteros, solo referencias a objetos. Una referencia es similar a un puntero, porque apunta a una variable, un objeto, pero no puede ver o editar la memoria de direcciones de esta referencia, lo que puede hacer en C.

Otra cosa. En C, puede administrar punteros con la operación de referencia / desreferenciación, poniendo un * al principio del nombre del puntero. En Java, esta operación, referencia / desreferenciación, está completamente ausente, porque es totalmente automática, oculta para el usuario.

Otra información en Wikipedia y Oracle .


Java tiene punteros.

La confusión sobre si Java tiene punteros o no está fuertemente relacionada con la discusión sobre si Java es llamada por referencia o llamada por valor.

Las personas desinformadas piensan que Java no tiene punteros, y dado que un método puede cambiar un objeto que se transmite con los efectos de este cambio visible para la persona que llama, razonan que debe llamar por referencia.

Esto no es correcto, sin embargo.

Lo que sucede es que en Java los punteros se pasan por valor . No hay otros tipos de variables en Java para objetos que las variables de puntero y no hay llamadas por referencia.

La historia "insegura" es bastante diferente. Esto normalmente es distinto de la cuestión de si Java tiene punteros o no. Los indicadores de Java son seguros; apuntan a objetos y utilizan construcciones de lenguaje normal que no pueden manipularse para señalar ubicaciones de memoria arbitrarias.

Sin embargo, hay JNI, pero luego el código nativo hace cosas potencialmente inseguras, no el código de Java.

También hay Java en tiempo real (jsr-1), donde puede obtener acceso a ubicaciones de memoria específicas en su sistema. Sin embargo, esta es una versión muy específica y bastante rara de Java que se usa principalmente para propósitos integrados. Si esto fuera así, supongo que habría sido mencionado explícitamente.




Puede tener una ligera confusión con llamada por valor y llamada por referencia. Si proviene de C, puede pensar que la llamada por referencia es igual a un puntero. Solo una suposición.


Puntero es el concepto de señalar a la referencia. En C y C ++ puede acceder al puntero de forma explícita, pero en java utilizamos la referencia para señalar los objetos. Por ejemplo, si está pasando una instancia a un método, se pasa su referencia, pero finalmente se pasa el puntero. cuando cambia el estado de la instancia dentro del método, refleja cuándo se utiliza esa instancia después de completar la llamada al método.

Usamos referencia en java que es puntero con respecto a JVM.

Cuando usamos el nuevo operador, crea la instancia en el montón y devuelve la dirección a la referencia que señala.

Creo que esto responderá a tu pregunta si no puedes comentar mi respuesta.


Hay una clase llamada sun.misc.Unsafe , eso es cierto. Pero no utiliza punteros en el código Java (porque Java no tiene punteros, aunque estoy de acuerdo en que las referencias de Java son similares en concepto), la mayor parte se implementa con código nativo.

Como mencioné en los comentarios, esto no es parte de la API pública y no debe ser utilizado por el código del cliente. Sin embargo, puede verlo en funcionamiento cuando mira las fuentes de las clases Atomic* en el paquete java.util.concurrent.atomic .