1. 程式人生 > >類與對象的動手動腦

類與對象的動手動腦

初始化 tro 也會 多少 順序 代碼 -1 file 靜態方法

1.以下代碼為何無法通過編譯?哪兒出錯了?

技術分享

原因:調用的new Foo是函數Foo(),所以括號裏面應該有一個int型變量參數,比如寫一個1

技術分享

2.進行實驗,根據下列代碼的輸出結果,自行總結java字段初始化的規律。

技術分享

結果:技術分享

對此結果的分析:

  1. 類開始的 { field=200}是類的初始化塊,用大括號“{}”直接包裹的,是做為類的成員,這種“沒有名字”的成員大多是初始化的字段。
  2. 後面的 public int field=100;是類在定義的時候進行的初始化,函數到這裏的field=100.

3.所以在主函數中的System.out.println(obj.field);輸出的

filed=100.

4.obj=new InitializeBlockClass(300); System.out.println(obj.field);是調用了構造函數,使用構造函數進行了初始化,賦值300,故輸出的filed=300.

對規律進行的總結:

  1. 執行類成員定義時指定的默認值或類的初始化塊,到底執行哪一個要看哪一個“排在前面”。
  2. 執行類的構造函數。
  3. 類的初始化塊不接受任何的參數,而且只要一創建類的對象,他們就會被執行。因此,適合於封裝那些“對象創建時必須執行的代碼”。

3.請運行以下程序,觀察輸出結果,總結出“靜態初始化塊的執行順序”。

技術分享

技術分享

結果:

技術分享

靜態初始化塊的執行順序:

  1. 靜態初始化塊只執行一次。
  2. 創建子類型的對象時,也會導致父類型的靜態初始化塊的執行。

父類的靜態初始化塊

子類的靜態初始化塊

父類的初始化塊

父類的構造函數

子類的初始化塊

子類的構造函數

4.一個有趣的問題

靜態方法中只允許訪問靜態數據,那麽,如何在靜態方法中訪問類的是實例成員(即沒有附加static關鍵字的字段方法)?

技術分享

結果:

技術分享

要在靜態方法中訪問類的實例成員,需要先用new,創建一個對象,然後再通過這個對象去調用成員的方法和變量。

5.程序

使用類的靜態字段和構造函數,我們可以跟蹤某個類的所創建對象的個數。請寫一個類,在任何時候都可以向它查詢“你已經創建了多少個對象?”。

技術分享

結果:

技術分享

類與對象的動手動腦