鍍金池/ 問(wèn)答/Java  網(wǎng)絡(luò)安全/ java程序的執(zhí)行順序

java程序的執(zhí)行順序

請(qǐng)問(wèn)各位大神下面這段代碼的執(zhí)行順序,一直想不明白到底是怎么個(gè)執(zhí)行順序,希望有大佬給予解答,萬(wàn)分感謝~
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("構(gòu)造塊");
}
static{
    print("靜態(tài)塊");
}
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");
}

}

下面是運(yùn)行后的結(jié)果:
1:j i=0 n=0
2:構(gòu)造塊 i=1 n=1
3:t1 i=2 n=2
4:j i=3 n=3
5:構(gòu)造塊 i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:靜態(tài)塊 i=7 n=99
9:j i=8 n=100
10:構(gòu)造塊 i=9 n=101
11:init i=10 n=102

回答
編輯回答
雨蝶

java代碼執(zhí)行順序,了解過(guò)jvm類(lèi)加載機(jī)制的應(yīng)該就會(huì)知道,一個(gè)類(lèi)在加載過(guò)程中會(huì)先加載靜態(tài)的方法和變量,所以上面的代碼最先執(zhí)行的應(yīng)該是static代碼塊,至于這個(gè)mian方法的話(huà)我不清楚他和其他的static代碼的加載順序關(guān)系,有不對(duì)的地方還請(qǐng)指出

2017年12月25日 07:13
編輯回答
下墜

其實(shí)這段代碼不難以理解,只需要注意一下幾點(diǎn):靜態(tài)變量只會(huì)初始化一次,在初始化的時(shí)候int會(huì)被賦值為0
所以也就意味著在這個(gè)靜態(tài)變量只會(huì)在第一次加載該類(lèi)的時(shí)候運(yùn)行。

然后看代碼:
注意在main方法中 該類(lèi) 已經(jīng) 第一次初始化了,也就是下面這段代碼:

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

隨后main方法中類(lèi) e 初始化的時(shí)候首先會(huì)初始化靜態(tài)變量:如下代碼

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

當(dāng)執(zhí)行到第二行的時(shí)候會(huì)再次加載類(lèi),那么此時(shí)由于該類(lèi)已經(jīng)加載過(guò)一次了,所以在初始化 e1 的時(shí)候不會(huì)再去加載靜態(tài)變量了,那么e1所能初始化的代碼如下:

public int j=print("j");

    {
        print("構(gòu)造塊");
    }
    public Test1(String str){
        System.out.println((++k)+":"+str+"  i="+i+"   n="+n);
        ++i;
        ++n;
    }

所以你會(huì)看到首先打印出來(lái)的是:

1:j  i=0   n=0
2:構(gòu)造塊  i=1   n=1
3:t1  i=2   n=2

當(dāng)public static ExeOrder1 e1 = new ExeOrder1("t1");這行代碼執(zhí)行完畢,返回并且繼續(xù)執(zhí)行main方法里面的類(lèi)繼續(xù)初始化??梢苑Q(chēng)之為 e1 的初始化已經(jīng)結(jié)束,但是 e 還在初始化。

同理執(zhí)行e2的初始化,e2初始化的時(shí)候,所執(zhí)行的代碼如下:

public int j=print("j");

   {
       print("構(gòu)造塊");
   }
   public Test1(String str){
       System.out.println((++k)+":"+str+"  i="+i+"   n="+n);
       ++i;
       ++n;
   }

所以現(xiàn)在控制臺(tái)打印的是:

1:j  i=0   n=0
2:構(gòu)造塊  i=1   n=1
3:t1  i=2   n=2
4:j  i=3   n=3
5:構(gòu)造塊  i=4   n=4
6:t2  i=5   n=5

此時(shí)e2 執(zhí)行完畢。繼續(xù)返回執(zhí)行e的初始化,然后依次執(zhí)行:

public static int i = print("i");
public static int n=99;
static{       //初始的時(shí)候靜態(tài)塊優(yōu)先
    print("靜態(tài)塊");
}
public int j=print("j");  //然后便是非靜態(tài)變量
{
    print("構(gòu)造塊");
}
public ExeOrder1(String str){  //最后構(gòu)造器
    System.out.println((++k)+":"+str+"  i="+i+"   n="+n);
    ++i;
    ++n;
}

所以最終看到的便是如下結(jié)果:

1:j  i=0   n=0
2:構(gòu)造塊  i=1   n=1
3:t1  i=2   n=2
4:j  i=3   n=3
5:構(gòu)造塊  i=4   n=4
6:t2  i=5   n=5
7:i  i=6   n=6
8:靜態(tài)塊  i=7   n=99
9:j  i=8   n=100
10:構(gòu)造塊  i=9   n=101
11:init  i=10   n=102
2017年5月1日 00:22
編輯回答
陌離殤

閱讀以下這篇文章你就明白了。鏈接描述

2017年6月9日 00:25