程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 代碼分析-一道Java筆試題,求解答(關於類的加載與初始化)

代碼分析-一道Java筆試題,求解答(關於類的加載與初始化)

編輯:編程綜合問答
一道Java筆試題,求解答(關於類的加載與初始化)

自己查了一些資料,還是看不懂這個程序的輸出結果,求各位詳細解釋初始化和執行過程,謝!

public class Alibaba {
public static int k = 0;
public static Alibaba t1 = new Alibaba("t1");
public static Alibaba t2 = new Alibaba("t2");
public static int i = print("i");
public static int n = 99;
private int a = 0;
public int j = print("j");
{
print("構造塊");
}
static {
print("靜態塊");
}
public Alibaba(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[]) {
Alibaba t = new Alibaba("init");
}
}

/*
Output:
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
*/

最佳回答:


這道題比較復雜的地方就是靜態變量裡面有兩個自己的實例對象t1和t2,容易混亂,再有就是靜態塊調用時記得n已經賦值99了。

詳細說明下:

第一梯隊是靜態變量和靜態塊,跟類的實例沒有關系的,只要類加載就會先運行,且跟前後順序有關,因此本題中從k變量開始按順序執行static開頭的;

第二梯隊是普通變量和代碼塊,這個要到初始化變量的時候才會調用,很好理解,變量是實例的變量,沒有實例是不會初始化普通變量的,普通變量和代碼塊的執行順序也是按定義的前後執行,比如int j要在代碼塊的前面執行;這裡特殊的是第三行初始化t1時產生了實例對象,因此需要調用t1的普通變量j和代碼塊,因此先輸出的是j;

第三梯隊是構造方法,輸出的最後一行就是調用構造方法輸出的。

因此執行的順序是 k-->t1(t1.j,t1.代碼塊,t1構造函數)-->t2(t2.j,t2.代碼塊,t2構造函數)-->i-->n-->靜態塊-->main函數(初始化init(init.j,init.代碼塊,init構造函數));

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved