为了澄清对静态的误解 - 我将简单地参考这一小段代码:
public class Foo {
{ System.out.println("Instance Block 1"); }
static { System.out.println("Static Block 1"); }
public static final Foo FOO = new Foo();
{ System.out.println("Instance Block 2"); }
static { System.out.println("Static Block 2 (Weird!!)"); }
public Foo() { System.out.println("Constructor"); }
static public void main(String p[]) {
System.out.println("In Main");
new Foo();
}
}
惊喜的是输出如下:
Static Block 1
Instance Block 1
Instance Block 2
Constructor
Static Block 2 (Weird!!)
In Main
Instance Block 1
Instance Block 2
Constructor
请注意,我们有一个在两个实例之后static {}
调用的。发生这种情况是因为我们在中间抛出了构造函数,在第一次调用构造函数时插入了执行顺序。{}
在我处理这个答案时发现了这一点 - https://stackoverflow.com/a/30837385/744133。
基本上我们观察到这种情况发生:
在第一次初始化对象期间,根据出现的顺序为静态和实例初始化混合初始化当前对象
对于所有接下来的初始化,仅按发生顺序进行实例初始化,因为静态初始化已经发生。
我需要研究继承的混合,以及对 super 的显式和隐式调用,这将如何影响这一点,并将根据发现进行更新。它可能与其他提供的答案相似,只是他们在静态初始化时弄错了。