Domyślna wartość „boolean” i „Boolean” w Javie


Odpowiedzi:



390

Domyślna wartość dowolnej Object, takiej jak Boolean, to null.

Wartość domyślna dla a booleanto false.

Uwaga: każdy element pierwotny ma klasę opakowania. Każde opakowanie wykorzystuje odniesienie, które ma wartość domyślną null. Prymitywy mają różne wartości domyślne:

boolean -> false

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

float, double -> 0.0

Uwaga (2): void ma opakowanie, Voidktóre ma również wartość domyślną nulli jest to jedyna możliwa wartość (bez użycia hacków).


2
Myślę, że można by wspomnieć Booleanjest Object, że może sprawić, że pierwsza linia oznacza oczywiste. Brzmi to dość prosto, ale dla kogoś, kto zadaje takie podstawowe pytanie, może to pomóc.
Suma

23

boolean
Może być truelub false.
Wartość domyślna to false.

(Źródło: Java Primitive Variables )

Boolean
Może być Booleanobiektem reprezentującym truelub false, lub może być null.
Wartość domyślna to null.


17

Jeśli musisz zapytać, musisz jawnie zainicjować swoje pola / zmienne, ponieważ jeśli musisz to sprawdzić, istnieje szansa, że ​​ktoś inny też to zrobi.

Wartość prymitywu booleanjest fałszywa, co można zobaczyć tutaj .

Jak wspomniano przez innych, wartość a Booleanbędzie domyślnie pusta.


Dziękujemy za odniesienie do oficjalnego źródła. Jeśli chodzi o inicjalizację, nie ma potrzeby rekompensowania braku wiedzy.
LoBo

2
„Brak wiedzy” oznacza, że ​​istnieje pewien oczekiwany poziom do porównania. Jeśli ten minimalny poziom wiedzy jest jasny, zgadzam się. Jeśli nie, uważam, że rozważne jest bycie bardziej wyraźnym. W sumie jest to decyzja / opinia raczej osobista / zespołowa.
Peter Tillemans

4
@LoBo - Myślę, że nie ma nic złego w kompensacji potencjalnego braku wiedzy. Nie wiesz, kto będzie utrzymywał twój kod. Wszystko, co sprawia, że ​​kod jest łatwiejszy do zrozumienia i / lub czytelny, choć ma niewielki wpływ na wydajność, może być tylko dobrą rzeczą.
ferekdoley

9

Boolean to obiekt. Więc jeśli jest to zmienna instancji, będzie zerowa. Jeśli zostanie zadeklarowany w ramach metody, będziesz musiał ją zainicjować lub wystąpi błąd kompilatora.

Jeśli zadeklarujesz jako prymityw, tj. Boolean. Wartość będzie domyślnie fałszywa, jeśli jest to zmienna instancji (lub zmienna klasy). Jeśli zostanie zadeklarowany w ramach metody, nadal będziesz musiał zainicjować wartość true lub false, albo wystąpi błąd kompilatora.


6

Niezainicjowany Booleanelement członkowski (w rzeczywistości odniesienie do obiektu typu Boolean) będzie miał wartość domyślną null.

Niezainicjowany boolean(prymitywny) element członkowski będzie miał wartość domyślną false.


4

Nie ma wartości domyślnej dla Boolean. Booleanmusi być zbudowany za pomocą a booleanlub a String. Jeśli obiekt jest niezainicjowany, wskazywałby null.

Domyślna wartość operacji podstawowej booleanto false.

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


Myślę, że te 3 negatywne opinie są spowodowane tym, że mówisz „nie ma domyślnego”, co jest dość niejasnym stwierdzeniem. Jak mówisz, wskazuje na niezainicjowane odwołanie do obiektu null. nulljest ustawieniem domyślnym, więc nie jestem pewien, o czym mówisz, gdy mówisz, że nie ma. (Czy miałeś na myśli coś w stylu „ Booleannie jest trueani falsedomyślnie”?)
Radiodef

Tak, to, co wkładasz, jest dokładniejsze. Istnieje już zaakceptowana odpowiedź, która jest bardziej zwięzła. Nie jestem pewien, co zyskałem, zarówno oddając głosowanie na post, jak i edytując go.
Stealth Rabbi

1
Aby to wyjaśnić, nie oddałem głosu, a moja edycja była całkowicie niezwiązana z moim komentarzem. Polecam edycję odpowiedzi, jeśli akceptujesz sugerowane sformułowanie, a następnie możemy usunąć nasze komentarze, aby je oczyścić.
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;
    }
}

wynik:

primitive: false
object: null

Wydaje się to oczywiste, ale miałem sytuację, w której Jackson, serializując obiekt do JSON, rzucał NPE po wywołaniu gettera, tak jak ten, który zwraca prymitywną wartość logiczną, której nie przypisano. Doprowadziło mnie to do przekonania, że ​​Jackson otrzymywał zero i próbował nazwać metodę, stąd NPE. Myliłem się.

Morał tej historii jest taki, że gdy Java przydziela pamięć prymitywowi, pamięć ta ma wartość, nawet jeśli nie jest zainicjowana, co dla Javy jest równe false dla wartości logicznej. Natomiast przy alokacji pamięci dla niezainicjowanego obiektu złożonego, takiego jak wartość logiczna, alokuje on tylko miejsce na odwołanie do tego obiektu, a nie na sam obiekt - nie ma obiektu w pamięci, do którego można by się odwoływać - więc rozwiązanie tego odwołania powoduje, że wartość jest pusta.

Myślę, że ściśle mówiąc „domyślnie fałsz” jest trochę poza zasięgiem. Myślę, że Java nie przydziela pamięci i nie przypisuje jej wartości false, dopóki nie zostanie jawnie ustawiona; Myślę, że Java przydziela pamięć i każda wartość, jaką ma pamięć, jest taka sama jak wartość „fałsz”. Ale ze względów praktycznych są one tym samym.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.