¿Java tiene punteros?

Si Java no tiene punteros, ¿qué hace la new palabra clave en Java?

Como se señaló, Java tiene referencias. ¿Cómo son estos diferentes?

  1. no puede realizar operaciones aritméticas u otras operaciones similares en estos
  2. no apuntan a la memoria que contiene el objeto (es decir, no son punteros con otro nombre). La JVM tiene la libertad de mover objetos dentro de la memoria de VM, y lo más probable es que lo haga durante la recolección de basura. Sin embargo, las referencias aún apuntan a ese objeto, a pesar de su movimiento dentro de la memoria.

Entonces no son como referencias de C ++ (apuntando directamente a un objeto). Tal vez un mejor nombre sería manejar .

Java no tiene punteros; Java tiene referencias.

Es un buen punto, pero un puntero tiene operaciones adicionales que usted puede (o no) usar normalmente; una referencia carece de estas operaciones porque las operaciones pueden ser inseguras.

Por ejemplo, si usa un puntero para indexar el primer elemento de una matriz como esta:

 int squares[] = {1, 4, 9, 16, 25, 36, 49}; int* intPointer = squares; 

Es posible que desee desreferenciar el puntero y obtener el valor “1”, pero también puede:

 intPointer++ 

y después de hacer eso, cuando desreferencia el puntero obtendrás el valor “4”. Un segundo

 intPointer++; 

will, cuando se desreferencia, le dará el valor “9”. Esto se debe a que la operación ++ mueve el puntero una “unidad” adelante en la memoria.

El problema proviene de las debilidades en el sistema de verificación de tipo C / C ++ (C ++ debe mantener compatibilidad con C, por lo que permite los mismos problemas). El puntero almacena una dirección en la memoria y la operación ++ agrega la cantidad adecuada de bytes a la dirección. En muchos sistemas ++ ing un int agrega cuatro bytes, pero si el puntero era un puntero char ++ solo debería agregar un byte. Tenga en cuenta que dado que el tipo de datos subyacente de un puntero es una dirección en la memoria, lo siguiente es legal (pero no recomendado):

 char* charPointer = squares; charPointer++; void* voidPointer = squares; voidPointer++; 

Dado que los punteros son direcciones en la memoria, pueden representar (correctamente) cualquier bit de memoria en la computadora, pero solo se desreferencian correctamente cuando los datos subyacentes marcan el tipo y la alineación del puntero. Para los punteros que no son administrados por muchos códigos para que sean seguros, esto significa que puede desviarse del tipo de datos (o alineación) de la información deseada y una desreferencia puede terminar en un desastre. Intentar solucionar este problema con un código personalizado tiende a ralentizar un puntero lo suficiente como para que note problemas de rendimiento y abre las puertas para agregar errores en el código personalizado de “administración de punteros”.

El lado de Java pasa todos estos problemas al devolver una referencia. Una referencia no se refiere a ninguna ubicación en la memoria; Java mantiene una tabla interna de “referencia al puntero”. Esta tabla toma la referencia y devuelve los datos asociados a ella, dondequiera que esos datos puedan residir en la memoria. Esto ralentiza la ejecución del código, ya que se realizan dos búsquedas para cada “desreferencia”, una búsqueda en la tabla de referencia, una en la memoria de la máquina.

Una gran ventaja de las referencias a Java es que la memoria se puede mover sin romper las posibles direcciones del puntero. En un progtwig C, si mueve datos a una nueva ubicación de memoria, es muy difícil saber si alguna otra parte del progtwig tiene un puntero a los datos. Si se elimina la referencia de un puntero obsoleto después de que se mueve la memoria, el progtwig accederá a los datos corruptos y, por lo general, un fallo será deficiente.

