我们是否可以假设 Java 中的默认数组值? 例如,假设 int 数组被设置为所有的零?

在实践中,我是否可以假设 Java 中的所有 int 数组都将从零开始填充?对于运行 JVM 的所有机器?

这对所有类型都适用吗? char? boolean? enum?

哪里有官方记录?

教科书上说 int 数组被设置为零,但是他们也建议我们写一个 for 循环把所有的值设置为零,只是为了“更清楚”。

67451 次浏览

是的。 Java 中的基本类型总是初始化为零。引用也被初始化为空。

Java Language Specification is the right place to look for such information:

数组组件 是未命名的变量,每当创建新的数组对象时,这些变量都会被创建并初始化为默认值(4.12.5)

默认值本身在 section 4.12.5中给出。

  • 对于 byte类型,默认值为零,即 (字节)0的值。
  • 对于 太短了类型,默认值为零,即 (short)0的值。
  • 对于 Int类型,默认值为零,即 0
  • 对于 long类型,默认值为零,即 0L
  • 对于 漂浮类型,默认值为正零,即 0.0 f
  • For type 双倍, the default value is positive zero, that is, 0.0 d.
  • 对于 Char类型,默认值是空字符,即 “ u0000”
  • 对于 布尔型类型,默认值是 假的
  • 对于所有引用类型,默认值为 null

Your textbook is wrong! Writing such code is pointless, and a waste of your time typing it and the computers time running it.

正如其他人所说,编译器保证给方法外的变量(类/实例变量)赋值0、 false 或 null。正如您可能知道的那样,编译器不会在方法值中给出变量,而是强制您在使用它们之前给它们一个值。

你会发现,如果你做的事情“正确”,大约90% -95% 的你的“变量”从来没有改变后,他们被赋予一个值。然而,新程序员倾向于这样做:

int x = 0;


// some code that never uses x


x = 5;


// more code that only reads x and never modifies it.

这样就不能将 x 标记为“ final”。如果您能够将 x 标记为“ final”,那么它可以防止意外修改该值,从而防止 bug。

我会这样写代码:

final int x;


// some code that never uses x


x = 5;


// more code that only reads x and never modifies it.

这被称为空白 final (一个在声明时没有值的 final 变量)。

如果您记得类/实例变量是由运行时初始化的,那么希望您不要编写用抛弃值初始化它们的代码,然后您可以将它们标记为 final。

我个人的做法是总是将所有内容标记为 final,直到我发现需要修改它,并且在知道变量的实际值之前,永远不要初始化它。这样做可以使代码更快(不明显,因为分配通常非常快)和更安全,因为我很少意外地修改一个值时,我不应该。

它应该是 Java 语言规范 < a href = “ http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html # jls-4.12.5”> 4.12.5变量的初始值 。而不是 4.5

"For type byte, the default value is zero, that is, the value of (byte)0.
对于 short 类型,默认值为0,即值(short)0。
对于 int 类型,默认值为0,即0。
对于 long 类型,默认值为0,即0L。
For type float, the default value is positive zero, that is, 0.0f.
对于 double 类型,默认值为正0,即0.0 d。
对于 char 类型,默认值为 null 字符,即“ u0000”。
对于布尔类型,默认值为 false。
对于所有引用类型(4.3) ,默认值为 null。”< br/>