java程序的执行顺序

请问各位大神下面这段代码的执行顺序,一直想不明白到底是怎么个执行顺序,希望有大佬给予解答,万分感谢~
public class ExeOrder1 {

public static int k=0;
public static ExeOrder1 e1 = new ExeOrder1("t1");
public static ExeOrder1 e2 = new ExeOrder1("t2");
public static int i = print("i");
public static int n=99;
public int j=print("j");

{
    print("构造块");
}
static{
    print("静态块");
}
public ExeOrder1(String str){
    System.out.println((++k)+":"+str+"  i="+i+"   n="+n);
    ++i;
    ++n;
}

public static int print(String str){
    System.out.println((++k)+":"+str+"  i="+i+"   n="+n);
    ++n;
    return ++i;
}
public static void main(String[] args){
    ExeOrder1 e=new ExeOrder1("init");
}

}

下面是运行后的结果:
1:j i=0 n=0
2:构造块 i=1 n=1
3:t1 i=2 n=2
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=99
9:j i=8 n=100
10:构造块 i=9 n=101
11:init i=10 n=102

阅读 2.1k
3 个回答

java代码执行顺序,了解过jvm类加载机制的应该就会知道,一个类在加载过程中会先加载静态的方法和变量,所以上面的代码最先执行的应该是static代码块,至于这个mian方法的话我不清楚他和其他的static代码的加载顺序关系,有不对的地方还请指出

其实这段代码不难以理解,只需要注意一下几点:静态变量只会初始化一次在初始化的时候int会被赋值为0
所以也就意味着在这个静态变量只会在第一次加载该类的时候运行。

然后看代码:
注意在main方法中 该类 已经 第一次初始化了,也就是下面这段代码:

public static void main(String[] args){
    ExeOrder1 e=new ExeOrder1("init"); //注意,第一次初始化在这里。
}

随后main方法中类 e 初始化的时候首先会初始化静态变量:如下代码

public static int k=0;
public static ExeOrder1 e1 = new ExeOrder1("t1");

当执行到第二行的时候会再次加载类,那么此时由于该类已经加载过一次了,所以在初始化 e1 的时候不会再去加载静态变量了,那么e1所能初始化的代码如下:

public int j=print("j");

    {
        print("构造块");
    }
    public Test1(String str){
        System.out.println((++k)+":"+str+"  i="+i+"   n="+n);
        ++i;
        ++n;
    }

所以你会看到首先打印出来的是:

1:j  i=0   n=0
2:构造块  i=1   n=1
3:t1  i=2   n=2

public static ExeOrder1 e1 = new ExeOrder1("t1");这行代码执行完毕,返回并且继续执行main方法里面的类继续初始化。可以称之为 e1 的初始化已经结束,但是 e 还在初始化。

同理执行e2的初始化,e2初始化的时候,所执行的代码如下:

public int j=print("j");

   {
       print("构造块");
   }
   public Test1(String str){
       System.out.println((++k)+":"+str+"  i="+i+"   n="+n);
       ++i;
       ++n;
   }

所以现在控制台打印的是:

1:j  i=0   n=0
2:构造块  i=1   n=1
3:t1  i=2   n=2
4:j  i=3   n=3
5:构造块  i=4   n=4
6:t2  i=5   n=5

此时e2 执行完毕。继续返回执行e的初始化,然后依次执行:

public static int i = print("i");
public static int n=99;
static{       //初始的时候静态块优先
    print("静态块");
}
public int j=print("j");  //然后便是非静态变量
{
    print("构造块");
}
public ExeOrder1(String str){  //最后构造器
    System.out.println((++k)+":"+str+"  i="+i+"   n="+n);
    ++i;
    ++n;
}

所以最终看到的便是如下结果:

1:j  i=0   n=0
2:构造块  i=1   n=1
3:t1  i=2   n=2
4:j  i=3   n=3
5:构造块  i=4   n=4
6:t2  i=5   n=5
7:i  i=6   n=6
8:静态块  i=7   n=99
9:j  i=8   n=100
10:构造块  i=9   n=101
11:init  i=10   n=102
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