Java中'boolean'和'Boolean'的默认值是什么?

324

Java中boolean(原始类型)和Boolean(原始包装类型)的默认值是什么?

8个回答

615

Boolean(对象)的默认值是null
boolean(原始数据类型)的默认值false


7
请添加官方来源[链接](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)。 - very

415

任何对象(如Boolean)的默认值为null。

布尔类型的默认值为false。

注意:每个基本类型都有一个包装类。每个包装类使用引用,其默认值为null。基本类型具有不同的默认值:

boolean -> false

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

float, double -> 0.0

注意(2):void有一个包装器Void,它也具有默认值null,并且这是它唯一可能的值(不使用hack的情况下)。


2
我认为可以提到Boolean是一个Object,这样第一行的意思就很明显了。这听起来很基础,但对于像这样问基础问题的人可能会有所帮助。 - Suma

27

布尔型
可以是true(真)或false(假)。
默认值为false(假)。

(来源:Java基本数据类型)

布尔类
可以是表示true(真)或false(假)的Boolean对象,或者可以是null
默认值为null


16
如果您需要询问,那么您需要显式初始化您的字段/变量,因为如果您必须查找它,那么很可能其他人也需要这样做。
基本类型 boolean 的值如此处所示,为false。
正如其他人所提到的, Boolean 的值默认情况下将为null。

1
感谢您提供官方来源。关于初始化,没有必要弥补知识的缺乏。 - LoBo
2
“缺乏知识”意味着有一些期望的水平可以进行比较。如果这个最低知识水平是清晰的,我同意。如果不清楚,我认为更加明确是明智的选择。总的来说,这是一个相当个人/团队的决定/观点。 - Peter Tillemans
4
@LoBo - 我认为弥补潜在知识缺乏没有什么不妥。你不知道将来谁会维护你的代码。只要对性能影响很小,任何可以使你的代码更易理解和/或可读的东西都是好事。 - ferekdoley
我同意@Lobo的观点。你应该假设未来阅读你代码的人知道如何编写Java代码。在代码中解释Java如何工作是一个坏主意。这就是stackoverflow存在的原因。 - Freddie

9

布尔值是一个对象。所以如果它是一个实例变量,它将为null。如果它在方法中声明,您必须初始化它,否则会有编译器错误。

如果您将其声明为原始类型,即boolean,则如果它是实例变量(或类变量),默认值为false。如果它在方法中声明,您仍然必须将其初始化为true或false,否则会有编译器错误。


6

一个未初始化的Boolean成员(实际上是指向类型为Boolean的对象的引用)将具有默认值null

一个未初始化的boolean(原始类型)成员将具有默认值false


4

我认为那三个踩是因为你说“没有默认值”,这是一个相当不清晰的陈述。正如你所说,未初始化的对象引用指向nullnull是默认值,所以我不确定你在说什么时没有默认值。(也许你的意思是类似于“Boolean默认情况下既不是true也不是false”?) - Radiodef
是的,你所说的更准确。已经有一个更简洁的被接受的答案了。我不确定既要对帖子进行投票又要编辑它会得到什么好处。 - Stealth Rabbi
1
澄清一下,我没有投反对票,我的编辑与我的评论完全无关。如果您赞同建议的措辞,请编辑答案,然后我们可以删除评论以进行清理。 - Radiodef
这个回答包含误导/部分错误信息,应该在当前状态下被投票降低/删除。 - improbable
@improbable 什么是误导/部分错误的?你能澄清一下吗? - Stealth Rabbi
Boolean 没有默认值。 - improbable

2
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时,Jackson调用一个getter方法返回一个未分配的基本布尔值时,会抛出NPE。这让我认为Jackson接收到了null并试图在其上调用方法,因此出现了NPE。但事实并非如此。
故事的寓意是:当Java为一个原始类型分配内存时,即使未初始化,该内存也有一个值,对于布尔类型,Java将其等同于false。相比之下,当为一个未初始化的复杂对象(如Boolean)分配内存时,它仅为该对象的引用分配空间,而不是对象本身——内存中没有对象可供引用——因此解析该引用会导致null。
严格来说,“默认为false”可能有点不准确。我认为Java直到显式设置为止才会分配内存并将其赋值为false;我认为Java分配内存并分配给该内存的任何值都与“false”的值相同。但出于实际目的,它们是相同的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接