¿Qué es nulo en Java?
Qué es null
?
¿ Es null
una instancia de algo?
¿A qué conjunto null
pertenece?
¿Cómo se representa en la memoria?
¿Es nulo una instancia de algo?
No, no existe ningún tipo que null
sea instanceof
.
15.20.2 Operador de comparación de tiposinstanceof
RelationalExpression: RelationalExpression instanceof ReferenceType
En tiempo de ejecución, el resultado del
instanceof
operador estrue
si el valor de RelationalExpression no lo esnull
y la referencia podría convertirse en ReferenceType sin generar un archivoClassCastException
. De lo contrario el resultado esfalse
.
Esto significa que para cualquier tipo E
y R
, para cualquier E o
, donde o == null
, o instanceof R
siempre es false
.
¿A qué conjunto pertenece 'nulo'?
JLS 4.1 Los tipos de tipos y valores
También hay un tipo nulo especial , el tipo de expresión
null
, que no tiene nombre. Debido a que el tipo nulo no tiene nombre, es imposible declarar una variable de tipo nulo o convertirla al tipo nulo . Lanull
referencia es el único valor posible de una expresión de tipo nulo . Lanull
referencia siempre se puede convertir a cualquier tipo de referencia. En la práctica, el programador puede ignorar el tipo nulo y simplemente pretender quenull
es simplemente un literal especial que puede ser de cualquier tipo de referencia.
¿Qué es nulo?
Como dice la cita anterior de JLS, en la práctica simplemente puedes 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 lenguajes). Tenga en cuenta también que por contrato, también tiene esta propiedad especial (de java.lang.Object
):
public boolean equals(Object obj)
Para cualquier
null
valor no referencialx
,x.equals(null)
deberíareturn false
.
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
- Cada variable de clase, variable de instancia o componente de matriz se inicializa con un valor predeterminado cuando se crea:
- Para todos los tipos de referencia, el valor predeterminado es
null
.
La forma en que se usa 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 use, donde se reemplaza por el valor "real" (que puede ser costoso de calcular).
También hay otros usos. Tomemos un ejemplo real de java.lang.System
:
public static Console console()
Devuelve : La consola del sistema, si la hay, en caso contrario
null
.
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
:
public String readLine() throws IOException
Devuelve : A
String
que contiene el contenido de la línea, sin incluir ningún carácter de terminación de línea, onull
si se ha llegado al final de la secuencia.
Entonces aquí, readLine()
regresaría instanceof String
para cada línea, hasta que finalmente devuelva a null
para indicar el final. Esto le permite procesar cada línea de la siguiente manera:
String line;
while ((line = reader.readLine()) != null) {
process(line);
}
Se puede diseñar la API para que la condición de terminación no dependa del readLine()
return null
, pero se puede ver que este diseño tiene la ventaja de hacer las cosas concisas. Tenga en cuenta que no hay ningún problema con las líneas vacías, porque una línea vacía "" != null
.
Tomemos otro ejemplo, esta vez de java.util.Map<K,V>
:
V get(Object key)
Devuelve el valor al que está asignada la clave especificada, o
null
si esta asignación no contiene ninguna asignación para la clave.Si este mapa permite
null
valores, entonces un valor de retorno denull
no necesariamente indica que el mapa no contiene ningún mapeo para la clave; También es posible que el mapa asigne explícitamente la clave anull
. LacontainsKey
operación puede utilizarse para distinguir estos dos casos.
Aquí empezamos a ver cómo el uso 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 la clave está asignada, tambiénnull
se puede devolver.
Por el contrario, java.util.Hashtable
simplifica las cosas al no permitir null
claves ni valores; V get(Object key)
Si devuelve , null
significa inequívocamente que la clave no está asignada.
Puede leer el resto de las API y encontrar dónde y cómo null
se utilizan. Tenga en cuenta que no siempre son los ejemplos de mejores prácticas .
En términos generales, null
se utilizan como valor especial para significar:
- Estado no inicializado
- Condición de terminación
- Objeto inexistente
- Un valor desconocido
¿Cómo se representa en la memoria?
¿En Java? Nada de tu incumbencia. Y es mejor mantenerlo así.
¿ Es null
algo bueno?
Esto ahora es casi subjetivo. Algunas personas dicen que eso null
causa muchos errores de programador que podrían haberse evitado. Algunos dicen que en un lenguaje que funciona NullPointerException
como Java, es bueno usarlo porque fallará rápidamente en los errores del programador. Algunas personas lo evitan null
utilizando el patrón de objeto nulo , 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 de su inventor null
, CAR Hoare (de fama rápida):
Yo lo llamo mi error de mil millones de dólares. Fue la invención de la
null
referencia en 1965. En ese momento, estaba diseñando el primer sistema de tipos completo para referencias en un lenguaje orientado a objetos (ALGOL W). Mi objetivo era garantizar que todo uso de referencias fuera absolutamente seguro, y que el compilador realizara la verificación automáticamente. Pero no pude resistir la tentación de incluir unanull
referencia, simplemente porque era muy fácil de implementar. Esto ha dado lugar a innumerables errores, vulnerabilidades y caídas del sistema, que probablemente han causado mil millones de dólares en dolores y daños en los últimos cuarenta años.
El vídeo de esta presentación va más allá; Es un reloj recomendado.
¿Es nulo una instancia de algo?
No. Por eso null instanceof X
regresará false
para todas las clases X
. (No se deje engañar por el hecho de que puede asignar null
una variable cuyo tipo sea un tipo de objeto. Estrictamente hablando, la asignación implica una conversión de tipo implícita; consulte a continuación).
¿A qué conjunto pertenece 'nulo'?
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 convertirla al tipo nulo. El tipo nulo La 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
¿Qué es nulo?
Véase más arriba. En algunos contextos, null
se utiliza para indicar "ningún objeto", "desconocido" o "no disponible", pero estos significados son específicos de la aplicación.
¿Cómo se representa en la memoria?
Esto es específico de la implementación y no podrá ver la representación null
en un programa Java puro. (Pero null
se representa como una dirección/puntero de máquina cero en la mayoría, si no en todas, las implementaciones de Java).
No, no es la instancia de nada, la instancia de siempre será falsa.
Nulo en Java (tm)
En C y C++, "NULL" es una constante definida en un archivo de encabezado, con un valor como:
0
o:
0L
o:
((void*)0)
dependiendo de las opciones del compilador y del modelo de memoria. NULL no es, estrictamente hablando, parte del propio C/C++.
En Java(tm), "nulo" no es una palabra clave, sino un literal especial de 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.