楼主不要纠结,只要记住以下两句话就可以搞定静态初始化顺序:
1、加载类字节码后,程序会在方法区开辟空间。并对空间进行默认初始化。(这里初始化的值不是你代码里写的值,而是虚拟机默认的值)
2、static的执行,是按照代码书写顺序,自上而下执行的。
以如下代码为证:
- class StaticTest1 {
- //代码块在前(这边看起来是执行在前,定义在后,静态初始化这种情况下是被允许的)
- static {
- num = 1;
- }
- //静态变量初始化在后
- static int num = 0;
- }
- class StaticTest2 {
- //静态变量初始化在前
- static int num = 0;
- //代码块在后
- static {
- num = 1;
- }
- }
- public class Test {
- public static void main(String[] args) {
- //这边输出结果为0,说明是“静态变量初始化”最后一次修改了变量值
- System.out.println(StaticTest1.num);
- //这边输出结果为1,说明是“静态代码块”最后一次修改了变量值
- System.out.println(StaticTest2.num);
- }
- }
复制代码 |