1. 程式人生 > >jvm 靜態類及非靜態類的變數,方法載入順序

jvm 靜態類及非靜態類的變數,方法載入順序

  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

   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");
}
然後執行看看初始化的先後順序如何