import static net.mindview.util.Print.*;
class Insert{
private int i = printInit(" Insert.i initialized");;
protected int j;
Insert(){
print("i = "+i+", j ="+j);
j = 39;
}
private static int x1 = printInit("Static Insert.x1 initialized");
static int printInit(String s){
print(s);
return 47;
}
}
public class Beetle extends Insert{
private int k = printInit("Beetle.k initialized");
public Beetle(){
print("k = "+k);
print("j="+j);
}
private int h = printInit("Beetle.h initialized");
private static int x2 = printInit("Static Beetle.x2 initialized");
public static void main(String[] args){
print("Beetle constructor");
Beetle b = new Beetle();
}
}
在Beetle上运行Java时,第一件事就是试图访问Beetle.main()(一个static方法),于是加载器开始启动并找出Beetle类的编译代码(在名为Beetle.calss的文件之中),对它进行加载的过程中,编译器注意到它有一个基类
于是它继续进行加载,不管你是否打算产生一个该基类的对象,这都要发生。
如果该基类还有自身的基类,那么仍会递归加载,根基类中的static初始化即会被执行,然后是下一个导出类,因为导出类的static初始化可能会依赖于基类成员能否被正确初始化。
至此,必要的类已加载完毕,对象就可以被创建了,首先,对象中的所有基本类型都会被设为默认值,对象引用被设为null,然后基类的构造器会被调用。
输出结果:
Static Insert.x1 initialized
Static Beetle.x2 initialized
Beetle constructor
Insert.i initialized
i = 47, j =0
Beetle.k initialized
Beetle.h initialized
k = 47
网友评论