class Insect{
int i=9;
int j;
Insect(){
prt("i="+i+", j="+j);
j=39;
}
static int x1=
prt("static Insect.x1 initialized");
static int prt(String s){
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect{
int k =prt("Beetle.k initilized");
Beetle(){
prt("k="+k);
prt("j="+j);
}
static int x2=
prt("static Beetle.x2 initialized");
static int prt(String s){
System.out.println(s);
return 63;
}
public static void main(String[] args){
prt("Beetle constructor");
Beetle b= new Beetle();
}
}
对Beetle运行Java的时候,发生的第一件事情就是装载程序到外面去找那个类,就是找到Insect这个类,在装载的过程中,装载程序会首先根据关键词EXTENDS,将要继承的类载入进来,无论是否准备生成那个基础的类的一个对象,这个过程都是会发生的。
这是一个递归的过程,假如我们需要继承的类,也继承了一个类那么同样的也会导入,接下来会在根基础类首先执行static的初始化,static的意义就是强调这个对象只有一个。之后再在下一个衍生类执行static的初始化过程,以此类推。保证这个顺序是十分关键的,因为衍圣雷的初始化要依赖与对基础类成员的正确初始化,这也是一个连锁反应。
此时,必要的类已经初始化完毕后,能够创建对象了。首先,这个对象中的所有基本数据类型都会设定成他们的默认值,而将对象句柄设置成Null。随后会调用基础类的构建器。在这个情况下,调用是自动进行的。但也可以使用super来自行指定构建器调用。这个处理过程所有的类都是一样的,基础构建器构建完成之后,实例变量会按本来的顺序得以初始化。最后执行构建器剩余的主体部分。
运行结果:顺序很重要
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i=9, j=0
Beetle.k initilized
k=63
j=39