Valore predefinito di "booleano" e "Booleano" in Java


260

Quali sono i valori predefiniti di boolean(primitivo) e Boolean(wrapper primitivo) in Java?

Risposte:



390

Il valore predefinito di any Object, ad esempio Boolean, è null.

Il valore predefinito per a booleanè falso.

Nota: ogni primitiva ha una classe wrapper. Ogni wrapper utilizza un riferimento che ha un valore predefinito di null. Le primitive hanno valori predefiniti diversi:

boolean -> false

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

float, double -> 0.0

Nota (2): void ha un wrapper Voidche ha anche un valore predefinito di nulled è il suo unico valore possibile (senza usare hack).


2
Credo che si possa parlare di Booleansi Object, che renderebbero la prima linea ovvio significato. Sembra abbastanza semplice, ma per qualcuno che fa una domanda di base come questa può essere d'aiuto.
Suma,

23

booleano
Può essere trueo false.
Il valore predefinito è false.

(Fonte: Variabili primitive Java )

Booleano
Può essere un Booleanoggetto che rappresenta trueo false, o può essere null.
Il valore predefinito è null.


17

Se devi chiedere, allora devi inizializzare esplicitamente i tuoi campi / variabili, perché se devi cercarlo, allora è probabile che anche qualcun altro debba farlo.

Il valore per una primitiva booleanè falso, come si può vedere qui .

Come menzionato da altri, il valore di a Booleansarà nullo per impostazione predefinita.


Grazie per riferimento a fonte ufficiale. Per quanto riguarda l'inizializzazione, non è necessario compensare la mancanza di conoscenza.
LoBo,

2
La "mancanza di conoscenza" implica che esiste un livello atteso da confrontare. Se questo livello minimo di conoscenza è chiaro, sono d'accordo. Altrimenti, trovo prudente sbagliare nell'essere più esplicito. In tutto ciò è una decisione / opinione piuttosto personale / di gruppo.
Peter Tillemans,

4
@LoBo - Penso che non ci sia nulla di male nel compensare una potenziale mancanza di conoscenza. Non sai chi manterrà il tuo codice in futuro. Tutto ciò che rende il tuo codice più facilmente comprensibile e / o leggibile, pur avendo poco impatto sulle prestazioni, può solo essere una buona cosa.
Ferekdoley,

9

Boolean è un oggetto. Quindi se è una variabile di istanza sarà nulla. Se è dichiarato all'interno di un metodo, dovrai inizializzarlo o si verificherà un errore del compilatore.

Se dichiari come un primitivo cioè booleano. Il valore sarà falso per impostazione predefinita se si tratta di una variabile di istanza (o variabile di classe). Se viene dichiarato all'interno di un metodo, dovrai comunque inizializzarlo su true o false oppure si verificherà un errore del compilatore.


6

Un Booleanmembro non inizializzato (in realtà un riferimento a un oggetto di tipo Boolean) avrà il valore predefinito di null.

Un booleanmembro non inizializzato (primitivo) avrà il valore predefinito di false.


4

Non esiste alcun valore predefinito per Boolean. Booleandeve essere costruito con a booleano a String. Se l'oggetto non è inizializzato, farebbe riferimento a null.

Il valore predefinito di primitive booleanè false.

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


Penso che quei 3 downgrade siano dovuti al fatto che dici "non esiste alcun valore predefinito" che è un'affermazione abbastanza poco chiara. Come dici tu, un riferimento a un oggetto non inizializzato punta a null. nullè l'impostazione predefinita, quindi non sono sicuro di cosa ti riferisci quando dici che non ce n'è uno. (Forse intendevi qualcosa come " Booleannon è truefalsedi default"?)
Radiodef,

Sì, ciò che metti è più preciso. C'è già una risposta accettata che è più concisa. Non sono sicuro di ciò che si ottiene sia ridimensionando un post che modificandolo.
Stealth Rabbi

1
Per chiarire, non ho votato a fondo e la mia modifica non è stata completamente correlata al mio commento. Ti consiglio di modificare la risposta se approvi la frase suggerita, e quindi possiamo eliminare i nostri commenti per ripulire.
Radiodef,

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;
    }
}

produzione:

primitive: false
object: null

Questo sembra ovvio, ma ho avuto una situazione in cui Jackson, durante la serializzazione di un oggetto su JSON, lanciava un NPE dopo aver chiamato un getter, proprio come questo, che restituisce un booleano primitivo che non è stato assegnato. Questo mi ha portato a credere che Jackson stesse ricevendo un null e provando a chiamare un metodo su di esso, quindi l'NPE. Mi sbagliavo.

La morale della storia è che quando Java alloca memoria per una primitiva, quella memoria ha un valore anche se non inizializzato, che Java equivale a falso per un valore booleano. Al contrario, quando alloca memoria per un oggetto complesso non inizializzato come un booleano, alloca solo lo spazio per un riferimento a quell'oggetto, non l'oggetto stesso - non c'è alcun oggetto in memoria a cui fare riferimento - risolvendo tale riferimento risulta nullo.

Penso che in senso stretto, "il valore predefinito è falso" è un po 'fuori dal comune. Penso che Java non alloca la memoria e gli assegni un valore false fino a quando non viene impostato esplicitamente; Penso che Java alloca la memoria e qualunque valore abbia la stessa memoria è uguale al valore di 'false'. Ma per scopi pratici sono la stessa cosa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.