【问题标题】:Empty arrays automatically initialize contents?空数组自动初始化内容?
【发布时间】:2012-10-31 20:44:26
【问题描述】:

怎么会

int alone;
System.out.println(alone);

给出错误但是

 int[] arr = new int[1];
 System.out.println(arr[0]);

等于 0? 当你初始化一个空数组时,它是否会自动将其内容初始化为0(或null等)?

【问题讨论】:

    标签: java arrays initialization declaration


    【解决方案1】:

    来自the language standard

    否则,将创建一个指定长度的一维数组,并将数组的每个组件初始化为其默认值(§4.12.5)。

    而默认值为:

    • 对于byte类型,默认值为0,即(byte)0的值。

    • 对于short类型,默认值为0,即(short)0的值。

    • 对于int类型,默认值为0,即0。

    • 对于long类型,默认值为0,即0L。

    • 对于float类型,默认值为正零,即0.0f。

    • 对于double类型,默认值为正零,即0.0d。

    • 对于char类型,默认值为空字符,即'\u0000'。

    • 对于布尔类型,默认值为false。

    • 对于所有引用类型 (§4.3),默认值为 null。

    【讨论】:

      【解决方案2】:

      是的,对于原始类型(布尔和字符除外),它将默认为零。如果是对象类型,则默认为null

      这个java tutorial 可以帮助你。

      注意:正如 woot4Moo 回答的那样,这仅适用于实例变量。如果是局部变量,那么它不会默认为任何。

      【讨论】:

      • 不正确,布尔值未初始化为零。 char 也不会初始化为零。
      • 实例数组变量与局部数组变量没有区别,因为调用new时会发生这种初始化。我认为new 没有任何方法可以区分实例变量和局部变量。
      • @Code-Guru 区别不一定是数组,而是原始类型,正如 OP 问题的第一部分所引用的那样。
      • 我认为实例变量是类中的变量。从 Woot4Moo/Nambari 的编辑看来,它们不包括布尔值和字符。
      • @onepiece 实例变量是那些被声明为在函数声明之外的类的一部分。
      【解决方案3】:

      是的,对于基本类型number arrays,它初始化为0,对于boolean[],它初始化为false,对于char[],它初始化为NULL(ASCII value 0),对于objects [] including String[],它初始化为null.

      【讨论】:

      • @BheshGurung 当我更正时,我得到了两张反对票。非常快:)
      • 他在 0 上的数字不正确,有浮点数和双精度数得到 0.0
      • @BheshGurung:更新了几种基本类型,包括布尔和字符。
      • @Woot4Moo:对于浮点数或双精度数,0 的意思是 0.0,就好像你说 float f = 0;并打印 f,它将打印 0.0.
      • 一切都已被原谅,只要允许,我就是要完整。
      【解决方案4】:

      这里涉及两个不同的类似问题。首先请注意,所有变量类型都有一个默认值,该值因类型而异。至少有两次使用这些默认值:1) 声明成员变量和 2) 使用 new 运算符初始化数组。

      请注意,如果您只是声明一个局部数组变量而不使用new 对其进行初始化,那么您会得到与声明一个简单的int 变量时相同的错误。这是因为必须初始化所有局部变量。它们没有自动获得默认值。

      另一方面,成员变量确实有一个默认值。同样,当您使用new 运算符创建数组对象时,数组的元素会被初始化为适当的默认值。

      【讨论】:

        【解决方案5】:

        这取决于它的声明位置(在函数内部的类中)。如果它是类成员变量,它将被初始化为其默认值。数字类型为 0(浮点类型/双精度类型为 0.0),字符串为 null,布尔为 false,对象为 null。如果它在函数内部声明,则在 int alone 的情况下它将保持未初始化状态。就数组而言,它将始终初始化其中包含的值。

        【讨论】:

        • 请注意,在使用 new 显式初始化数组本身之后,OP 会询问数组的 元素。这与成员变量在声明时获取默认值不同。
        • 我还在输入我的评论 =p
        • @Code-Guru :) 。请注意,问题有两个部分。 OP 询问为什么 int alone... 给出错误但数组没有。对未来的读者和 OP 进行区分是有价值的。此外,该问题没有解释这两个声明存在于何处,因此它们必须是函数的一部分。
        • 也许您可以在回答中澄清这一点。例如,当您说“在哪里初始化 it”时,我现在认为您的意思是“在哪里声明了变量”。第一次阅读您的答案时,我没有得到这种解释。
        • @Code-Guru 我可以看到混乱。我会更新以有更清晰的措辞。
        猜你喜欢
        • 2017-07-21
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 2016-10-13
        • 2021-07-25
        • 2020-02-23
        • 1970-01-01
        相关资源
        最近更新 更多