这里我们主要讨论下静态初始化块这种情况。
静态初始化块是在类被加载的时候就执行的一块程序,并且一直存在直到程序关闭。也就是说当程序被执行,即classloader将该java程序编译后的class文件加载后,就能执行到静态初始化块这段程序;当程序关闭,我的个人理解也就是java.exe进程被结束的时候,静态初始化块结束(例如在静态初始化块里对一个类的静态变量进行赋值,该变量一直存在到程序关闭)。
下面我们来举例说明:
public class Test {
//静态变量
public static String testStatic = "testStatic";
//静态初始化块
static {
System.out.println(testStatic);
System.out.println("Proc begin");
testStatic = "testProc";
System.out.println("Proc end");
}
//主方法
public static void main(String[] args) {
System.out.println(testProc);
System.out.println("main begin");
System.out.println("main end");
}
}
执行main方法输出结果:
testStatic
Proc begin
Proc end
testProc
main begin
main end
也就是说当JVM将要执行main方法的时候,先要将Test.class加载到JVM中,此时就执行了静态初始化块中的程序;然后再执行执行main方法中的程序。这个例子没有将这个类实例化,所以没有用到构造函数。倘若需要实例化该类的时候,则构造方法的执行顺序也是在静态初始化块之后的。
最后我们可以得出这么一个结论:Java类的执行优先顺序
该类的静态变量->该类的静态初始化块->该类的构造方法
若存在父类的情况下则是:
父类的静态变量->父类的静态初始化块->子类的静态变量->子类的静态初始化块