問以下程序打印出什么內容:
問題及解析如下:
/** * 加載方法不等於執行方法,初始化變量則會賦值 * 類加載順序應為 加載靜態方法-初始化靜態變量-執行靜態代碼塊 * 實例化時 先加載非靜態方法-實例化非靜態變量-執行構造代碼塊-執行構造函數 * @author panteng * */ public class StaticTest { /**第一個加載*/ public static int k = 0; /**第二個加載,因為是new一個實例, * 首先初始化j 打印出 1:j i=0 n=0 * 執行構造塊 打印出 2:構造快 i=1 n=1 * 執行構造方法 打印出 3:t1 i=2 n=2 * 實例化完成 */ public static StaticTest t1 = new StaticTest("t1"); /**第三個加載 過程同上 * 首先初始化j 打印出 4:j i=3 n=3 * 執行構造塊 打印出 5:構造快 i=4 n=4 * 執行構造方法 打印出 6:t2 i=5 n=5 */ public static StaticTest t2 = new StaticTest("t2"); /**第四個加載 * 打印出 7:i i=6 n=6 */ public static int i = print("i"); /** * 第五個加載 */ public static int n = 99; /** * 此變量在類加載的時候並不初始化,在實例化類的時候初始化 */ public int j = print("j"); { print("構造快"); } /** * 第六個加載 此時,n已經被初始化 所以打印出 * 8:靜態塊 i=7 n=99 */ static{ print("靜態塊"); } //-----------以上屬於類加載--------------------- /** * 實例化過程: * 首先加載非靜態方法集; * 初始化非靜態變量:9:j i=8 n=100 * 執行構造塊:10:構造快 i=9 n=101 * 執行構造方法:11:init i=10 n=102 * 實例化完成 */ /** * 執行構造函數 實例化完成 * @param str */ public StaticTest(String str) { System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); ++n; ++i; } /** * 這個應該是最先加載 但是,加載不等於執行 * 因為如果不加載此函數,靜態變量是無法初始化的 * @param str * @return */ public static int print(String str) { System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); ++i; return ++n; } public static void main(String[] args) { /**首先加載類,然后實例化: * 類加載過程: * 首先加載所有的靜態方法,但不執行; * 然后按照靜態變量的順序開始初始化 * 靜態變量初始化完畢后執行靜態構造塊(不執行構造塊) * 此時類加載完畢 * 實例化過程: * 加載非靜態方法 * 初始化非靜態變量 * 執行構造代碼塊 * 執行構造函數 * 此時實例化完畢 */ StaticTest t = new StaticTest("init"); } }