類與對象的動手動腦
阿新 • • 發佈:2017-10-19
初始化 tro 也會 多少 順序 代碼 -1 file 靜態方法 filed=100.
1.以下代碼為何無法通過編譯?哪兒出錯了?
原因:調用的new Foo是函數Foo(),所以括號裏面應該有一個int型變量參數,比如寫一個1。
2.進行實驗,根據下列代碼的輸出結果,自行總結java字段初始化的規律。
結果:
對此結果的分析:
- 類開始的 { field=200;}是類的初始化塊,用大括號“{,}”直接包裹的,是做為類的成員,這種“沒有名字”的成員大多是初始化的字段。
- 後面的 public int field=100;是類在定義的時候進行的初始化,函數到這裏的field=100.
3.所以在主函數中的System.out.println(obj.field);輸出的
4.obj=new InitializeBlockClass(300); System.out.println(obj.field);是調用了構造函數,使用構造函數進行了初始化,賦值300,故輸出的filed=300.
對規律進行的總結:
- 執行類成員定義時指定的默認值或類的初始化塊,到底執行哪一個要看哪一個“排在前面”。
- 執行類的構造函數。
- 類的初始化塊不接受任何的參數,而且只要一創建類的對象,他們就會被執行。因此,適合於封裝那些“對象創建時必須執行的代碼”。
3.請運行以下程序,觀察輸出結果,總結出“靜態初始化塊的執行順序”。
結果:
靜態初始化塊的執行順序:
- 靜態初始化塊只執行一次。
- 創建子類型的對象時,也會導致父類型的靜態初始化塊的執行。
父類的靜態初始化塊
子類的靜態初始化塊
父類的初始化塊
父類的構造函數
子類的初始化塊
子類的構造函數
4.一個有趣的問題
靜態方法中只允許訪問靜態數據,那麽,如何在靜態方法中訪問類的是實例成員(即沒有附加static關鍵字的字段方法)?
結果:
要在靜態方法中訪問類的實例成員,需要先用new,創建一個對象,然後再通過這個對象去調用成員的方法和變量。
5.程序
使用類的靜態字段和構造函數,我們可以跟蹤某個類的所創建對象的個數。請寫一個類,在任何時候都可以向它查詢“你已經創建了多少個對象?”。
結果:
類與對象的動手動腦