最近一直在看《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.); 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()
這樣很明顯就能看出成員的初始化順序了。
新聞熱點
疑難解答