2011-11-14 14 views
5

en Java, no se puede afirmar tamaño de un array en su declaraciónDonde es "nulo" en la memoria

int[5] scores; //bad 

Me han dicho que esto es debido a que la JVM no asigna espacio en la memoria hasta que se inicializa un objeto. Si tiene una variable de matriz de instancia (inicializada automáticamente con un valor predeterminado de nulo), ¿esa variable apunta a un lugar en el montón que indique nulo?

+0

'0' ... como en .... NULL (nada, nada, zippo) –

+0

Enfrentaste a Harry Flugleman en un mal día. – tenfour

Respuesta

3

No, porque en la JVM no hay necesidad de eso. Si está en un idioma nativo (C y C++, por ejemplo), NULL es un puntero con valor cero y apunta a la dirección de la base de memoria. Obviamente, esa no es una dirección válida, pero "puede" eliminarla de todos modos, especialmente en un sistema sin memoria protegida, como el antiguo MS-DOS o pequeños para procesadores integrados. No es que sea una dirección válida, generalmente esa ubicación contiene vectores de interrupción y no debe tocarlos. Y, por supuesto, en cualquier sistema operativo moderno que genere una falla de protección.

Pero en la JVM una referencia a un objeto es más como un identificador (es decir, un índice en una tabla) y nulo es un valor 'imposible' (un índice que está fuera del dominio de la tabla), por lo que puede no se referencia y no ocupa espacio en dicha tabla.

+0

bien, entonces el valor nulo solo se mantiene en la variable en la pila, entonces? – Adam

+0

Sí. La JVM comprobará cuándo (y si) se desreferenciará y generará una excepción si es nula. –

+0

También eche un vistazo a esta pregunta relacionada, tiene una respuesta muy detallada: http://stackoverflow.com/questions/2707322/what-is-null-in-java –

1

No ... tendrás una referencia nula (0x00) en la variable del objeto.

3

Una referencia nula es literalmente un valor cero. El sistema operativo impide que cualquier programa acceda a la dirección cero en la memoria, por lo que la JVM comprobará proactivamente y se asegurará de que un valor de referencia no sea cero antes de permitirle acceder a él. Esto permite que la JVM le proporcione una agradable NullPointerException en lugar de un bloqueo "El programa ha realizado una operación ilegal".

Por lo que podría decir que la variable "apunta a" una ubicación de montón no válida. O simplemente podría decir que la variable no "apunta a" nada. En ese punto, solo se trata de semántica.

+1

NullPointerException. – EJP

+0

@EJP: debidamente anotado. – StriplingWarrior

+0

Es OS específico si 0 es una dirección de memoria válida. –

2

creo que este post va a responder a su pregunta - Java - Does null variable require space in memory

En Java, nula es sólo un valor que una referencia (que es básicamente un puntero restringido ) puede tener. Significa que la referencia se refiere a nada. En este caso, aún consume el espacio para la referencia. Esto es 4 bytes en sistemas de 32 bits u 8 bytes en sistemas de 64 bits. Sin embargo, no está consumiendo ningún espacio para la clase a la que apunta la referencia hasta que realmente asigne una instancia de esa clase para apuntar la referencia a.

Editar: En cuanto a la cadena, una cadena en Java toma 16 bits (2 bytes) para cada personaje, además de una pequeña cantidad de libro de mantenimiento de la cabeza, que probablemente es indocumentado y la aplicación específica.

(recuerde upvote la respuesta en el enlace si le ayuda a cabo)

0

Yo sostendría que "puntajes int [5]; // malo" no se debe a la asignación de memoria. Observe que cuando declara algo realmente está declarando Escriba ReferenceName = new Type() típicamente.

Observe los dos ejemplos int [] scores = new int [5]; JLabel label = new JLabel();

Los tipos (en el lado izquierdo) son int [] y JLabel, que no tienen nada que ver con la asignación de memoria (excepto un puntero), mientras que las nuevas instancias (en el lado derecho, que requieren asignación de memoria) int [5], que requiere espacio para 5 entradas, y JLabel(), que no requiere argumentos para llamar al constructor, pero sí memoria suficiente para un JLabel.

Cuestiones relacionadas