天天看點

Java中的static靜态代碼塊

一.與靜态方法的比較  

  一般情況下,如果有些代碼必須在項目啟動的時候就執行的時候,需要使用靜态代碼塊,這種代碼是主動執行的;需要在項目啟動的時候就初始化,在不建立對象的情況下,其他程式來調用的時候,需要使用靜态方法,靜态方法在類加載的時候 就已經加載 可以用類名直接調用 比如main方法就必須是靜态的 這是程式入口。兩者的差別就是:靜态代碼塊是自動執行的; 靜态方法是被調用的時候才執行的。

二.靜态方法注意事項  

  使用類的靜态方法時,注意:

    a.在靜态方法裡隻能直接調用同類中其他的靜态成員(包括變量和方法),而不能直接通路類中的非靜态成員。這是因為,對于非靜态的方法和變量,需要先建立類的執行個體對象後才可使用,而靜态方法在使用前

不用建立任何對象。

    b.靜态方法不能以任何方式引用this和super關鍵字,因為靜态方法在使用前不用建立任何執行個體對象,當靜态方法調用時,this所引用的對象根本沒有産生(this關鍵字隻能在方法内部使用,表示對“調用方法的那個對象”的引用)。

  靜态變量是屬于整個類的變量而不是屬于某個對象的。注意不能把任何方法體内的變量聲明為靜态,例如: fun() {    static int i=0;//非法。 }

三.程式舉例

四.網友提供

  

五.今天發現的問題

static塊不一定非要寫在所有變量和方法之前。

 

  結論:靜态代碼塊是在類加載時自動執行的,非靜态代碼塊是在建立對象時自動執行的代碼,不建立對象不執行該類的非靜态代碼塊。且執行順序為靜态代碼塊------非靜态代碼塊----構造函數。

  其中讓我疑惑的是“a在父類帶參構造方法中的值:10”,我再想那時候為什麼不是8,debug了(F11,不能直接設定斷點然後運作,那樣和直接運作沒差別),發現先進入了無參的構造方法,執行了第一條語句并且切換到了另一個構造方法(不管是不是反正第一句都要執行,此時a還是10,非靜态代碼塊還未執行),提示找不到源,不管是不是這條語句都提示了這個警告(不算錯誤,因為程式繼續正常運作),然後運作了非靜态代碼塊,繼而從有參的構造方法處繼續執行……

  今天知道了适應和忍是兩種不同的境界……