No, no lo es, y para aquellos que se preguntan por qué tal pregunta, hay lenguajes donde null es de hecho un objeto como cualquiera, por ejemplo Ruby.
JRL
7
En Scala, que es muy meticuloso con los tipos, hay un tipo Null(un rasgo , en realidad) que tiene una sola instancia null.
Carl Smotricz
1
@JRL: Solo por curiosidad, me pregunto cómo influye eso en cómo funciona JRuby ... (No estoy lo suficientemente familiarizado con ese nivel de implementación para saberlo con certeza).
Benjamin Oakes
Para agregar al comentario de @ JRL: el equivalente aproximado de Ruby a nulles nil, que es una instancia de NilClass
Eliot Sykes
O javascript, en el que null instanceof Objectes falso pero typeof(null)devuelve 'object'. ¿Es un objeto en ese caso? Quién sabe.
Don Hatch
Respuestas:
166
Si null fuera un Object, admitiría los métodos de java.lang.Objecttales como equals(). Sin embargo, este no es el caso: cualquier invocación de método en un nulo da como resultado un NullPointerException.
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 convertir al tipo nulo. La referencia nula 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 de referencia.
Creo que esto se puede reducir a "nulo es especial".
Entonces, un objeto en Java es solo un objeto si es igual o subclases java.lang.Object. Prácticamente, sí. No puedes crear una clase que no sea una subclase de java.lang.Object, pero nunca lo pensé desde un punto de vista más filosófico
Andreas Dolk
Curiosamente, de todas las cosas, el documento API paraNullPointerException hace mención de un » nullobjeto«… :) Pero entonces, también estaba bien hablar de »punteros nulos«…
Lumi
Dijiste: "La referencia nula siempre se puede convertir a cualquier tipo de referencia". Entonces, ¿podemos devolver null (typecast, si está permitido) en un método con un tipo de referencia de objeto (return)?
Srichakradhar
1
@Srichakradhar: ¡sí, podemos! Lo cual puede averiguar más fácilmente probándolo en código que preguntando aquí.
Michael Borgwardt
1
"La referencia nula es el único valor posible de una expresión de tipo nulo". Es hora de leer el documento de especificaciones. :)
sofs1
32
De acuerdo con la especificación de Java , nulles un tipo que se puede asignar a una variable de objeto (como un valor como se indica en el comentario). Sin embargo, no puede instanciar o crear variables de este tipo, debe usar el literal nullproporcionado por el compilador.
3) el objeto en " variable de objeto ", en comparación con la variable de clase, generalmente no se refiere al tipo sino a la vida útil. Cuando se hace referencia al tipo, generalmente se le llama variable de un tipo de referencia o, para abreviar, variable de referencia (tipo). Soy consciente de 4 tipos en la API de Java que exponen variables de instancia / objeto (puede haber más): matrices con sulength y las subclases de java.awt.geom.Point2D.
Pero el tipo nulo se puede asignar a todos los tipos de referencia.
Tom Hawtin - tackline
No hay "tipo nulo"; null es un valor específico de expresiones no primitivas (es decir, referencias; tampoco hay un "tipo de referencia" en Java, a mi entender).
Tommy McGuire
3
Tommy: JLS 4.1: "También hay un tipo nulo especial, el tipo de la expresión nulo, que no tiene nombre".
Como suele ocurrir, depende de dónde lo mires, en quién creas más.
Según la JLS, sí, lo es . Especialmente si reformula la pregunta como: "¿Es el nullliteral de tipo Object?". Además de JLS 4.1 citado anteriormente por Michael Borgwardt:
Los supertipos directos del tipo nulo son todos tipos de referencia distintos del tipo nulo en sí.
[Énfasis mío.]
Según el compilador de Eclipse 2019-09 no es :
true.toString();// Cannot invoke toString() on the primitive type booleannull.toString();// Cannot invoke toString() on the primitive type null
Según OpenJDKs 12.0.1 javaces :
true.toString();// error: boolean cannot be dereferencednull.toString();// error: <null> cannot be dereferenced
Donde los paréntesis angulares implican que nulles de un tipo distinto de primitivo. Y según JLS 4.1 :
Hay dos tipos de tipos en el lenguaje de programación Java: tipos primitivos (...) y tipos de referencia (...).
si no es el uno es el otro.
Claudiu escribió:
null es algo feo.
Au contraire, nulles hermoso. ¿Qué sugeriría como valor predeterminado para una variable de tipo de referencia? ¿Una combinación de bits arbitraria? ¡Bienvenido a la infracción de acceso o, peor aún, al infierno de punteros!
Joachim Sauer escribió:
null es un tipo y un valor.
En realidad, hay tres elementos junto con null (consulte también JLS 3.10.7 ):
El tipo nulo (de lo contrario sin nombre) .
El nullliteral .
El valor de referencia nulo . (Comúnmente abreviado como valor nulo o simplemente nulo ).
(1) Tenga en cuenta que, de acuerdo con JLS 4.10.2 citado anteriormente, el tipo nulo usa herencia múltiple no solo para interfaces sino también para clases. Lo que todos sabemos no es posible para nosotros, los programadores de aplicaciones.
(2) El literal nulo se podría imaginar como una variable definida como:
JVM_global final null_type null = new null_type();
A veces se asume, incorrectamente, que una variedad de secuencias de caracteres son palabras clave:
nullno es una palabra clave, sino el literal nulo ( §3.10.7 ).
Sobre null instanceof <any type>
Con JLS 4.10.2 en mente (“el tipo nulo es un subtipo de cada tipo”) null instanceof <any type>debería suponerse que debe evaluarse true, ¿no es así? A primera vista, sí, pero JLS 15.20.2 da la respuesta intuitiva :
[...] el resultado del instanceofoperador es truesi el valor de RelationalExpression no esnull [...]. De lo contrario, el resultado esfalse .
[Énfasis mío.]
Pregúntese qué tiene más sentido (desde el punto de vista de un programador de aplicaciones):
Dar falsey así indicar que una expresión de referencia no es de un tipo que se nos expone, es decir, indicar que no hace referencia a nada útil para nosotros.
o dando true, informándonos así que la expresión evalúa a una referencia especial, la referencia nula , haciendo referencia a un "objeto" no sabemos si existe y cuál es del tipo nulo especial que no tiene nombre, no está expuesto a nosotros, pero a través del literal nulo , ¿es un subtipo de algún tipo que incluya herencia múltiple y debe ignorarse de todos modos? Considere también el ejemplo más práctico:
classCarimplementsVehicle{...Vehicle car =null;...boolean b = car instanceofCar;// True? There's not even an instance...// which could be of type Car.
Lo que también conduce a:
¿Por qué instanceofno es una forma adecuada de decir algo sobre nullla objetividad de '?
Se llama instanceofno sameorsubtypeof. Eso significa que estamos comparando el tipo de una instancia con un tipo, no con dos tipos. Ahora nullsignifica: “No hay instancia” y si no hay instancia no hay tipo de instancia. Es obvio que se supone que no se debe comparar nada con algo false.
O en un ejemplo "más" del mundo real:
Tengo una imagen en tamaño real de una manzana ( = tipo de referencia ) en mis manos con »Big Apple« ( = nombre del tipo de referencia ) escrito en ella.
Hay una mesa ( = montón ) frente a mí.
Si hay una manzana ( = instancia ) en la mesa, hay un cable ( = referencia ) conectado a ella.
Sostengo el otro extremo de este cable en mi mano ( = variable de referencia ).
Trazo la manzana a lo largo del cordón y la comparo con mi imagen ( = instancia de ).
Si la manzana es del mismo tamaño o más grande que la imagen, se le aplica la escritura "Gran Manzana" ( = verdadero ).
Si es más pequeño, entonces no ( = falso ).
Si no hay una manzana sobre la mesa (= no hay instancia ) y, por lo tanto, no existe un cable ( = nulo ), la escritura tampoco se aplica ( = falso ). Porque: ¿ No es una manzana una gran manzana? No, no es.
Como se explica en el capítulo 4.1 Los tipos de tipos y valores de la especificación del lenguaje Java, null es un tipo que tiene un valor, la referencia nula (y está representado por el literal null):
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 del tipo nulo o convertir al tipo nulo. La referencia nula 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 nulles simplemente un literal especial que puede ser de cualquier tipo de referencia.
Sin embargo, es posible que desee leer sobre el patrón de objeto nulo (que no recomiendo). Consulte C2 Wiki o Wikipedia para obtener más información sobre este patrón.
También hay un literal nulo especial que se puede usar como valor para cualquier tipo de referencia. Se puede asignar nulo a cualquier variable, excepto a las variables de tipo primitivo. Hay poco que pueda hacer con un valor nulo más allá de probar su presencia. Por lo tanto, el valor nulo se usa a menudo en programas como marcador para indicar que algún objeto no está disponible.
Java maneja objetos a través de referencias. Null es un desglose de la OO de Java, ya que lo deja por debajo del nivel OO. No, no es un objeto, es un VALOR de una referencia. Y no tiene nada que ver con paradigmas de objetos, sino que se relaciona con la plomería de Java, que habilita objetos.
La primera línea muestra que nullse puede asignar a tipo Object, pero la segunda línea demostrará que ciertamente no es una Objecty eventualmente resulta en unajava.lang.NullPointerException
Null
(un rasgo , en realidad) que tiene una sola instancianull
.null
esnil
, que es una instancia de NilClassnull instanceof Object
es falso perotypeof(null)
devuelve'object'
. ¿Es un objeto en ese caso? Quién sabe.Respuestas:
Si null fuera un Object, admitiría los métodos de
java.lang.Object
tales comoequals()
. Sin embargo, este no es el caso: cualquier invocación de método en un nulo da como resultado unNullPointerException
.Y esto es lo que la Especificación del lenguaje Java tiene que decir sobre este tema:
Creo que esto se puede reducir a "nulo es especial".
fuente
java.lang.Object
. Prácticamente, sí. No puedes crear una clase que no sea una subclase de java.lang.Object, pero nunca lo pensé desde un punto de vista más filosóficoNullPointerException
hace mención de un »null
objeto«… :) Pero entonces, también estaba bien hablar de »punteros nulos«…De acuerdo con la especificación de Java ,
null
es un tipo que se puede asignar a una variable de objeto (como un valor como se indica en el comentario). Sin embargo, no puede instanciar o crear variables de este tipo, debe usar el literalnull
proporcionado por el compilador.fuente
null
nombre es una "instancia" delnull
tipo, aparentemente.null
no es una variable, es un literal: JLS, 3.10.7. The Null Literalnull
es un tipo que se puede asignar ": 1)null
(en el código) es el literal nulo , no el tipo nulo 2) Los tipos no se pueden asignar a variables en Java en general, consulte JLS 4.1: " Hay [... ] dos tipos de valores de datos que se pueden almacenar en variables [...]: valores primitivos (§4.2) y valores de referencia (§4.3). " Es la referencia nula que se puede asignar mediante elnull
literal. ... continúa ...length
y las subclases dejava.awt.geom.Point2D
.Absolutamente no:
null instanceof Object
devuelve falso.fuente
No, no es un objeto.
fuente
Nulo es la falta de un objeto.
fuente
JRL escribió:
Como suele ocurrir, depende de dónde lo mires, en quién creas más.
Según la JLS, sí, lo es . Especialmente si reformula la pregunta como: "¿Es el
null
literal de tipoObject
?". Además de JLS 4.1 citado anteriormente por Michael Borgwardt:Consulte JLS 3.10.7 :
y JLS 4.10 :
o JLS 4.10.2 :
[Énfasis mío.]
Según el compilador de Eclipse 2019-09 no es :
Según OpenJDKs 12.0.1
javac
es :Donde los paréntesis angulares implican que
null
es de un tipo distinto de primitivo. Y según JLS 4.1 :si no es el uno es el otro.
Claudiu escribió:
Au contraire,
null
es hermoso. ¿Qué sugeriría como valor predeterminado para una variable de tipo de referencia? ¿Una combinación de bits arbitraria? ¡Bienvenido a la infracción de acceso o, peor aún, al infierno de punteros!Joachim Sauer escribió:
En realidad, hay tres elementos junto con null (consulte también JLS 3.10.7 ):
null
literal .(1) Tenga en cuenta que, de acuerdo con JLS 4.10.2 citado anteriormente, el tipo nulo usa herencia múltiple no solo para interfaces sino también para clases. Lo que todos sabemos no es posible para nosotros, los programadores de aplicaciones.
(2) El literal nulo se podría imaginar como una variable definida como:
JVM_global final null_type null = new null_type();
Tenga en cuenta también JLS 3.9 :
Sobre
null instanceof <any type>
Con JLS 4.10.2 en mente (“el tipo nulo es un subtipo de cada tipo”)
null instanceof <any type>
debería suponerse que debe evaluarsetrue
, ¿no es así? A primera vista, sí, pero JLS 15.20.2 da la respuesta intuitiva :[Énfasis mío.]
Pregúntese qué tiene más sentido (desde el punto de vista de un programador de aplicaciones):
Dar
false
y así indicar que una expresión de referencia no es de un tipo que se nos expone, es decir, indicar que no hace referencia a nada útil para nosotros.o dando
true
, informándonos así que la expresión evalúa a una referencia especial, la referencia nula , haciendo referencia a un "objeto" no sabemos si existe y cuál es del tipo nulo especial que no tiene nombre, no está expuesto a nosotros, pero a través del literal nulo , ¿es un subtipo de algún tipo que incluya herencia múltiple y debe ignorarse de todos modos? Considere también el ejemplo más práctico:Lo que también conduce a:
¿Por qué
instanceof
no es una forma adecuada de decir algo sobrenull
la objetividad de '?Se llama
instanceof
nosameorsubtypeof
. Eso significa que estamos comparando el tipo de una instancia con un tipo, no con dos tipos. Ahoranull
significa: “No hay instancia” y si no hay instancia no hay tipo de instancia. Es obvio que se supone que no se debe comparar nada con algofalse
.O en un ejemplo "más" del mundo real:
Como resume Michael: "null es especial" de hecho.
fuente
No, no es una instancia de una Clase ni de una Clase. Es una referencia a nada.
Editar : no he leído las especificaciones, por lo que es posible que lo anterior no sea 100% exacto.
fuente
Como se explica en el capítulo 4.1 Los tipos de tipos y valores de la especificación del lenguaje Java, null es un tipo que tiene un valor, la referencia nula (y está representado por el literal
null
):Sin embargo, es posible que desee leer sobre el patrón de objeto nulo (que no recomiendo). Consulte C2 Wiki o Wikipedia para obtener más información sobre este patrón.
fuente
No. Incluso si lo fue, es inútil ya que no tiene métodos ni campos.
fuente
No, no es un objeto ya que la instancia nula de Object siempre devolverá falso, además, solo hay un nulo, no uno para cada clase.
fuente
null instanceof <anytype>
también regresaráfalse
.Según las especificaciones de Java ,
fuente
Java maneja objetos a través de referencias. Null es un desglose de la OO de Java, ya que lo deja por debajo del nivel OO. No, no es un objeto, es un VALOR de una referencia. Y no tiene nada que ver con paradigmas de objetos, sino que se relaciona con la plomería de Java, que habilita objetos.
fuente
Es nula una instancia de
java.lang.Object
? No.¿Es null un objeto ? depende de la definición de " es ".
fuente
La primera línea muestra que
null
se puede asignar a tipoObject
, pero la segunda línea demostrará que ciertamente no es unaObject
y eventualmente resulta en unajava.lang.NullPointerException
fuente
No,
null
no es un objeto, es un tipo de referencia y su valor no se refiere a ningún objeto por lo que no hay representación denull
en la memoria.fuente
Object
, no el objeto (como en el caso de un tipo ). Y si uno reformula la pregunta en consecuencia ...