jvm 靜態類及非靜態類的變數,方法載入順序
阿新 • • 發佈:2019-02-16
2 class data{
3 private static final data mInstance = new data();
4 private static int mx = 0;
5 private data()
6 {
7 System.out.println("mx=" + mx);
8 mx = getVersion();
9 }
10 public static data getInstance()
11 {
12 return mInstance;
13 }
14 public int getVersion()
15 {
16 int v = 0;
17 if (v == 0)
18 {
19 v = 7;
20 }
21 return v;
22 }
23 public int getmx()
24 {
25 return mx;
26 }
27 }
28
29 class Test
30 {
31 public static void getData(StringBuffer sb)
32 {
33 sb.append("hello world ");
34 }
35 public static void main(String args[])
36 {
37 System.out.println(data.getInstance().getmx());
38 }
39 } 列印結果:
mx=0
3 private static final data mInstance = new data();
4 private static int mx = 0;
5 private data()
6 {
7 System.out.println("mx=" + mx);
8 mx = getVersion();
9 }
10 public static data getInstance()
11 {
12 return mInstance;
13 }
14 public int getVersion()
15 {
16 int v = 0;
17 if (v == 0)
18 {
19 v = 7;
20 }
21 return v;
22 }
23 public int getmx()
24 {
25 return mx;
26 }
27 }
28
29 class Test
30 {
31 public static void getData(StringBuffer sb)
32 {
33 sb.append("hello world ");
34 }
35 public static void main(String args[])
36 {
37 System.out.println(data.getInstance().getmx());
38 }
39 } 列印結果:
mx=0
0
其實這個問題很簡單,牽扯到類載入順序以及類中程式碼執行的順序問題。
類的初始化順序如下:
父類靜態變數
父類靜態塊
子類靜態變數
子類靜態塊
父類變數
父類普通塊
父類建構函式(子類例項化時先要呼叫父類建構函式)
子類變數
子類普通塊
子類建構函式
如果有多個初始化塊,則按照程式碼先後順序執行。
因此此問題解釋如下:
1.date中的靜態變數data會在類載入的時候首先初始化,因此初始化的時候呼叫date建構函式,將會將m賦值為7,
2.然後執行private static int mx = 0進行初始化m操作,因此此時m又成了0.
樓主可以將private static int mx = 0這句放在private static final data mInstance = new data();前面執行,結果就會不一樣了。
可以在private static final data mInstance = new data();
後面加上
static{
System.out.println("static");
}
然後執行看看初始化的先後順序如何