关于java程序运行过程中先后顺序如下实例可以很轻松的帮助理解,首先先看下面例子:
package test;
import static test_1.PrintDome.*;
public class StaticAndCoustor extends LittleBug{
public static void main(String[] args) {
// TODO Auto-generated method stubs
print("mian function");
StaticAndCoustor staticAndCoustor = new StaticAndCoustor();
}
}
class Insert{
private int numberOne=9;
private static int numberTwo=printInt("Insert.static.numberTwo");
Insert(){
print("Insert courstor");
print("numberOne="+numberOne);
print("numberTwo="+numberTwo);
}
}
class Beetle extends Insert{
private int numberThr=8;
private static int numberFour=printInt("Beetle.static.numberFour");
Beetle(){
print("Beetle courstor");
print("numberThr="+numberThr);
print("numberFour="+numberFour);
}
}
class LittleBug extends Beetle {
private int numberFiv=8;
private static int numberSix=printInt("Beetle.static.numberSix");
LittleBug(){
print("LittleBug courstor");
print("numberFiv="+numberFiv);
print("numberSix="+numberSix);
}
}
在StaticAndCoustor 上运行java时,首先第一件事情就是试图访问StaticAndCoustor.main()方法(static方法),于是加载器开始找出StaticAndCoustor.class文件,在加载它的时候,编译器会发现,它向上有一个基类(由extends 知道),于是将继续记载基类,不管是否要new一个积累对象,积累都会被加载。
当加载到基类时,又会发现再往上有第二个基类,于是开始加载第二个基类,依次往上加载。。。当加载到根基类时,根基类中的static将会被初始化(本列中Insert为根基类),也就是被执行,然后是下一级子类中的static,以此类推。
所有的运行时用的类被加载完成,接下来,mian函数中会向下执行 print("mian function");之后执行到创建对象时,所有的基本类型被初始化为默认值,对象为null(这是通过编译器对对象内存进行二进制零实现的)。然后完成构造器的创建,构造器创建也是从根基类,一级一级往下创建。
以上程序返回结果如下:
--------------------------------------------------------------------------
Insert.static.numberTwo
Beetle.static.numberFour
Beetle.static.numberSix
mian function
Insert courstor
numberOne=9
numberTwo=0
Beetle courstor
numberThr=8
numberFour=0
LittleBug courstor
numberFiv=8
numberSix=0