首先,我们看一个实际例子:
class Test{ public static int X=100; public final static int Y=200; public Test(){ System.out.println("Test构造函数执行"); } static{ System.out.println("static语句块执行"); } public static void display(){ System.out.println("静态方法被执行"); } public void display_1(){ System.out.println("实例方法被执行"); } } public class StaticBlockTest { public static void main(String args[]) { Test t = new Test();
new Test(); } }
程序的输出为:
static语句块执行
Test构造函数执行
Test构造函数执行
实际上,static块的执行发生在“初始化”的阶段。初始化阶段,jvm主要完成对静态变量的初始化,静态块执行等工作。不初始化则不会执行static块。
需要注意的一点是:非static变量不可以置于static块中。
一、静态变量的初始化
public class Test { static { _i = 20; } public static int _i = 10; public static void main(String[] args) { System.out.println(_i); } }
代码输出:10
public class Test { public static int _i = 10; static { _i = 20; } public static void main(String[] args) { System.out.println(_i); } }
代码输出:20
结论:我们要注意到这两个输出不同的区别仅在于static变量与static块的位置不一样。也就是说对于静态变量,它的初始化按照顺序初始化。
问题2:JDK如何处理static块
类定义中可以存在多个static块吗?回答是可以。如:
public class Test { public static int _i; static { _i = 10; } static { _i = 20; } public static void main(String[] args) { System.out.println(_i); } }
输出结果:20
输出符合问题一得出的结论。
结论:不仅类定义中可以有多个static块,而且在编译时编译器会将多个static块按照代码的前后位置重新组合成一个static块。