在实践中我可以假设Java中的所有int数组都会以零填充吗?对于运行JVM的所有机器?
这适用于所有类型吗?炭?布尔?枚举?
这在哪里正式记录?
我已经说过教科书将int数组设置为零,但他们也建议你应该编写一个for循环来将所有值设置为零只是“更清楚”。
答案 0 :(得分:135)
Java Language Specification是寻找此类信息的正确位置:
数组组件是未命名的变量,只要创建了一个新的数组对象,就会创建并初始化为默认值(第4.12.5节)
默认值本身在section 4.12.5中给出。
- 对于字节类型,默认值为零,即(字节)0 的值。
- 对于短类型,默认值为零,即(短)0 的值。
- 对于 int 类型,默认值为零,即 0 。
- 对于长类型,默认值为零,即 0L 。
- 对于 float 类型,默认值为正零,即 0.0f 。
- 对于 double 类型,默认值为正零,即 0.0d 。
- 对于 char 类型,默认值为空字符,即'\ u0000'。
- 对于布尔类型,默认值为 false 。
- 对于所有参考类型,默认值为 null 。
答案 1 :(得分:17)
是。 Java中的原始类型始终为零初始化。引用也初始化为null。
答案 2 :(得分:7)
它应该是Java语言规范 §4.12.5 Initial Values of Variables 。而不是§4.5.5
“对于类型字节,默认值为零,即(字节)0的值
对于short类型,默认值为零,即(short)0的值
对于int类型,默认值为零,即0
对于long类型,默认值为零,即0L
对于float类型,默认值为正零,即0.0f
对于double类型,默认值为正零,即0.0d
对于char类型,默认值为空字符,即'\ u0000'
对于boolean类型,默认值为false
对于所有引用类型(§4.3),默认值为null。“
答案 3 :(得分:4)
你的教科书错了!编写这样的代码毫无意义,浪费你的时间输入它和计算机运行它的时间。
正如其他人所说,编译器保证方法(类/实例变量)之外的变量的值为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标记为“最终”。如果你能够将x标记为“final”,那么它可以防止意外修改该值,从而防止错误。
我会写代码如下:
final int x;
// some code that never uses x
x = 5;
// more code that only reads x and never modifies it.
这称为空白最终(在声明时没有值的最终变量)。
如果你还记得运行时初始化了类/实例变量,那么你希望不会编写代码来使用丢弃值来初始化它们,然后你可以将它们标记为final。
我个人的做法是始终将所有内容标记为最终,直到我发现我需要修改它,并且永远不会初始化变量,直到我知道我希望它具有的实际值。这样做可以使代码更快(由于分配通常非常快,因此不会引人注意)并且更安全,因为我不应该在不应该修改值的情况下更加安全。