public class Ex23 extends B{
//3 (i,j,k ==1
static int k = printInit("Ex23 k initializer");
Ex23(){
System.out.println("Ex23 constructor");
}
public static void main(String args[]){
//4
System.out.println("hi");
//
System.out.println(new A());
System.out.println(C.a);
D d = new D();
}
}
class D{
D(){
//10
System.out.println("D constructor");
}
}
class C{
//7 (k == 1
static int k = printInit("k initializer");
static A a = new A();
static int printInit(String s){
System.out.println(s);
return 1;
}
}
class B extends A{
//2
static int j = printInit("j initializer");
B(){
System.out.println("B constructor");
}
}
class A{
//1
static int i = printInit("i initializer");
static int printInit(String s){
System.out.println(s);
return 1;
}
A(){
//5
//8
System.out.println("A constructor()");
}
@Override
//6
//9
public String toString(){
return "A toString";
}
}
控制台输出顺序为
i initializer
j initializer
Ex23 k initializer
hi
A constructor()
A toString
k initializer
A constructor()
A toString
D constructor
由此可见,类的加载仅在该类的第一个实例的创建或者对static成员的访问时才发生。