class Insect{
private int i = 9;
protected int j;
Insect(){
System.out.println("i = " + i + ", j = " + j);
j = 39;
}
private static int x1 = printInit("static Insect.x1 initialized");
static int printInit(String s) {
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect{
private int k = printInit("Beetle.k initialized");
public Beetle() {
System.out.println("k = " + k);
System.out.println("j = " + j);
}
private static int x2 = printInit("static Beetle.x2 initialized");
public static void main(String[] args) {
System.out.println("Beetle constructor");
Beetle b = new Beetle();
}
}
输出:
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i = 9, j = 0
Beetle.k initialized
k = 47
j = 39
先记录一个知识点,类在其任何static成员被访问时加载,构造器也是static方法,只是没有显示写出来。
在Beetle上运行Java时,所发生的第一件事情就是访问Beetle.main(),一个static方法,于是加载器开始启动并找出Beetle类的编译代码(在名为Beetle.class的文件中)。在对它进行加载的时候,编译器会发现其有个基类,于是开始加载基类。如果基类自身向上还存在基类,则继续向上加载类。如果把创建对象语句Beetle b = new Beetle();注释,因为还需要访问Beetle的static的main方法,还是会进行类加载,此时输出为:
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor