¿Qué es null
?
¿Es null
una instancia de algo?
¿A qué conjunto null
pertenece?
¿Cómo se representa en la memoria?
java
null
terminology
unj2
fuente
fuente
Respuestas:
No, no hay ningún tipo que
null
sea uninstanceof
.15.20.2 Operador de comparación de tipos
instanceof
Esto significa que para cualquier tipo
E
yR
, para cualquierE o
, dondeo == null
,o instanceof R
siempre esfalse
.JLS 4.1 Las clases de tipos y valores
Como dice la cita de JLS anterior, en la práctica simplemente puede pretender que es "simplemente un literal especial que puede ser de cualquier tipo de referencia".
En Java,
null == null
(este no es siempre el caso en otros idiomas). Tenga en cuenta también que, por contrato, también tiene esta propiedad especial (dejava.lang.Object
):También es el valor predeterminado (para las variables que los tienen) para todos los tipos de referencia:
JLS 4.12.5 Valores iniciales de variables
Cómo se usa esto varía. Puede usarlo para habilitar lo que se llama inicialización diferida de campos, donde un campo tendría su valor inicial de
null
hasta que realmente se usara, donde sea reemplazado por el valor "real" (que puede ser costoso de calcular).También hay otros usos. Tomemos un ejemplo real de
java.lang.System
:Este es un patrón de uso muy común:
null
se usa para denotar la inexistencia de un objeto.Aquí hay otro ejemplo de uso, esta vez de
java.io.BufferedReader
:Entonces, aquí,
readLine()
volveríainstanceof String
para cada línea, hasta que finalmente devuelva unnull
para significar el final. Esto le permite procesar cada línea de la siguiente manera:Se puede diseñar la API para que la condición de terminación no dependa de la
readLine()
devoluciónnull
, pero se puede ver que este diseño tiene el beneficio de hacer que las cosas sean concisas. Tenga en cuenta que no hay problema con las líneas vacías, porque hay una línea vacía"" != null
.Tomemos otro ejemplo, esta vez de
java.util.Map<K,V>
:Aquí comenzamos a ver cómo usar
null
puede complicar las cosas. La primera declaración dice que si la clave no está asignada,null
se devuelve. La segunda declaración dice que incluso si se asigna la clave,null
puede también ser devuelto.Por el contrario,
java.util.Hashtable
simplifica las cosas al no permitirnull
claves y valores; suV get(Object key)
, si los rendimientosnull
, sin ambigüedad significa que la clave no está asignada.Puede leer el resto de las API y encontrar dónde y cómo
null
se usa. Tenga en cuenta que no siempre son los mejores ejemplos de práctica .En términos generales,
null
se utilizan como un valor especial para significar:En Java Nada de tu incumbencia. Y es mejor mantenerlo así.
Es
null
algo buenoEsto ahora es límite subjetivo. Algunas personas dicen que eso
null
causa muchos errores de programador que podrían haberse evitado. Algunos dicen que en un lenguaje que atrapaNullPointerException
como Java, es bueno usarlo porque fallará rápidamente en los errores del programador. Algunas personas evitannull
mediante el uso de patrones de objetos nulos , etc.Este es un tema enorme en sí mismo, por lo que es mejor discutirlo como respuesta a otra pregunta.
Terminaré esto con una cita del inventor de
null
sí mismo, CAR Hoare (de fama rápida):El video de esta presentación es más profundo; Es un reloj recomendado.
fuente
NIL
) en 1960, y probablemente antes. Pero no creo que Hoare realmente esté tratando de reclamar la invención de referencias nulas en esa cita.No. Por eso
null instanceof X
regresaráfalse
para todas las clasesX
. (No se deje engañar por el hecho de que puede asignarnull
a una variable cuyo tipo es un tipo de objeto. Estrictamente hablando, la asignación implica una conversión de tipo implícita; ver más abajo).Es el único miembro del tipo nulo, donde el tipo nulo se define de la siguiente manera:
"También hay un tipo nulo especial, el tipo de la expresión nulo, que no tiene nombre. Debido a que el tipo nulo no tiene nombre, es imposible declarar una variable del tipo nulo o emitir al tipo nulo. El nulo referencia es el único valor posible de una expresión de tipo nulo. La referencia nula siempre se puede convertir a cualquier tipo de referencia. En la práctica, el programador puede ignorar el tipo nulo y simplemente pretender que nulo es simplemente un literal especial que puede ser de cualquier tipo tipo de referencia." JLS 4.1
Véase más arriba. En algunos contextos,
null
se usa para denotar "sin objeto" o "desconocido" o "no disponible", pero estos significados son específicos de la aplicación.Eso es específico de la implementación, y no podrá ver la representación de
null
un programa Java puro. (Peronull
se representa como una dirección / puntero de máquina cero en la mayoría, si no en todas las implementaciones de Java).fuente
¿Qué es nulo?
No es nada.
¿Es nulo una instancia de algo?
No, ya que no es nada. No puede ser una instancia de nada.
¿A qué conjunto pertenece nulo?
No hay ningún conjunto
¿Cómo se representa en la memoria?
Si algunos puntos de referencia son:
En la memoria del montón, se asigna algo de espacio al nuevo objeto creado. Y o apuntará a ese espacio asignado en la memoria.
Ahora
o=null;
Esto significa que ahora o no apuntará a ese espacio de memoria del objeto.
fuente
No, no es la instancia de nada, la instancia de siempre será falsa.
fuente
La palabra clave nula es un literal que representa una referencia nula, una que no hace referencia a ningún objeto . nulo es el valor predeterminado de las variables de tipo de referencia.
También quizás eche un vistazo a
nulo: glosario de Java
fuente
Nulo no es una instancia de ninguna clase.
Sin embargo, puede asignar nulo a variables de cualquier tipo (objeto o matriz):
fuente
Nulo en Java (tm)
En C y C ++, "NULL" es una constante definida en un archivo de encabezado, con un valor como:
o:
o:
dependiendo del compilador y las opciones del modelo de memoria. NULL no es, estrictamente hablando, parte de C / C ++ en sí.
En Java (tm), "nulo" no es una palabra clave, sino un literal especial del tipo nulo. Se puede convertir a cualquier tipo de referencia, pero no a ningún tipo primitivo como int o boolean. El literal nulo no necesariamente tiene valor cero. Y es imposible convertir al tipo nulo o declarar una variable de este tipo.
fuente
Representación de bytecode
Java
null
tiene soporte directo de JVM: se utilizan tres instrucciones para implementarlo:aconst_null
: por ejemplo, para establecer una variablenull
como enObject o = null;
ifnull
yifnonnull
: por ejemplo, para comparar un objetonull
como enif (o == null)
El Capítulo 6 "El conjunto de instrucciones de la máquina virtual Java" luego menciona los efectos de
null
otras instrucciones: arroja unNullPointerException
para muchos de ellos.2.4. "Tipos y valores de referencia" también menciona
null
en términos genéricos:fuente
null
es un valor especial, no es instancia de nada. Obviamente, no puede serinstanceof
nada.fuente
null
es un valor especial que no es una instancia de ninguna clase. Esto se ilustra con el siguiente programa:fuente
null
no es una instancia deString
.void f(String o)
, tendría más sentido.null en Java es como / similar a nullptr en C ++.
Programa en C ++:
Mismo programa en Java:
¿Entiendes ahora de los códigos anteriores qué es nulo en Java? Si no es así, le recomiendo que aprenda punteros en C / C ++ y luego lo comprenderá.
Tenga en cuenta que en C, a diferencia de C ++, nullptr no está definido, pero se usa NULL, que también se puede usar en C ++, pero en C ++ nullptr es más preferible que solo NULL, porque NULL en C siempre está relacionado con punteros y eso es así que, en C ++, el sufijo "ptr" se agregó al final de la palabra, y también todas las letras ahora están en minúsculas, pero esto es menos importante.
En Java, cada variable de tipo de clase no primitiva es siempre referencia a un objeto de ese tipo o heredado y nulo es referencia de objeto de clase nula, pero no puntero nulo, porque en Java no existe tal "puntero", sino referencias a clase en su lugar, se utilizan objetos, y nulo en Java está relacionado con referencias de objetos de clase, por lo que también puede llamarlo como "nullref" o "nullrefobj", pero esto es largo, así que llámelo "nulo".
En C ++ puede usar punteros y el valor nullptr para miembros / variables opcionales , es decir, miembro / variable que no tiene valor y si no tiene valor, entonces es igual a nullptr, entonces, ¿cómo puede usarse nulo en Java, por ejemplo?
fuente
Hay dos categorías principales de tipos en Java: primitivo y de referencia . Las variables declaradas de un tipo primitivo almacenan valores; Las variables declaradas de un tipo de referencia almacenan referencias.
En este caso, la declaración de inicialización declara una variable "x". "X" almacena la referencia de cadena. Es nulo aquí. En primer lugar, nulo no es una instancia de objeto válida, por lo que no hay memoria asignada para ello. Es simplemente un valor que indica que la referencia del objeto no se refiere actualmente a un objeto.
fuente
Una forma interesante de ver nulo en Java en mi opinión es verlo como algo que NO denota la ausencia de información, sino simplemente como un valor literal que se puede asignar a una referencia de cualquier tipo. Si lo piensa si denota la ausencia de información, entonces a1 == a2 es verdadero no tiene sentido (en caso de que a ambos se les haya asignado un valor nulo) ya que realmente podrían estar apuntando a CUALQUIER objeto (simplemente no sé a qué objetos deberían apuntar) ... Por cierto, null == null devuelve verdadero en java. Si Java, por ejemplo, fuera como SQL: 1999, entonces nulo == nulo devolvería desconocido (un valor booleano en SQL: 1999 puede tomar tres valores: verdadero, falso y desconocido, pero en la práctica desconocido se implementa como nulo en sistemas reales) ... http://en.wikipedia.org/wiki/SQL
fuente
Respuesta corta y precisa que responde a todas sus preguntas formalmente de JLS:
Solo se asigna una referencia de tipo que se asigna a nulo. No asigna ningún valor (objeto) a la referencia. Dicha asignación es específica para JVM cuánta referencia tomará y en qué área de memoria se asignará.
fuente