Java 静态初始化顺序

来源:互联网 发布:在淘宝网上买手机可靠吗 编辑:程序博客网 时间:2024/04/20 02:29

原帖:http://topic.csdn.net/u/20081031/20/6a66d680-fd4e-4ffd-808e-34cea79eb7d6.html

package NewPractice;

public class Test1 {
    public static int k = 0;
    public static Test1 t1 = new Test1("t1");
    public static Test1 t2 = new Test1("t2");
    public static int i = print("i");
    public static int n = 99;
    public int j;
   
    static {
        print("aa static");
    }

    public Test1(String str) {
        j = print("j");
        print("aa constructor");
        System.out.println((++k) + ":  " + str + " i=" + i + " n=" + n);
        ++i;
        ++n;
    }

    public static int print(String str1) {
        System.out.println((++k) + ":  " + str1 + " i=" + i + " n=" + n);
        ++n;
        return ++i;
    }

    public static  void main(String[] strings) {
    }
}



输出:
1:  j i=0 n=0
2:  aa constructor i=1 n=1
3:  t1 i=2 n=2
4:  j i=3 n=3
5:  aa constructor i=4 n=4
6:  t2 i=5 n=5
7:  i i=6 n=6
8:  aa static i=7 n=99


问题:i和n到底是什么时候声明的,public static Test1 t1=new Test1("t1");这句会去执行构造块和构造方法,但是这时候public static int i=print("i");并没执行,i是哪里出来的?它是按顺序先声明所有变量然后才从头再挨个赋值吗?

原因是:类的生命周期分为如下几个阶段,Loading,Linking,Initialization.

Loading之后会对class文件进行Verification(验证).
然后是Preparation阶段,注意在这个阶段所有的类变量 (class变量),会被默认初始化,int,long,short,浮点等基本类型初始化为0,引用初始化为null,boolean被初始化为 false.也就是到这个阶段各个static变量已经有默认的值了;
后面会进入Resolution阶段,然后才是初始化( Initialization),
这个阶段会执行static初始化,把变量初始化为你指定的值.也就是在这个阶段k=0;Test1 t1=new Test1("t1");
才开始执行的,这时候i=print("i");还没有执行到,i仍然取在 Preparation阶段得到的默认值0.

 

参考: 深入java虚拟机
http://www.artima.com/insidejvm/ed2/lifetype.html