¿Es nulo un objeto?

119

¿Es nulo Objecten Java?

usuario registrado
fuente
41
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.

Y esto es lo que la Especificación del lenguaje Java tiene que decir sobre este tema:

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".

Michael Borgwardt
fuente
1
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.

Dana la cuerda
fuente
8
null es un tipo y un valor.
Joachim Sauer
5
El nullnombre es una "instancia" del nulltipo, aparentemente.
extraño
nullno es una variable, es un literal: JLS, 3.10.7. The Null Literal
Gerold Broser
Re " nulles 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 el nullliteral. ... continúa ...
Gerold Broser
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.
Gerold Broser
28

Absolutamente no: null instanceof Objectdevuelve falso.

Darin Dimitrov
fuente
17
Y, sin embargo, la asignación es compatible con todos los tipos de referencia.
Chris Vest
12

No, no es un objeto.

Erich Kitzmueller
fuente
12

Nulo es la falta de un objeto.

Tommy Carlier
fuente
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".
Ken
12

JRL escribió:

No, no es, ...

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:

Consulte JLS 3.10.7 :

Un literal nulo es siempre de tipo nulo.

y JLS 4.10 :

Los subtipos de un tipo T son todos tipos U, de manera que T es un supertipo de U y el tipo nulo.

o JLS 4.10.2 :

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 boolean
null.toString();  // Cannot invoke toString() on the primitive type null

Según OpenJDKs 12.0.1 javac es :

true.toString();  // error: boolean cannot be dereferenced
null.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 ):

  1. El tipo nulo (de lo contrario sin nombre) .
  2. El null literal .
  3. 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();

Tenga en cuenta también JLS 3.9 :

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:

     class Car implements Vehicle {  
     ...
     Vehicle car = null;
     ...
     boolean b = car instanceof Car;  // 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 resume Michael: "null es especial" de hecho.

Gerold Broser
fuente
2
Apple y null? ¿No tiene miedo de una demanda? :)
Gábor Lipták
9

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.

Cherouvim
fuente
5

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.

Pascal Thivent
fuente
5

No. Incluso si lo fue, es inútil ya que no tiene métodos ni campos.

Thorbjørn Ravn Andersen
fuente
4

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.

userj29874319284
fuente
3
De hecho, null instanceof <anytype>también regresará false.
Bombe
4

Según las especificaciones de Java ,

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.

Peter Lawrey
fuente
4

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.

Pavel Zaitsev
fuente
3

Es nula una instancia de java.lang.Object ? No.

¿Es null un objeto ? depende de la definición de " es ".

irrefutable
fuente
2
Object foo = null;
System.out.println(foo.toString()); 

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

Matt Stephenson
fuente
1

No, nullno 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 de nullen la memoria.

SparkOn
fuente
El OP pidió (el tipo) Object, no el objeto (como en el caso de un tipo ). Y si uno reformula la pregunta en consecuencia ...
Gerold Broser