Значення за замовчуванням 'boolean' та 'Boolean' у Java


260

Які значення за замовчуванням boolean(примітивні) та Boolean(примітивні обгортки) у Java?

Відповіді:



390

Значенням за замовчуванням будь-якого Object, наприклад Boolean, є null.

Значення за замовчуванням для а booleanє помилковим.

Примітка. Кожен примітив має клас обгортки. Кожна обгортка використовує посилання, яке має за замовчуванням null. Примітиви мають різні значення за замовчуванням:

boolean -> false

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

float, double -> 0.0

Примітка (2): void має обгортку, Voidяка також має за замовчуванням nullі є лише можливим значенням (без використання хак).


2
Я думаю , що можна було б відзначити Booleanце Object, що б перша лінія означає очевидне. Це звучить досить просто, але для когось, хто задає таке основне питання, це може допомогти.
Сума

23

булева
Може бути trueабо false.
Значення за замовчуванням - false.

(Джерело: Примітивні змінні Java )

Boolean
Може бути Booleanоб'єкт , який представляє trueабо false, або може бути null.
Значення за замовчуванням - null.


17

Якщо вам потрібно запитати, то вам потрібно явно ініціалізувати свої поля / змінні, адже якщо вам доведеться їх шукати, то ймовірність, що хтось інший теж повинен це зробити.

Значення для примітиву booleanхибне, як це можна побачити тут .

Як зазначають інші, значення Booleanза замовчуванням буде за замовчуванням нульовим.


Дякую за посилання на офіційне джерело. Щодо ініціалізації, не потрібно компенсувати відсутність знань.
LoBo

2
"Відсутність знань" означає, що для порівняння існує якийсь очікуваний рівень. Якщо цей мінімальний рівень знань зрозумілий, я згоден. Якщо ні, то я вважаю за доцільне помилитися з тим, щоб бути більш чіткими. У всьому це досить особисте / командне рішення / думка.
Пітер Тіллеманс

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

9

Булев - об’єкт. Тож якщо це змінна інстанція, вона буде нульовою. Якщо це оголошено в рамках методу, вам доведеться його ініціалізувати, або виникла помилка компілятора.

Якщо ви декларуєте як примітив, тобто булевий. Значення за замовчуванням буде помилковим, якщо це змінна інстанція (або змінна клас). Якщо це оголошено в рамках методу, вам все одно доведеться ініціалізувати його на істинне чи хибне, або виникла помилка компілятора.


6

Неініціалізований Booleanчлен (фактично посилання на об'єкт типу Boolean) матиме значення за замовчуванням null.

Неініціалізований boolean(примітивний) член матиме значення за замовчуванням false.


4

Не існує за замовчуванням для Boolean. Booleanповинні бути побудовані з a booleanабо a 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 виділяє пам'ять, і будь-яке значення, яке має пам'ять, те саме, що значення "false". Але з практичної мети вони те саме.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.