Java中的'boolean'和'Boolean'的默认值


Answers:



390

的任何默认值Object,例如Boolean,是null

a的默认值为booleanfalse。

注意:每个原语都有一个包装器类。每个包装器都使用默认值为的引用null。基元具有不同的默认值:

boolean -> false

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

float, double -> 0.0

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


2
我想可以提到的BooleanObject,这会使第一行的含义显而易见。这听起来很基础,但是对于有人问这样的基本问题可能会有所帮助。
Suma,

23

布尔值
可以是truefalse
默认值为false

(来源:Java基本变量

布尔值
可以是Boolean表示trueor 的对象false可以是null
默认值为null


17

如果需要询问,则需要显式初始化字段/变量,因为如果必须查找它,那么其他人也可能需要这样做。

为原始值boolean是假的可以看出这里

正如其他人所提到的,a的值Boolean默认为null。


感谢您参考官方资料。关于初始化,不需要补偿知识的不足。
LoBo

2
“缺乏知识”意味着需要比较一些预期的水平。如果这个最低知识水平很明确,我同意。如果不是,我建议您谨慎一点,不要过于明确。总而言之,这是个人/团队的决定/意见。
彼得·提勒曼斯

4
@LoBo-我认为补偿潜在的知识不足并没有错。您不知道谁会一直维护您的代码。任何使您的代码更易于理解和/或可读性,而对性能几乎没有影响的事情,都是一件好事。
ferekdoley

9

布尔值是一个对象。因此,如果它是一个实例变量,它将为null。如果在方法中声明了它,则必须对其进行初始化,否则会出现编译器错误。

如果声明为基本类型,即布尔值。如果该值是实例变量(或类变量),则默认情况下为false。如果在方法中声明了它,则仍然必须将其初始化为true或false,否则会出现编译器错误。


6

未初始化的Boolean成员(实际上是对类型对象的引用Boolean)的默认值为null

未初始化boolean(原始)成员的默认值为false


4

没有的默认设置BooleanBoolean必须使用boolean或构造String。如果对象未初始化,则指向null

原始的默认值booleanfalse

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


我认为这3个否决票是因为您说“没有默认值”,这是一个不清楚的陈述。如您所说,未初始化的对象引用指向nullnull是默认设置,因此当您说没有一个时,我不确定您指的是什么。(您可能是说“ Boolean既不是true也不false是默认值”吗?)
Radiodef '18年

是的,您输入的内容更加准确。已经有一个更简洁的公认答案。我不确定将文章投下赞成票并对其进行编辑会带来什么好处。
Stealth Rabbi

1
为了澄清,我没有投票,我的编辑与我的评论完全无关。如果您同意该建议的措词,我建议编辑答案,然后我们可以删除我们的注释以进行清理。
Radiodef '18年

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时,在像这样调用getter并返回未分配的原始布尔值后,抛出NPE。这使我相信杰克逊正在接收一个null并尝试对其调用方法,因此调用了NPE。我错了。

故事的寓意是,当Java为原语分配内存时,即使未初始化该内存也具有一个值,对于布尔值,Java等于false。相比之下,当为未初始化的复杂对象(如布尔值)分配内存时,它仅分配用于对该对象的引用的空间,而不分配对象本身(内存中没有要引用的对象),因此解析该引用将导致null。

我认为严格来说,“默认为false”是不合理的。我认为Java在显式设置之前不会分配内存并将其分配为false值。我认为Java会分配内存,并且内存碰巧具有的任何值都与“ false”的值相同。但是出于实际目的,它们是同一回事。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.