【发布时间】:2016-03-22 17:27:24
【问题描述】:
class DemoClass {
public static void main(String args[]) {
System.out.println("Start");
A a=new D();
}
}
class A {
static {
System.out.println("Static A");
A c=new C();
}
public A() {
System.out.println("Constr A");
}
}
class B extends A {
static {
System.out.println("Static B");
}
public B() {
System.out.println("Constr B");
}
}
class C extends B {
static {
System.out.println("Static C");
}
public C() {
System.out.println("Constr C");
}
}
class D extends C {
static {
System.out.println("Static D");
}
public D() {
System.out.println("Constr D");
}
}
以上代码的执行顺序为:
Start
Static A
Constr A
Constr B
Constr C
Static B
Static C
Static D
Constr A
Constr B
Constr C
Constr D
在我看来,应该首先执行所有静态块,然后才会创建对象。但是,这里首先创建类 A 静态块中的对象“A c=new C()”,然后执行其他静态块。为什么?
【问题讨论】:
-
顺便说一句,我怀疑您可以用 3 个类或可能只用 2 个类来证明这一点,并且同样容易 - 并且更容易提供完整的事件列表。
标签: java execution static-block