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 null
literal é 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 ):
- O tipo nulo (sem nome) .
- O
null
literal .
- 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:
null
nã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 instanceof
operador é true
se 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 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ó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 instanceof
não é uma maneira correta de dizer algo sobre null
o Objeto?
É chamado instanceof
não sameorsubtypeof
. Isso significa que estamos comparando o tipo de uma instância com um tipo, não dois. Agora null
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 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.