Null é um objeto?

119

Nulo é Objectem Java?

Usuário Registrado
fonte
41
Não, não é, e para aqueles que se perguntam por que essa pergunta, existem linguagens em que null é realmente um objeto como qualquer outro, por exemplo, Ruby.
JRL 12/12/09
7
Em Scala, que é muito meticuloso sobre tipos, existe um tipo Null(uma característica , na verdade) que possui uma única instância null.
12249 Carl Smotricz
1
@JRL: Só por curiosidade, eu me pergunto como isso influencia o modo como JRuby funciona ... (Eu não sou suficientemente familiarizado com esse nível de implementação de saber com certeza.)
Benjamin Oakes
Para adicionar @ o comentário de JRL - equivalente aproximado de Ruby para nullé nil, o que é uma instância de NilClass
Eliot Sykes
Ou javascript, no qual null instanceof Objecté falso, mas typeof(null)retorna 'object'. É um objeto nesse caso? Quem sabe.
Don escotilha

Respostas:

166

Se null fosse um Object, suportaria os métodos de java.lang.Objectcomo equals(). No entanto, esse não é o caso - qualquer invocação de método em um nulo resulta em a NullPointerException.

E é isso que a Java Language Specification tem a dizer sobre este tópico:

Há também um tipo nulo especial, o tipo da expressão nulo, que não tem nome. Como o tipo nulo não tem nome, é impossível declarar uma variável do tipo nulo ou converter para o tipo nulo. A referência nula é o único valor possível de uma expressão do tipo nulo. A referência nula sempre pode ser convertida para qualquer tipo de referência. Na prática, o programador pode ignorar o tipo nulo e apenas fingir que nulo é apenas um literal especial que pode ser de qualquer tipo de referência.

Eu acho que isso pode ser resumido em "nulo é especial".

Michael Borgwardt
fonte
1
Portanto, um objeto em Java é apenas um objeto se for igual a ou subclasses java.lang.Object. Praticamente - sim. Você não pode criar uma classe que não é uma subclasse de java.lang.Object, mas eu nunca pensei sobre isso de um ponto de vista filosófico mais
Andreas Dolk
Curiosamente, de todas as coisas, o documentoNullPointerException da API para mencionar um » nullobjeto« ... :) Mas também foi bom falar sobre »ponteiros nulos« ...
Lumi
Você disse: "A referência nula sempre pode ser convertida para qualquer tipo de referência". Então, podemos retornar nulo (tipecasted-se permitido) em um método com um tipo de referência de objeto (retorno)?
Srichakradhar
1
@Richakradhar: sim, nós podemos! Você pode descobrir com mais facilidade tentando no código do que perguntando aqui.
Michael Borgwardt
1
"A referência nula é o único valor possível de uma expressão do tipo nulo". É hora de ler o documento Especificações. :)
sofs1
32

De acordo com a especificação Java , nullé um tipo que pode ser atribuído a uma variável de objeto (como um valor conforme observado no comentário). Você não pode instanciar ou criar variáveis ​​desse tipo, porém, você deve usar o literal nullfornecido pelo compilador.

Dana the Sane
fonte
8
null é um tipo e um valor.
Joachim Sauer
5
O nullnome é uma "instância" do nulltipo, aparentemente.
Strager 12/12/09
nullnão é uma variável, é um literal: JLS, 3.10.7. O Literal Nulo
Gerold Broser
Re " nullé um tipo que pode ser atribuído ": 1) null(no código) é o literal nulo , não o tipo nulo 2) Os tipos não podem ser atribuídos a variáveis ​​em Java em geral, consulte JLS 4.1: " Existem ... ] dois tipos de valores de dados que podem ser armazenados em variáveis: [...] valores primitivos (§4.2) e valores de referência (§4.3). " É a referência nula que pode ser atribuída via nullliteral. ... continua ...
Gerold Broser
3) objeto em " variável de objeto ", comparado à variável de classe, geralmente não se refere ao tipo, mas ao tempo de vida. Ao se referir ao tipo, geralmente é chamado variável de um tipo de referência ou, abreviado, variável de referência (tipo). Estou ciente de 4 tipos na API Java que expõem variáveis ​​de instância / objeto (pode haver mais): matrizes com itslength e as subclasses de java.awt.geom.Point2D.
Gerold Broser 15/08/19
28

Absolutamente não: null instanceof Objectretorna falso.

