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.
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".
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.
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.
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."
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:
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 booleannull.toString();// Cannot invoke toString() on the primitive type null
De acordo com o OpenJDKs 12.0.1 javac, é :
true.toString();// error: boolean cannot be dereferencednull.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 ):
O tipo nulo (sem nome) .
O nullliteral .
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();
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:
classCarimplementsVehicle{...Vehicle car =null;...boolean b = car instanceofCar;// 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 é.
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.
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.
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.
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
Null
(uma característica , na verdade) que possui uma única instâncianull
.null
énil
, o que é uma instância de NilClassnull instanceof Object
é falso, mastypeof(null)
retorna'object'
. É um objeto nesse caso? Quem sabe.Respostas:
Se null fosse um Object, suportaria os métodos de
java.lang.Object
comoequals()
. No entanto, esse não é o caso - qualquer invocação de método em um nulo resulta em aNullPointerException
.E é isso que a Java Language Specification tem a dizer sobre este tópico:
Eu acho que isso pode ser resumido em "nulo é especial".
fonte
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 maisNullPointerException
da API para mencionar um »null
objeto« ... :) Mas também foi bom falar sobre »ponteiros nulos« ...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 literalnull
fornecido pelo compilador.fonte
null
nome é uma "instância" donull
tipo, aparentemente.null
não é uma variável, é um literal: JLS, 3.10.7. O Literal Nulonull
é 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 vianull
literal. ... continua ...length
e as subclasses dejava.awt.geom.Point2D
.Absolutamente não:
null instanceof Object
retorna falso.fonte
Não, não é um objeto.
fonte
Nulo é a falta de um objeto.
fonte
JRL escreveu:
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
null
literal é do tipoObject
?". Além do JLS 4.1 citado por Michael Borgwardt acima:Veja JLS 3.10.7 :
e JLS 4.10 :
ou JLS 4.10.2 :
[Enfatiza por mim.]
De acordo com o compilador do Eclipse 2019-09, não é :
De acordo com o OpenJDKs 12.0.1
javac
, é :Onde os colchetes angulares implicam que
null
é de outro tipo que não seja primitivo. E de acordo com o JLS 4.1 :se não é esse, é o outro.
Claudiu escreveu:
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:
Na verdade, existem três itens em conjunto com null (consulte também JLS 3.10.7 ):
null
literal .(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 :
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 avaliadotrue
, não deveria? À primeira vista, sim, mas o JLS 15.20.2 fornece a resposta detalhada:[Enfatiza por mim.]
Pergunte a si mesmo o que faz mais sentido (do ponto de vista de um programador de aplicativos):
Dar
false
e, 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ósou 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:O que também leva a:
Por que
instanceof
não é uma maneira correta de dizer algo sobrenull
o Objeto?É chamado
instanceof
nãosameorsubtypeof
. Isso significa que estamos comparando o tipo de uma instância com um tipo, não dois. Agoranull
significa: "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 issofalse
.Ou em um exemplo "mais" do mundo real:
Como Michael resume: "null é especial" de fato.
fonte
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.
fonte
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
):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.
fonte
Não. Mesmo que fosse, é inútil, pois não possui métodos ou campos.
fonte
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.
fonte
null instanceof <anytype>
também retornaráfalse
.De acordo com a especificação Java ,
fonte
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.
fonte
Null é uma instância de
java.lang.Object
? Não.Null é um objeto ? depende da definição de " é ".
fonte
A primeira linha mostra
null
pode ser atribuída ao tipoObject
, mas a segunda linha demonstrará que certamente não é umaObject
e, eventualmente, resulta em umjava.lang.NullPointerException
fonte
Não,
null
não é um objeto. É um tipo de referência e seu valor não se refere a nenhum objeto e, portanto, não há representaçãonull
na memória.fonte
Object
, não o objeto (como na instância de um tipo ). E se reformula a questão em conformidade ...