【发布时间】:2015-02-08 06:57:07
【问题描述】:
public class Dog {
public static Dog dog = new Dog();
static final int val1 = -5;
static int val2 = 3;
public int val3;
public Dog() {
val3 = val1 + val2;
}
public static void main(String[] args) {
System.out.println(Dog.dog.val3);
}
}
输出为-5
从这个结果来看,val2 的初始化似乎是在dog 成员及其实例化完成之前。
为什么这个顺序是这样的?
【问题讨论】:
-
可能是先声明最终字段(可能是因为它们在 java 字节码中的存储方式不同),然后按照您编写它们的顺序声明非最终字段。如果这是正确的,那么在声明
Dog实例时,val1将为 -5,但 val2 仍设置为默认值 0。 -
这是因为在类加载时会先加载final变量,然后再按声明的顺序加载剩余的静态变量。有关更多说明,请参阅stackoverflow.com/questions/12448465/…
-
final int 使 int 成为 compile-time 常量。