O que é null
?
É null
uma instância de alguma coisa?
A que conjunto null
pertence?
Como isso é representado na memória?
java
null
terminology
unj2
fonte
fonte
Respostas:
Não, não existe um tipo que
null
seja uminstanceof
.15.20.2 Operador de comparação de tipos
instanceof
Isso significa que para qualquer tipo
E
eR
, para qualquerE o
, ondeo == null
,o instanceof R
é semprefalse
.JLS 4.1 Os tipos de tipos e valores
Como a citação JLS acima diz, na prática você pode simplesmente fingir que é "apenas um literal especial que pode ser de qualquer tipo de referência".
Em Java,
null == null
(isso nem sempre é o caso em outras linguagens). Observe também que, por contrato, ele também possui esta propriedade especial (dejava.lang.Object
):Também é o valor padrão (para variáveis que os possuem) para todos os tipos de referência:
JLS 4.12.5 Valores iniciais das variáveis
Como isso é usado varia. Você pode usá-lo para ativar o que é chamado de inicialização lenta de campos, onde um campo teria seu valor inicial
null
até que seja realmente usado, onde será substituído pelo valor "real" (que pode ser caro para calcular).Existem também outros usos. Vamos dar um exemplo real de
java.lang.System
:Este é um padrão de uso muito comum:
null
é usado para denotar a inexistência de um objeto.Aqui está outro exemplo de uso, desta vez de
java.io.BufferedReader
:Então, aqui,
readLine()
retornariainstanceof String
para cada linha, até que finalmente retorne anull
para significar o fim. Isso permite que você processe cada linha da seguinte maneira:Pode-se projetar a API para que a condição de terminação não dependa do
readLine()
retornonull
, mas pode-se ver que esse design tem o benefício de tornar as coisas concisas. Observe que não há problema com linhas vazias, porque uma linha vazia"" != null
.Vamos dar outro exemplo, desta vez de
java.util.Map<K,V>
:Aqui começamos a ver como o uso
null
pode complicar as coisas. A primeira instrução diz que, se a chave não estiver mapeada,null
será retornada. A segunda declaração diz que, mesmo que a chave esteja mapeada, ela tambémnull
pode ser retornada.Por outro lado,
java.util.Hashtable
simplifica as coisas, não permitindonull
chaves e valores; issoV get(Object key)
, se retornarnull
, significa sem ambiguidade que a chave não está mapeada.Você pode ler o restante das APIs e descobrir onde e como
null
é usado. Lembre-se de que eles nem sempre são os exemplos de melhores práticas .De um modo geral,
null
são usados como um valor especial para significar:Em Java? Não é da sua conta. E é melhor mantê-lo assim.
É
null
uma coisa boa?Agora isso é subjetivo limítrofe. Algumas pessoas dizem que isso
null
causa muitos erros de programador que poderiam ter sido evitados. Alguns dizem que em uma linguagem que pegaNullPointerException
como Java, é bom usá-lo porque você irá falhar rapidamente em erros de programador. Algumas pessoas evitamnull
usar o padrão de objeto Nulo , etc.Este é um tópico enorme por si só, por isso é melhor discutido como resposta a outra pergunta.
Terminarei isso com uma citação do próprio inventor
null
, CAR Hoare (de fama de quicksort):O vídeo desta apresentação é mais profundo; é um relógio recomendado.
fonte
NIL
) em 1960, e provavelmente antes. Mas não acho que Hoare esteja realmente tentando reivindicar a invenção de referências nulas nessa citação.Não. É por isso
null instanceof X
que retornaráfalse
para todas as classesX
. (Não se deixe enganar pelo fato de poder atribuirnull
a uma variável cujo tipo é um tipo de objeto. Estritamente falando, a atribuição envolve uma conversão implícita de tipo; veja abaixo.)É o primeiro e único membro do tipo nulo, em que o tipo nulo é definido da seguinte maneira:
"Também existe 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. reference é 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 tipo de referência." JLS 4.1
Veja acima. Em alguns contextos,
null
é usado para denotar "nenhum objeto" ou "desconhecido" ou "indisponível", mas esses significados são específicos de aplicativos.Isso é específico da implementação e você não poderá ver a representação
null
em um programa Java puro. (Masnull
é representado como um endereço / ponteiro zero da máquina na maioria, se não em todas as implementações de Java.)fonte
O que é nulo?
Não é nada.
Null é uma instância de alguma coisa?
Não, pois não é nada. Não pode ser instância de nada.
A que conjunto pertence o nulo?
Nenhum conjunto
Como isso é representado na memória?
Se algumas referências apontarem para ele, como:
Na memória de heap, algum espaço atribuído ao novo objeto criado. E o apontará para o espaço atribuído na memória.
Agora
o=null;
Isso significa que agora o não apontará para esse espaço de memória do objeto.
fonte
Não, não é a instância de nada, instanceof sempre será falsa.
fonte
A palavra-chave nula é um literal que representa uma referência nula, que não se refere a nenhum objeto . null é o valor padrão das variáveis do tipo de referência.
Talvez também dê uma olhada
null: Glossário Java
fonte
Nulo não é uma instância de nenhuma classe.
No entanto, você pode atribuir nulo a variáveis de qualquer tipo (objeto ou matriz):
fonte
Nulo em Java (tm)
Em C e C ++, "NULL" é uma constante definida em um arquivo de cabeçalho, com um valor como:
ou:
ou:
dependendo das opções do compilador e do modelo de memória. NULL não é, estritamente falando, parte do próprio C / C ++.
No Java (tm), "null" não é uma palavra-chave, mas um literal especial do tipo nulo. Pode ser convertido para qualquer tipo de referência, mas não para qualquer tipo primitivo, como int ou booleano. O literal nulo não necessariamente tem valor zero. E é impossível converter para o tipo nulo ou declarar uma variável desse tipo.
fonte
Representação de bytecode
O Java
null
possui suporte direto à JVM: três instruções são usadas para implementá-lo:aconst_null
: por exemplo, para definir uma variávelnull
como emObject o = null;
ifnull
eifnonnull
: por exemplo, para comparar um objetonull
como emif (o == null)
O capítulo 6 "O conjunto de instruções da Java Virtual Machine" menciona os efeitos de
null
outras instruções: lança umNullPointerException
para muitos deles.2.4 "Tipos e valores de referência" também menciona
null
em termos genéricos:fonte
null
é um valor especial, não é instância de nada. Por uma razão óbvia, não pode serinstanceof
nada.fonte
null
é um valor especial que não é uma instância de nenhuma classe. Isso é ilustrado pelo seguinte programa:fonte
null
não é uma instância deString
.void f(String o)
, faria mais sentido.null em Java é semelhante / semelhante a nullptr em C ++.
Programa em C ++:
Mesmo programa em Java:
Agora você entende pelos códigos acima o que é nulo em Java? Se não, recomendo que você aprenda ponteiros em C / C ++ e então entenderá.
Observe que em C, ao contrário de C ++, nullptr é indefinido, mas NULL é usado em vez disso, o que também pode ser usado em C ++, mas em C ++ o nullptr é mais preferível do que apenas NULL, porque o NULL em C está sempre relacionado a ponteiros e isso é então, em C ++, o sufixo "ptr" foi acrescentado ao final da palavra e agora todas as letras são minúsculas, mas isso é menos importante.
Em Java, cada variável da classe de tipo não primitiva sempre é referência a objeto desse tipo ou herdada e null é referência de objeto de classe nula, mas não ponteiro nulo, porque em Java não existe tal coisa "ponteiro", mas referências a classe objetos são usados e nulo em Java está relacionado às referências a objetos de classe; portanto, você também pode chamá-lo como "nullref" ou "nullrefobj", mas como é longo, basta chamá-lo de "nulo".
Em C ++, você pode usar ponteiros e o valor nullptr para membros / variáveis opcionais , ou seja, membro / variável que não tem valor e, se não tiver valor, será igual a nullptr; portanto, como nulo em Java pode ser usado, por exemplo.
fonte
Existem duas categorias principais de tipos em Java: primitivo e referência . Variáveis declaradas de um tipo primitivo armazenam valores; variáveis declaradas de um tipo de referência armazenam referências.
Nesse caso, a instrução de inicialização declara as variáveis "x". "X" armazena a referência de sequência. Aqui é nulo . Antes de tudo, null não é uma instância de objeto válida, portanto, não há memória alocada para ele. É simplesmente um valor que indica que a referência do objeto não está se referindo atualmente a um objeto.
fonte
Uma maneira interessante de ver nulo em java na minha opinião é vê-lo como algo que NÃO denota falta de informação, mas simplesmente como um valor literal que pode ser atribuído a uma referência de qualquer tipo. Se você pensar sobre isso, se denotou ausência de informações, então a1 == a2 é verdadeiro não faz sentido (no caso de ambos terem sido atribuídos a um valor nulo), pois eles poderiam realmente estar apontando para QUALQUER objeto (simplesmente não sei para quais objetos eles devem estar apontando) ... A propósito, null == null retorna true em java. Se java, por exemplo, seria como SQL: 1999, então null == null retornaria desconhecido (um valor booleano no SQL: 1999 pode assumir três valores: verdadeiro, falso e desconhecido, mas na prática o desconhecido é implementado como nulo em sistemas reais) ... http://en.wikipedia.org/wiki/SQL
fonte
Resposta curta e precisa que responde formalmente a todas as suas perguntas da JLS:
Apenas uma referência do tipo que é atribuída a null é alocada. Você não atribui nenhum valor (objeto) à referência. Essa alocação é específica para a JVM quanta referência será necessária e em qual área de memória será alocada.
fonte