Значение по умолчанию «логическое» и «логическое» в Java


260

Каковы значения по умолчанию boolean(примитив) и Boolean(примитивная оболочка) в Java?

Ответы:



390

Значением по умолчанию любого Object, например Boolean, является null.

Значением по умолчанию для a booleanявляется false.

Примечание. Каждый примитив имеет класс-оболочку. Каждая оболочка использует ссылку, которая по умолчанию имеет значение null. Примитивы имеют разные значения по умолчанию:

boolean -> false

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

float, double -> 0.0

Примечание (2): void имеет обертку, Voidкоторая также имеет значение по умолчанию nullи является единственным возможным значением (без использования хаков).


2
Я думаю , что можно было бы отметить Booleanэто Object, что бы первая линия означает очевидное. Это звучит довольно просто, но для кого-то, задающего такой простой вопрос, это может помочь.
Сума


17

Если вам нужно спросить, то вам нужно явно инициализировать ваши поля / переменные, потому что, если вам придется искать это, то есть вероятность, что кто-то другой должен сделать это тоже.

Значение для примитива booleanложно, как можно увидеть здесь .

Как уже упоминалось другими, значение для Booleanпо умолчанию будет нулевым.


Спасибо за ссылку на официальный источник. Что касается инициализации, то нет необходимости компенсировать недостаток знаний.
LoBo

2
«Недостаток знаний» подразумевает, что есть некоторый ожидаемый уровень для сравнения. Если этот минимальный уровень знаний понятен, я согласен. Если нет, я считаю разумным ошибиться, будучи более явным. Во всем это довольно личное / командное решение / мнение.
Питер Тильманс

4
@LoBo - я думаю, что нет ничего плохого в компенсации потенциального недостатка знаний. Вы не знаете, кто будет поддерживать ваш код в будущем. Все, что делает ваш код более понятным и / или читаемым, хотя и мало влияет на производительность, может быть только хорошим.
ferekdoley

9

Булево является объектом. Так что если это переменная экземпляра, она будет нулевой. Если он объявлен в методе, вам придется его инициализировать, иначе произойдет ошибка компилятора.

Если вы объявите как примитив, то есть логическое значение. Значение будет ложным по умолчанию, если это переменная экземпляра (или переменная класса). Если он объявлен в методе, вам все равно придется инициализировать его как true или false, иначе будет ошибка компилятора.


6

Неинициализированный Booleanэлемент (фактически ссылка на объект типа Boolean) будет иметь значение по умолчанию null.

Неинициализированный boolean(примитивный) член будет иметь значение по умолчанию false.


4

Там нет по умолчанию для Boolean. Booleanдолжен быть построен с booleanили String. Если объект не инициализирован, он будет указывать на null.

Значением по умолчанию для примитива booleanявляется false.

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


Я думаю, что эти 3 отрицательных голоса вызваны тем, что вы говорите «нет дефолта», что является довольно неясным утверждением. Как вы говорите, ссылка на неинициализированный объект указывает на null. nullпо умолчанию, поэтому я не уверен, что вы имеете в виду, когда говорите, что его нет. (Возможно, вы имели в виду что-то вроде « Booleanнет trueни falseпо умолчанию»?)
Radiodef

Да, то, что вы положили, более точно. Уже есть принятый ответ, который является более кратким. Я не уверен в том, что получится, если вы опустите голосование и отредактируете его.
Раввин Стелс

1
Чтобы уточнить, я не понизил голосование, и мое редактирование было совершенно не связано с моим комментарием. Я бы порекомендовал отредактировать ответ, если вы одобряете предложенную формулировку, а затем мы можем удалить наши комментарии для очистки.
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;
    }
}

вывод:

primitive: false
object: null

Это кажется очевидным, но у меня была ситуация, когда Джексон, выполняя сериализацию объекта в JSON, бросал NPE после вызова метода получения, как этот, который возвращает примитивное логическое значение, которое не было назначено. Это заставило меня поверить, что Джексон получал ноль и пытался вызвать метод для него, отсюда и NPE. Я ошибался.

Мораль этой истории заключается в том, что когда Java выделяет память для примитива, эта память имеет значение, даже если оно не инициализировано, что в Java равно ложному для логического значения. Напротив, при выделении памяти для неинициализированного сложного объекта, такого как логический, он выделяет только пространство для ссылки на этот объект, а не сам объект - в памяти нет объекта, на который можно сослаться, - поэтому разрешение этой ссылки приводит к нулю.

Я думаю, что, строго говоря, «по умолчанию ложно» немного не в порядке. Я думаю, что Java не выделяет память и не присваивает ей значение false, пока она не будет явно установлена; Я думаю, что Java выделяет память, и любое значение, которое имеет эта память, совпадает со значением «ложь». Но для практических целей это одно и то же.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.