La capacidad de mover la memoria en un progtwig en ejecución permite que los progtwigs reciclen fácilmente la memoria. Cualquier progtwig que no necesita trozos de memoria puede liberar la memoria no utilizada, pero esto crea agujeros de memoria de memoria no utilizada entre pedazos de memoria usada. Internamente, las computadoras usan páginas de memoria, que son bastante grandes. Si una página de memoria escasamente utilizada podría tener los pocos bits usados ​​movidos a otra página, entonces se puede liberar una página de memoria. Esto aumenta la densidad de los datos en la memoria, mejorando el rendimiento de la memoria caché. A veces esto se traduce en mejoras de rendimiento que pueden ser bastante dramáticas.

El Garbage Collector de Java aprovecha el uso de referencias al bloquear temporalmente el acceso a los datos para un conjunto de referencias. Durante ese locking de acceso, mueve los datos (para compactarlo). Después del locking, la referencia a la tabla de direcciones tiene las nuevas direcciones de memoria. Como la capa “funcional” del código nunca conoció las direcciones en primer lugar, esta operación no interrumpirá un progtwig Java en ejecución.

Java tiene punteros en el sentido de variables que almacenan referencias a datos en la memoria. Todas las variables de tipos de objetos en Java son punteros en este sentido.

Sin embargo, el lenguaje Java no permite operaciones aritméticas en los valores de punteros, como lo haría en un lenguaje como C.

new hace (más o menos) lo siguiente:

  1. Encuentre un bloque libre contiguo de memoria de stack igual al tamaño de instancia de la clase que está creando, más espacio para la contabilidad
  2. Zero dijo espacio y lo quitó de la lista libre
  3. Ejecuta el constructor
  4. Devuelve una referencia (NO un puntero, como han explicado otras publicaciones) a la instancia creada.

java.lang.NullPointerException

La gente me dijo “que Java no tiene indicaciones” en las entrevistas. Usualmente les di un código Java y les permití explicar lo que está sucediendo en este código:

 public class TestPointers { public static void main(String args[]) { Object p1, p2; p1 = new Object(); p2 = p1; p1 = null; System.out.println(p2); } } 

Java tiene referencias. Se accede a todos los objetos mediante referencias a sus instancias. Crea una nueva instancia usando new , que devuelve una referencia al objeto.

Las referencias de Java no son como punteros en C, no se puede “mirar debajo del capó” en la memoria bruta que compone el objeto.

Java no tiene punteros. El operador “nuevo” se usa para la variable de referencia en java.

new en Java devuelve una referencia al objeto recién creado.

nueva referencia de devoluciones. tiene algunas similitudes con los punteros (si pasas a la función, se pasa la referencia, al igual que con el puntero), pero no hay aritmética del puntero.

Java no admite ni permite punteros. (O más correctamente, Java no admite punteros a los que el progtwigdor pueda acceder y / o modificar). Java no puede permitir punteros, ya que esto permitiría que los subprogtwigs Java infrinjan el cortafuegos entre el entorno de ejecución Java y la computadora host. (Recuerde que a un puntero se le puede dar cualquier dirección en la memoria, incluso direcciones que podrían estar fuera del sistema de tiempo de ejecución de Java).

Java tiene punteros, que se conocen bajo el nombre de ” referencia “.

Cuando las personas dicen “Java no tiene punteros”, por lo general confunden el concepto de puntero con la implementación específica y las habilidades de los punteros que se encuentran en los idiomas derivados de C y C.

En particular:

  • Las referencias de Java no se pueden establecer en una dirección arbitraria . Ni tampoco (estándar) los indicadores Pascal ni Fortran.
  • Las referencias de Java no se pueden configurar para que apunten a una variable . Tampoco pueden los indicadores Pascal (estándar).
  • Las referencias de Java no admiten la aritmética del puntero . Ni Pascal ni Fortran apuntan
  • Las referencias de Java no pueden señalar partes de un objeto (como el tercer elemento de una matriz). Tampoco pueden los indicadores de Pascal.

Además, contrariamente a la creencia generalizada, un puntero no es necesariamente una dirección . Un puntero se implementa típicamente como una dirección, pero no hay ningún requisito para hacerlo, ni siquiera en C o C ++.

En java solo encontramos este puntero, se usa para referir las variables de la misma clase. El operador nuevo se usa como referencia para un objeto.