¿Qué es null
?
¿Es null
una instancia de algo?
¿A qué conjunto null
pertenece?
¿Cómo se representa en la memoria?
¿Qué es null
?
¿Es null
una instancia de algo?
¿A qué conjunto null
pertenece?
¿Cómo se representa en la memoria?
Respuestas:
¿Es nulo una instancia de algo?
No, no hay ningún tipo que null
sea un instanceof
.
instanceof
RelationalExpression: RelationalExpression instanceof ReferenceType
En tiempo de ejecución, el resultado del
instanceof
operador estrue
si el valor de RelationalExpression no esnull
y la referencia podría convertirse al ReferenceType sin generar aClassCastException
. 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'?
También hay un tipo nulo especial , el tipo de expresión
null
, que no tiene nombre. Como el tipo nulo no tiene nombre, es imposible declarar una variable del tipo nulo o convertir 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 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 (de java.lang.Object
):
public boolean equals(Object obj)
Para cualquier
null
valor que no sea de referenciax
,x.equals(null)
deberíareturn false
.
También es el valor predeterminado (para las variables que los tienen) para todos los tipos de referencia:
- 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
.
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
:
public static Console console()
Devoluciones : la consola del sistema, si existe, de lo 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 que
String
contiene el contenido de la línea, sin incluir ningún carácter de terminación de línea, onull
si se ha alcanzado el final de la secuencia.
Entonces, aquí, readLine()
volvería instanceof String
para cada línea, hasta que finalmente devuelva un null
para significar 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 de la readLine()
devolución null
, 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>
:
V get(Object key)
Devuelve el valor al que se asigna la clave especificada, o
null
si este mapa 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 asignación para la clave; También es posible que el mapa asigne explícitamente la clavenull
. LacontainsKey
operación puede usarse para distinguir estos dos casos.
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 permitir null
claves y valores; su V get(Object key)
, si los rendimientos null
, 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:
¿Cómo se representa en la memoria?
En Java Nada de tu incumbencia. Y es mejor mantenerlo así.
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 atrapa NullPointerException
como Java, es bueno usarlo porque fallará rápidamente en los errores del programador. Algunas personas evitan null
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):
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 asegurar que todo uso de referencias debería ser absolutamente seguro, con una verificación realizada automáticamente por el compilador. Pero no pude resistir la tentación de poner unanull
referencia, simplemente porque era muy fácil de implementar. Esto ha llevado a innumerables errores, vulnerabilidades y fallas en el sistema, lo que probablemente ha causado miles de millones de dólares de dolor y daños en los últimos cuarenta años.
El video de esta presentación es más profundo; Es un reloj recomendado.
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.
¿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
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).
¿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 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
¿Qué es nulo?
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.
¿Cómo se representa en la memoria?
Eso es específico de la implementación, y no podrá ver la representación de null
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).
¿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:
Object o=new Object();
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.
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 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 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.
Representación de bytecode
Java null
tiene soporte directo de JVM: se utilizan tres instrucciones para implementarlo:
aconst_null
: por ejemplo, para establecer una variable null
como enObject o = null;
ifnull
y ifnonnull
: por ejemplo, para comparar un objeto null
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:
Un valor de referencia también puede ser la referencia nula especial, una referencia a ningún objeto, que se indicará aquí por nulo. La referencia nula inicialmente no tiene ningún tipo de tiempo de ejecución, pero se puede convertir a cualquier tipo. El valor predeterminado de un tipo de referencia es nulo.
null
es un valor especial, no es instancia de nada. Obviamente, no puede ser instanceof
nada.
null
es un valor especial que no es una instancia de ninguna clase. Esto se ilustra con el siguiente programa:
public class X {
void f(Object o)
{
System.out.println(o instanceof String); // Output is "false"
}
public static void main(String[] args) {
new X().f(null);
}
}
null
no es una instancia de String
.
void f(String o)
, tendría más sentido.
null en Java es como / similar a nullptr en C ++.
Programa en C ++:
class Point
{
private:
int x;
int y;
public:
Point(int ix, int iy)
{
x = ix;
y = iy;
}
void print() { std::cout << '(' << x << ',' << y << ')'; }
};
int main()
{
Point* p = new Point(3,5);
if (p != nullptr)
{
p->print();
p = nullptr;
}
else
{
std::cout << "p is null" << std::endl;
}
return 0;
}
Mismo programa en Java:
public class Point {
private int x;
private int y;
public Point(int ix, int iy) {
x = ix;
y = iy;
}
public void print() { System.out.print("(" + x + "," + y + ")"); }
}
class Program
{
public static void main(String[] args) {
Point p = new Point(3,5);
if (p != null)
{
p.print();
p = null;
}
else
{
System.out.println("p is null");
}
}
}
¿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?
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.
String x = null;
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.
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
Respuesta corta y precisa que responde a todas sus preguntas formalmente de JLS:
3.10.7. El literal nulo
El tipo nulo tiene un valor, la referencia nula, representada por el nulo literal nulo, que se forma a partir de caracteres ASCII.
Un literal nulo siempre es del tipo nulo.
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á.