【问题标题】:Default value of 'boolean' and 'Boolean' in JavaJava中'boolean'和'Boolean'的默认值
【发布时间】:2011-09-07 18:01:27
【问题描述】:

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

【问题讨论】:

    标签: java boolean default-value


    【解决方案1】:

    Boolean 没有默认值。 Boolean 必须使用 booleanString 构造。如果对象未初始化,它将指向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 次投反对票是因为您说“没有默认值”,这是一个相当不清楚的陈述。正如您所说,未初始化的对象引用指向nullnull 是默认设置,所以当您说没有时,我不确定您指的是什么。 (您的意思可能是“Boolean 既不是true 也不是false 默认情况下”?)
    • 是的,你写的更准确。已经有一个更简洁的公认答案。我不确定通过对帖子投反对票和对其进行编辑可以获得什么。
    • 澄清一下,我没有投反对票,我的编辑与我的评论完全无关。如果您同意建议的措辞,我建议您编辑答案,然后我们可以删除我们的 cmets 进行清理。
    • 此答案包含误导性/部分错误信息,应在当前状态下对其进行否决/删除。
    • @improbable 什么是误导/部分错误?你能澄清一下吗?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      任何Object(如Boolean)的默认值为null

      boolean 的默认值为 false。

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

      boolean -> false
      
      byte, char, short, int, long -> 0
      
      float, double -> 0.0
      

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

      【讨论】:

      • 我认为可以提到BooleanObject,这会使第一行的含义显而易见。这听起来很基本,但对于提出这样一个基本问题的人来说,它可能会有所帮助。
      【解决方案4】:

      Boolean(对象)的默认值为null
      default valueboolean(原始)是 false

      【讨论】:

      • 请加官方来源link
      【解决方案5】:

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

      原语boolean 的值为假,如here 所示。

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

      【讨论】:

      • 感谢官方参考。至于初始化,没有必要弥补知识的不足。
      • '缺乏知识'意味着有一些预期的水平可以比较。如果这个最低知识水平是明确的,我同意。如果不是这样,我发现更明确的错误是谨慎的。总之,这是一个相当个人/团队的决定/意见。
      • @LoBo - 我认为补偿潜在的知识不足并没有错。你不知道谁会维护你的代码。任何能让你的代码更容易理解和/或可读性,同时对性能影响很小的东西都是一件好事。
      • 我同意@Lobo 的观点。您应该假设您未来的代码阅读器知道如何编写 Java 代码。在代码中解释 Java 的工作原理是一个坏主意。这就是 stackoverflow 的用途。
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

        (来源:Java Primitive Variables

        布尔值
        可以是代表truefalseBoolean 对象, 可以是null
        默认值为null

        【讨论】:

          【解决方案8】:
          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
          

          这似乎很明显,但我遇到过这样一种情况,Jackson 在将对象序列化为 JSON 时,在调用 getter 后抛出了一个 NPE,就像这个一样,它返回一个未分配的原始布尔值。这让我相信杰克逊正在接收一个空值并试图在它上面调用一个方法,因此是 NPE。我错了。

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

          我认为严格来说,“默认为 false”有点离题。我认为Java在明确设置之前不会分配内存并为其分配一个false值;我认为 Java 分配内存,内存恰好具有的任何值都与“false”的值相同。但实际上,它们是一回事。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-11
            • 1970-01-01
            • 2020-01-21
            • 2013-01-29
            • 1970-01-01
            • 2013-09-18
            相关资源
            最近更新 更多