首先,我们看一个实际例子:

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块。