2008-09-19 14 views

Respuesta

26

Java sí tiene punteros - punteros en los que no se puede realizar la aritmética del puntero.

Desde el venerable JLS:

Hay dos clases de tipos en el lenguaje de programación Java: tipos primitivos (§ 4.2) y los tipos de referencia (§ 4.3). Existen, en consecuencia, dos tipos de valores de datos que pueden almacenarse en variables, pasarse como argumentos, regresar por métodos y operar en: valores primitivos (§4.2) y valores de referencia (§4.3).

Y later:

Un objeto es una instancia de la clase o un array.

Los valores de referencia (a menudo apenas referencias) son punteros a estos objetos, y una referencia nula especial, que se refiere a ningún objeto.

(énfasis suyo)

Por lo tanto, para interpretar, si escribe:

Object myObj = new Object(); 

continuación myObj es un tipo referencia que contiene un valor referencia que es en sí mismo un puntero al recién creado Object.

Por lo tanto si se establece myObj a null está configurando el valor de referencia (también conocido como puntero ) a null. Por lo tanto, se lanza razonablemente una NullPointerException cuando se desreferencia la variable.

No se preocupe: este tema ha sido heartily debated antes.

1

Supongo que tiene que ver con el hecho de que la JVM está codificada en C++. Aparte de eso, los punteros y las referencias son casi similares. Se podría decir que el mecanismo de referencia en Java se implementa utilizando punteros C++ y el nombre 'NullPointerException' permite que los detalles de implementación brillen.

0

Esto se debe al hecho de que Java fue diseñado con programadores de C en mente. En C terminoligy se usa la palabra 'puntero' en lugar de 'referencia'

+0

Sí, pero Java utiliza la referencia: p – hhafez

3

En Java utilizan la nomenclatura REFERENCIA para referirse a objetos creados dinámicamente. En idiomas anteriores, se llama POINTER. Del mismo modo que la denominación de METHODS en lenguajes orientados a objetos ha tomado el relevo de FUNCTION y PROCEDURE anteriores en lenguajes anteriores (orientados a objetos y no orientados a objetos).No hay nada mejor o peor en esta denominación o nuevo estándar, es simplemente otra manera de nombrar el fenómeno de poder crear antiguos objetos dinámicos, colgando en el aire (espacio de pila) y siendo referido por una referencia de objeto fijo (o referencia dinámica también colgando en el aire). Los autores del nuevo estándar (uso de MÉTODOS y REFERENCIAS) mencionaron particularmente que los nuevos estándares se implementaron para hacerlo conforme a los próximos sistemas de planificación, como UML y UP, donde el uso de la terminología orientada a objetos prescribe el uso de ATRIBUTOS, MÉTODOS y REFERENCIAS, y no VARIABLES, FUNCIONES y PUNTEROS.

Ahora, usted puede pensar ahora, que era simplemente un cambio de nombre, pero eso sería simplificar la descripción del proceso y no ser solo por el largo camino que los idiomas han tomado en nombre del desarrollo. Un método es diferente en naturaleza de un procedimiento, ya que opera dentro del alcance de una clase, mientras que el procedimiento en su naturaleza opera en el ámbito global. De manera similar, un atributo no es solo un nuevo nombre para la variable, ya que el atributo es una propiedad de una clase (y su instancia, un objeto). De manera similar, la referencia, que es la pregunta detrás de esta pequeña escritura aquí, es diferente en cuanto a que está tipada, por lo tanto, no tiene la propiedad típica de punteros, ya que se trata de referencias crudas a celdas de memoria, por lo tanto, una referencia es una referencia estructurada objetos basados ​​en memoria.

Ahora, dentro de Java, es decir, en el estómago de Java, hay una capa de arbitraje entre el código C subyacente y el código Java (la Máquina Virtual). En esa capa de arbitraje, se produce una abstracción en el sentido de que la implementación subyacente (bare metal) de las referencias, tal como lo hace la máquina virtual, protege las referencias de referencias bare metal (celdas de memoria sin estructura). La verdad cruda es, por lo tanto, que la NullPointerException es realmente una excepción de puntero nulo, y no solo una excepción de referencia nula. Sin embargo, esa verdad puede ser completamente irrelevante para el programador en el entorno Java, ya que él/ella no estará en ningún momento en contacto con la JVM de metal puro.

1

Creo que la respuesta es que nunca sabremos realmente la respuesta real.

Sospecho que un tiempo antes de que se lanzara Java 1.0, alguien definió una clase llamada NullPointerException. O esa persona entendió mal el nombre, o la terminología no se había estabilizado; es decir, no se tomó la decisión de utilizar el término "referencia" en lugar de "puntero".

De cualquier manera, es probable que nadie haya notado que la incoherencia no se pudo solucionar sin romper la compatibilidad con versiones anteriores. Hay otras inconsistencias menores como esta si te ves muy duro. Y algunos problemas más serios que no pudieron solucionarse por la misma razón.

Pero esto es solo una conjetura.

+0

¿Por qué el voto negativo al azar? –

Cuestiones relacionadas