最近一直在看《thinking in java》一書,感覺裡面東西講的很細,很多東西都沒有接觸過,是值得各位java程式員仔細品味的一本好書。
今天看了關於類成員初始化那節,以前對於成員初始化順序沒有考慮那麼多,沒有在意初始化的順序。今天特意仔細研究了一番。
一個類中,最首先被初始化的是靜態成員,也就是有關鍵字static修飾的成員。只要一個類被使用也就是建立對象或者調用了該類的某個靜態方法時靜態成員就都會被初始化,並且待用資料在記憶體中只佔用一份儲存地區,無論建立多少個對象,待用資料被所有對象共用。
初始化靜態成員後再初始化非靜態成員。對於非靜態成員之間,也是有初始化順序的,變數定義的順序決定了初始化的順序(無論成員變數在哪裡定義,都會在函數調用之前得到初始化)
直接定義成員初始化完成後才會執行建構函式初始化。
具體看例子:
1 public class House { 2 //對於非靜態成員變數,誰先定義誰就先被初始化。順序為w1、w2、w3 3 Window w1 = new Window(1); 4 public House() { 5 System.out.println("House()"); 6 w3 = new Window(33); 7 } 8 Window w2 = new Window(2); 9 void f(){10 System.out.println("f()");11 }12 static void f1(){13 System.out.println("static f1()");14 }15 Window w3 = new Window(3); //在函數f後面,但是在f調用之前得到了初始化16 static Window w4 = new Window(4); //靜態成員變數最先被初始化17 /**18 * @param args19 */20 public static void main(String[] args) {21 House h = new House();22 h.f();23 House.f1();24 }25 26 }27 class Window{28 public Window(int maker) {29 System.out.println("Window("+maker+")");30 }31 }
執行結果如下:
1 Window(4)2 Window(1)3 Window(2)4 Window(3)5 House()6 Window(33)7 f()8 static f1()
這樣很明顯就能看出成員的初始化順序了。