【发布时间】:2014-09-15 15:15:53
【问题描述】:
class abc {
int a = 0;
static int b;
static abc h = new abc(); //line 4
public abc() {
System.out.println("cons");
}
{
System.out.println("ini");
}
static {
System.out.println("stat");
}
}
public class ques {
public static void main(String[] args) {
System.out.println(new abc().a);
}
}
当我编写这段代码时,我得到的输出是这样的:
ini
cons
stat
ini
cons
0
在这里,当我在main(), class abc 中创建一个新对象时,已加载并static 变量和块按写入顺序执行。当控制到达第 4 行时,static abc h = new abc(); 调用实例初始化块。为什么?为什么在第 4 行创建新对象时不调用静态块,直到那时静态块也没有被调用一次,所以根据惯例应该调用静态块。为什么会出现这种意外输出?
【问题讨论】:
-
静态代码只运行一次,所以当第二个对象被创建时(在第一个对象内)它不会被执行。我很惊讶
ini在此时执行。 -
@DavidPostill- 标记的帖子清除了静态初始化通常如何发生的概念。但我的主要问题是为什么在第 4 行没有调用静态块,而是调用了实例初始化块。
-
当我调试你的代码时,我可以看到在第 4 行调用了静态块,这是由于静态初始化而调用它的唯一地方。如果删除静态成员,首先调用静态块。
-
@Duncan 我只是想让实例初始化程序更容易看到,但如果你这么说我不会争论。回想起来,您实际上是对的,我应该添加 1 个换行符而不是 2 个。
标签: java static initialization