Java静态变量初始化时机
阅读原文时间:2021年04月20日阅读:1

静态变量初始化方式:

1.声明时初始化;

2.静态块中初始化;

测试:

package com.skymr.learn;
/**
 * 静态变量初始化顺序测试
 * @author skymr
 *
 */
public class InstanceTest2 {

    static int b = 11;

    static{
        a = 20;
        b = 22;
    }

    static int a = 10;

    public static void main(String[] args) throws Exception{
        System.out.println("a="+InstanceTest2.a);
        System.out.println("b="+InstanceTest2.b);
    }
}

结果:

a=10
b=22

测试证明:1,2的先后顺序依靠代码的前后排列

问题:静态变量的初始化是什么时候开始的呢?

package com.skymr.learn;
/**
 * 静态变量初始化顺序测试
 * @author skymr
 *
 */
public class InstanceTest2 {

    static int b = 11;

    static{
        System.out.println("静态块");
        a = 20;
        b = 22;
    }

    static int a = 10;

    public static void nop(){
    }

}

Main方法移出来了

package com.skymr.learn;


public class MainTest {
public static void main(String[] args) throws Exception{
System.out.println("main方法开始"); //step1
InstanceTest2.nop();//step2
System.out.println("main方法开始--");//step3
System.out.println("a="+InstanceTest2.a);
System.out.println("b="+InstanceTest2.b);
}
}

打印结果:

main方法开始
静态块
main方法开始--
a=10
b=22

分析:执行step1时InstanceTest2类还没有装载进内存,也就没有运行它的静态块代码;

   当调InstanceTest2.nop方法时,开始将InstanceTest2类载入内存,装载完成后开始自动运行静态变量的声明代码和静态块

          也就是说静态变量是在载入内存后初始化的;
再一示例:

package com.skymr.learn;

public class InstanceTest3 {


    public static void main(String[] args){
        Person son = new Person(5);
        System.out.println(son.parent.value);
        System.out.println(son.value);
    }
}

class Person{
    final static Person parent = new Person(2); //1
    static int age = 30; //2
    int value;
    public Person(int delta){
        value = age + delta;
    }
}

打印 出:

2
35

分析:new Person时最先执行 1,此时age=0, 所以son.parent.value = 0 + 2 = 2;
     执行完2后,才会进行son的构造方法,所以age = 30;value也就为35了.