Darin Dimitrov
fonte
17
E, no entanto, é uma atribuição compatível com todos os tipos de referência.
Chris Vest
12

Não, não é um objeto.

Erich Kitzmueller
fonte
12

Nulo é a falta de um objeto.

Tommy Carlier
fonte
Mas o tipo nulo é atribuível a todos os tipos de referência.
Tom Hawtin - tackline
Não há "tipo nulo"; null é um valor específico de expressões não primitivas (ou seja, referências; também não há "tipo de referência" em Java, no meu entender).
Tommy McGuire
3
Tommy: JLS 4.1: "Há também um tipo nulo especial, o tipo da expressão null, que não tem nome."
12129 Ken
@TommyMcGuire Re » não existe" tipo de referência "em Java « consulte JLS 4.1: " Existem dois tipos de tipos na linguagem de programação Java: tipos primitivos (§4.2) e tipos de referência (§4.3). "
Gerold Broser
12

JRL escreveu:

Não, não é, ...

Com frequência, depende de onde você olha, em quem acredita mais.

De acordo com o JLS, sim, é . Especialmente se você reformular a pergunta para: "O nullliteral é do tipo Object?". Além do JLS 4.1 citado por Michael Borgwardt acima:

Veja JLS 3.10.7 :

Um literal nulo é sempre do tipo nulo.

e JLS 4.10 :

Os subtipos de um tipo T são todos os tipos U, de modo que T é um supertipo de U e o tipo nulo.

ou JLS 4.10.2 :

Os supertipos diretos do tipo nulo são todos os tipos de referência, exceto o próprio tipo nulo.

[Enfatiza por mim.]

De acordo com o compilador do Eclipse 2019-09, não é :

true.toString();  // Cannot invoke toString() on the primitive type boolean
null.toString();  // Cannot invoke toString() on the primitive type null

De acordo com o OpenJDKs 12.0.1 javac , é :

true.toString();  // error: boolean cannot be dereferenced
null.toString();  // error: <null> cannot be dereferenced

Onde os colchetes angulares implicam que nullé de outro tipo que não seja primitivo. E de acordo com o JLS 4.1 :

Existem dois tipos de tipos na linguagem de programação Java: tipos primitivos (...) e tipos de referência (...).

se não é esse, é o outro.


Claudiu escreveu:

null é meio feio.

Au contraire, nullé lindo. O que você sugeriria como valor padrão para uma variável do tipo de referência? Uma combinação arbitrária de bits? Bem-vindo à violação de acesso ou, pior ainda, ao inferno!


Joachim Sauer escreveu:

null é um tipo e um valor.

Na verdade, existem três itens em conjunto com null (consulte também JLS 3.10.7 ):

  1. O tipo nulo (sem nome) .
  2. O null literal .
  3. O valor de referência nulo . (Geralmente abreviado como valor nulo ou simplesmente nulo .)

(1) Observe que, de acordo com o JLS 4.10.2 citado acima, o tipo nulo usa herança múltipla não apenas para interfaces, mas também para classes. O que todos sabemos não é possível para nós programadores de aplicativos.

(2) O literal nulo pode ser imaginado como uma variável definida como:

JVM_global final null_type null = new null_type();

Observe também o JLS 3.9 :

Uma variedade de seqüências de caracteres às vezes é assumida, incorretamente, como palavras-chave:

  • nullnão é uma palavra-chave, mas o literal nulo ( §3.10.7 ).

Relativo null instanceof <any type>

Com o JLS 4.10.2 em mente („o tipo nulo é um subtipo de todo tipo”) null instanceof <any type>deveria ser avaliado true, não deveria? À primeira vista, sim, mas o JLS 15.20.2 fornece a resposta detalhada:

[...] o resultado do instanceofoperador é truese o valor da RelationalExpression não fornull [...]. Caso contrário, o resultado éfalse .

[Enfatiza por mim.]

Pergunte a si mesmo o que faz mais sentido (do ponto de vista de um programador de aplicativos):

  • Dar falsee, assim, indicar que uma expressão de referência não é do tipo exposto para nós, ou seja, indica que não está fazendo referência a nada útil para nós

  • ou dando true, informando-nos que a expressão é avaliada como uma referência especial, a referência nula , referenciando um "objeto" que não sabemos se ela existe e que é do tipo nulo especial que não tem nome, não está exposta a mas através do literal nulo , é um subtipo de qualquer tipo, incluindo herança múltipla e deve ser ignorado de qualquer maneira? Considere também o exemplo mais prático:

     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.

