Thinking in java 學習之初始化

1、局部變量初始化:對於方法的局部變量,java以編譯時錯誤的形式來保證局部變量的初始化。

2、成員變量:基本數據類型會被自動初始化爲0,布爾類型被初始化爲false,對象的引用被初始化爲null。

3、靜態數據的初始化:以下代碼演示靜態存儲區域是何時初始化的。

 

  1. package test_2012_10.Static;  
  2.  
  3. import test_2012_10.Utils.Print;  
  4.  
  5.  
  6. class Bowl{  
  7.     Bowl(int marker){  
  8.         Print.print("Bowl(" + marker + ")");  
  9.     }  
  10.     void f1(int marker){  
  11.         Print.print("f1(" + marker + ")");  
  12.     }  
  13. }  
  14.  
  15. class Table{  
  16.     static Bowl bowl1 = new Bowl(1);  
  17.     Table(){  
  18.         Print.print("Table()");  
  19.         bowl2.f1(1);  
  20.     }  
  21.     void f2(int marker){  
  22.         Print.print("f2(" + marker + ")");  
  23.     }  
  24.     static Bowl bowl2 = new Bowl(2);  
  25. }  
  26.  
  27. class CupBoard{  
  28.     Bowl bowl3 = new Bowl(3);//類的成員變量(在執行構造方法前初始化)  
  29.     static Bowl bowl4 = new Bowl(4);  
  30.     CupBoard(){  
  31.         Print.print("CupBoard()");  
  32.         bowl4.f1(2);  
  33.     }  
  34.     void f3(int marker){  
  35.         Print.print("f3(" + marker + ")");  
  36.     }  
  37.     static Bowl bowl5 = new Bowl(5);  
  38. }  
  39.  
  40. public class Static_Test {  
  41.       
  42.     public static void main(String[] args) {  
  43.         Print.print("Creating new CupBoard() in main");  
  44.         new CupBoard();  
  45.         Print.print("Creating new CupBoard() in main");  
  46.         new CupBoard();  
  47.         table.f2(1);  
  48.         cupBoard.f3(1);  
  49.           
  50.     }  
  51.     static Table table = new Table();//首先會初始化靜態域  
  52.     static CupBoard cupBoard = new CupBoard();  
  53.  
  54. }  
  55. 結果如下:  
  56. owl(1)  
  57. Bowl(2)  
  58. Table()  
  59. f1(1)  
  60. Bowl(4)  
  61. Bowl(5)  
  62. Bowl(3)  
  63. CupBoard()  
  64. f1(2)  
  65. Creating new CupBoard() in main  
  66. Bowl(3)  
  67. CupBoard()  
  68. f1(2)  
  69. Creating new CupBoard() in main  
  70. Bowl(3)  
  71. CupBoard()  
  72. f1(2)  
  73. f2(1)  
  74. f3(1

總結一下對象創建的過程,假設有個名爲Dog的類

1、即使沒有顯式的使用static關鍵字,構造器實際上也是靜態方法。因此,當首次創建類型爲Dog的對象時(構造器可以看成是靜態方法),或者Dog類的靜態方法/靜態域首次被訪問時,Java解釋器必須查找類路徑,以定位Dog.class文件。

2、然後載入Dog.class,有關靜態初始化的所有操作都會執行。因此,靜態初始化只在Class對象首次加載的時候進行一次。

3、當用new Dog()創建對象的時候,首先在堆上爲Dog對象分配足夠的存儲空間。

4、這塊存儲空間會被清零,這就自動的將Dog對象中所有基本數據類型都設置成了默認值(對於數字來說是0,對於布爾和字符型也相同),而引用則被設置成null。

5、執行所有出現於字段定義處的初始化動作。

6、執行構造器,這可能會牽扯很多動作,尤其是涉及到繼承。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章