java初始化顺序

来源:互联网 发布:程序员怎么找兼职 编辑:程序博客网 时间:2024/06/07 16:31
public class Test {public static int k=0; public static Test t1=new Test("t1"); //public static Test t2=new Test("t2");public static int i=print("i"); public static int n=99; private int a=0; private int j = print("j");{ print("构造块"); } static{ print("静态块"); } public Test(String str){ System.out.println("a"+(++k)+":"+str+" i="+i+" n="+n); ++i;++n; } public static int print(String str){ System.out.println("b"+(++k)+":"+str+" i="+i+" n="+n); ++n; return++i; } public static void main(String args[]) { //Test t=new Test("init"); } }


输出结果:
b1:j i=0 n=0
b2:构造块 i=1 n=1
a3:t1 i=2 n=2
b4:i i=3 n=3
b5:静态块 i=4 n=99
初始化顺序为(静态变量-->静态方法) -->(成员变量-->成员方法)-->构造方法;
但是此处静态变量中 有实例化语句的存在:public static Test t1=new Test("t1"); 此时java虚拟机加载类初始化时执行到这句就会实例化Test类,由此输出b1:j i=0 n=0和b2:构造块 i=1 n=1!
Q:此时会问为什么没执行静态变量和方法呢?
A:这是因为静态变量和方法只会初始化一次
简单来说静态变量和静态代码块优先执行,而在静态变量和静态代码块中的方法不会再去执行类中的静态变量和静态代码块,静态的东西都只加载一遍,所以是先加载public static Test t1=new Test("t1"); 而在实例化过程中不会再去加载静态的变量和代码块,以此类推


另外,说一下:
对于类中的各代码的执行顺序:静态变量在类编译时全部初始化,非静态变量仅在实例化时才初始化
严格的说,静态变量是在类被加载到java虚拟机时,被初始化的,和编译没有关系。
0 0
原创粉丝点击