1. 程式人生 > >static 靜態變數和靜態程式碼塊的執行順序

static 靜態變數和靜態程式碼塊的執行順序

        眾所周知 在android中static 修飾的會被稱之為 靜態常量,靜態變數, 靜態方法 ,還有就是靜態程式碼塊,用static{ // 程式碼塊 非static修飾的方法,變數,常量, 是不能再靜態程式碼塊中使用的 } 表示。

       static修飾的 是跟著類走的, 而不是跟隨物件,這個大家都是知道的。 那麼大家是否知道它們之間的執行順序的關係呢? 今天, 我就給大家簡單講解一下吧。

       靜態常量,靜態變數,靜態方法, 大家都知道是通過類名直接呼叫的(例如:Demo.getStatic() )。但是靜態程式碼塊 大家都沒有主動呼叫過 對吧。 那它 到底什麼時候被執行呢? 讓我來揭曉吧, 其實只要你的程式碼在任意地方,動用了靜態程式碼塊所屬的類中的 任意東西, 那麼該靜態程式碼塊 就會馬上執行(說白了就是  靜態程式碼塊是這個類最先執行的程式碼, 但前提是你要使用這個類, 不使用的話, 這個類中的靜態程式碼塊是不會執行的 與靜態變數相比就是看程式碼編寫的前後順序,和靜態方法有很大的區別)。 當一個類中 有多個靜態程式碼塊的時候,是按照程式碼編寫的上下順序先後執行的。

      靜態程式碼塊 與 靜態變數之間的關係:

如果你想正確使用兩者的話, 個人建議  你必須把靜態變數定義在靜態程式碼塊的前面, 因為兩個的執行是會根據程式碼編寫的順序來決定的。這個比較難理解, 我來舉個例子吧, 情況下面程式碼:

public class Demo{

          public static int i;

          static{

                i = 20;

                //這裡的i, 是可以被用作運算的。

           }

}

這時候如果你在main函式輸出i, 那麼i=20

public class Demo{  

          static{

                i = 20;

             //這裡的i, 是不能被用作運算的, 因為本質上 i 還未被定義

           }

          public static int i;

}

這時候如果你在main函式輸出i, 那麼i=20

 public class Demo{  

          static{

                i = 20;

             //這裡的i, 是不能被用作運算的, 因為本質上 i 還未被定義

           }

          public static int i = 1;

}

//但是如果我們給靜態的i附上一個初始值後,那麼結果就變了。

這時候如果你在main函式輸出i, 那麼i=1

上述的程式碼 就其實就是進一步說明 靜態變數 和static修改的靜態程式碼塊 執行的順序是根據程式碼編寫的先後, 而且第二種寫法毫無意義。 未了避免出現不必要的麻煩, 本人強制建議, 不管是否有在靜態程式碼塊中使用 靜態變數, 都應當把靜態變數寫在 靜態程式碼塊的上方。 靜態常量的情況 和靜態變數是一樣, 這裡就不在做說明了。