O que também leva a:

Por que instanceofnão é uma maneira correta de dizer algo sobre nullo Objeto?

É chamado instanceofnão sameorsubtypeof. Isso significa que estamos comparando o tipo de uma instância com um tipo, não dois. Agora nullsignifica: "Não há instância" e, se não houver, não haverá o tipo de instância. É óbvio que comparar nada com algo deve levar a isso false.

Ou em um exemplo "mais" do mundo real:

  • Tenho uma foto em tamanho real de uma maçã ( = tipo de referência ) em minhas mãos com »Big Apple« ( = nome do tipo de referência ) escrito nela.
  • Há uma tabela ( = heap ) na minha frente.
  • Se houver uma maçã ( = instância ) na mesa, há um cabo ( = referência ) conectado a ela.
  • Eu seguro a outra extremidade deste cabo na minha mão ( = variável de referência ).
  • Traço a maçã ao longo do cordão e a comparo com a minha foto ( = instanceof ).
  • Se a maçã for do mesmo tamanho ou maior que a figura, a letra »Big Apple« se aplica a ela ( = true ).
  • Se for menor, não ( = false ).
  • Se não houver maçã na tabela (= nenhuma instância ) e, portanto, não existir um fio ( = nulo ), a gravação também não se aplica ( = falso ). Porque: Nenhuma maçã é uma maçã grande? Não, não é.


Como Michael resume: "null é especial" de fato.

Gerold Broser
fonte
2
Apple e nulo? Você não tem medo de um processo? :)
Gábor Lipták
9

Não, não é uma instância de uma classe nem de uma classe. É uma referência a nada.

Editar : não leu as especificações, portanto, as opções acima podem não ser 100% precisas.

cherouvim
fonte
5

Conforme explicado no capítulo 4.1 Os tipos de tipos e valores da especificação da linguagem Java, null é um tipo que possui um valor, a referência nula (e é representada pelo literal null):

Há também um tipo nulo especial , o tipo da expressão null, que não tem nome. Como o tipo nulo não tem nome, é impossível declarar uma variável do tipo nulo ou converter para o tipo nulo. A referência nula é o único valor possível de uma expressão do tipo nulo. A referência nula sempre pode ser convertida para qualquer tipo de referência. Na prática, o programador pode ignorar o tipo nulo e apenas fingir que nullé apenas um literal especial que pode ser de qualquer tipo de referência.

Você pode querer ler sobre o Padrão de Objeto Nulo (que eu não recomendo). Veja o C2 Wiki ou Wikipedia para mais informações sobre esse padrão.

Pascal Thivent
fonte
5

Não. Mesmo que fosse, é inútil, pois não possui métodos ou campos.

Thorbjørn Ravn Andersen
fonte
4

Não, não é um objeto como instância nula; o objeto sempre retornará false, também há apenas um nulo, não um para cada classe.

userj29874319284
fonte
3
De fato, null instanceof <anytype>também retornará false.
Bombe
4

De acordo com a especificação Java ,

Há também um literal nulo especial que pode ser usado como um valor para qualquer tipo de referência. null pode ser atribuído a qualquer variável, exceto variáveis ​​de tipos primitivos. Há pouco que você pode fazer com um valor nulo além do teste de presença. Portanto, null é frequentemente usado em programas como um marcador para indicar que algum objeto está indisponível.

Peter Lawrey
fonte
4

Java manipula objetos por meio de referências. Nulo é uma divisão do OO-ness do Java, uma vez que o deixa abaixo do nível OO. Não, não é um objeto, é um VALOR de uma referência. E não tem nada a ver com paradigmas de objetos, mas se refere ao encanamento de Java, que permite objetos.

Pavel Zaitsev
fonte
3

Null é uma instância de java.lang.Object? Não.

Null é um objeto ? depende da definição de " é ".

irreputável
fonte
2
Object foo = null;
System.out.println(foo.toString()); 

A primeira linha mostra nullpode ser atribuída ao tipo Object, mas a segunda linha demonstrará que certamente não é uma Objecte, eventualmente, resulta em umjava.lang.NullPointerException

Matt Stephenson
fonte
1

Não, nullnão é um objeto. É um tipo de referência e seu valor não se refere a nenhum objeto e, portanto, não há representação nullna memória.

SparkOn
fonte
O OP solicitou (o tipo) Object, não o objeto (como na instância de um tipo ). E se reformula a questão em conformidade ...
Gerold Broser