Valor padrão de 'boolean' e 'Boolean' em Java


260

Quais são os valores padrão de boolean(primitivo) e Boolean(wrapper primitivo) em Java?

Respostas:



390

O valor padrão de qualquer Object, como Boolean, é null.

O valor padrão para a booleané falso.

Nota: Cada primitiva tem uma classe de wrapper. Todo wrapper usa uma referência cujo padrão é null. As primitivas têm valores padrão diferentes:

boolean -> false

byte, char, short, int, long -> 0

float, double -> 0.0

Nota (2): void possui um wrapper Voidque também possui um padrão nulle é seu único valor possível (sem o uso de hacks).


2
Eu acho que se poderia mencionar Booleané Objectque isso tornaria óbvia a primeira linha. Isso parece bastante básico, mas para alguém que faz uma pergunta básica como essa, pode ajudar.
Suma


17

Se você precisar perguntar, será necessário inicializar explicitamente seus campos / variáveis, porque, se precisar procurar, é provável que outras pessoas também o façam.

O valor para uma primitiva booleané falso, como pode ser visto aqui .

Conforme mencionado por outros, o valor para a Booleanserá nulo por padrão.


Obrigado pela referência à fonte oficial. Quanto à inicialização, não há necessidade de compensar a falta de conhecimento.
LoBo

2
'Falta de conhecimento' implica que há algum nível esperado para comparação. Se esse nível mínimo de conhecimento for claro, eu concordo. Caso contrário, acho prudente errar ao ser mais explícito. Em tudo isso, é uma decisão / opinião bastante pessoal / em equipe.
precisa

4
@ Loo - Acho que não há nada errado em compensar uma potencial falta de conhecimento. Você não sabe quem manterá seu código na linha. Qualquer coisa que torne seu código mais fácil de entender e / ou legível, embora tenha pouco impacto no desempenho, só pode ser uma coisa boa.
precisa saber é o seguinte

9

Booleano é um objeto. Portanto, se for uma variável de instância, será nulo. Se for declarado em um método, você precisará inicializá-lo ou ocorrerá um erro do compilador.

Se você declarar como primitivo, isto é, booleano. O valor será falso por padrão se for uma variável de instância (ou variável de classe). Se ele for declarado em um método, você ainda precisará inicializá-lo para true ou false, ou haverá um erro do compilador.


6

Um Booleanmembro não inicializado (na verdade, uma referência a um objeto do tipo Boolean) terá o valor padrão de null.

Um booleanmembro não inicializado (primitivo) terá o valor padrão de false.


4

Não há padrão para Boolean. Booleandeve ser construído com a booleanou a String. Se o objeto não for inicializado, ele apontaria para null.

O valor padrão de primitivo booleané false.

http://download.oracle.com/javase/6/docs/api/java/lang/Boolean.html
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html


Eu acho que esses 3 votos negativos são porque você diz "não há padrão", o que é uma afirmação bastante incerta. Como você diz, uma referência de objeto não inicializado aponta para null. nullé o padrão, por isso não sei ao que você está se referindo quando diz que não há um. (Você talvez quer dizer algo como " Booleannão é nem truenem falsepor defeito"?)
Radiodef

Sim, o que você coloca é mais preciso. Já existe uma resposta aceita que é mais concisa. Não sei ao certo o que é ganho com o voto negativo e a edição.
Rabino Stealth

1
Para esclarecer, não reduzi o voto e minha edição não teve nenhuma relação com o meu comentário. Eu recomendo editar a resposta se você aprovar a frase sugerida e, em seguida, podemos excluir nossos comentários para limpar.
Radiodef 04/07

1
class BooleanTester
{
    boolean primitive;
    Boolean object;

    public static void main(String[] args) {
        BooleanTester booleanTester = new BooleanTester();
        System.out.println("primitive: " + booleanTester.getPrimitive());
        System.out.println("object: " + booleanTester.getObject());
}

    public boolean getPrimitive() {
        return primitive;
    }

    public Boolean getObject() {
        return object;
    }
}

resultado:

primitive: false
object: null

Isso parece óbvio, mas eu tive uma situação em que Jackson, enquanto serializava um objeto para JSON, lançava um NPE após chamar um getter, assim como este, que retorna um booleano primitivo que não foi atribuído. Isso me levou a acreditar que Jackson estava recebendo um nulo e tentando chamar um método, daí o NPE. Eu estava errado.

A moral da história é que, quando Java aloca memória para um primitivo, essa memória tem um valor mesmo que não seja inicializado, que Java equivale a falso para um booleano. Por outro lado, ao alocar memória para um objeto complexo não inicializado como um Booleano, ele aloca apenas espaço para uma referência a esse objeto, não ao próprio objeto - não há nenhum objeto na memória para se referir -, portanto, resolver essa referência resulta em nulo.

Eu acho que, estritamente falando, "o padrão é falso" está um pouco errado. Eu acho que Java não aloca a memória e atribui um valor de false até que seja explicitamente definido; Eu acho que Java aloca a memória e qualquer valor que a memória aconteça ter é o mesmo que o valor de 'false'. Mas, para fins práticos, são a mesma coisa.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.