靜態代碼塊的語法格式是這樣的:
類{
//靜態代碼塊
static{
java語句;
}
}
靜態代碼塊在類加載時執行,并且只執行一次。開發中使用不多,但離了它有的時候還真是沒法寫代碼。靜態代碼塊實際上是java語言為程序員準備的一個特殊的時刻,這個時刻就是類加載時刻,如果你想在類加載的時候執行一段代碼,那么這段代碼就有的放矢了。例如我們要在類加載的時候解析某個文件,并且要求該文件只解析一次,那么此時就可以把解析該文件的代碼寫到靜態代碼塊當中了。我們來測試一下靜態代碼塊:
public class StaticTest01 {
//靜態代碼塊
static{
System.out.println(2);
}
//靜態代碼塊
static{
System.out.println(1);
}
//main方法
public static void main(String[] args) {
System.out.println("main execute!");
}
//靜態代碼塊
static{
System.out.println(0);
}
}
運行結果如下圖所示:
圖11-22:靜態代碼塊運行結果
通過以上的測試可以得知一個類當中可以編寫多個靜態代碼塊(盡管大部分情況下只編寫一個),并且靜態代碼塊遵循自上而下的順序依次執行,所以有的時候放在類體當中的代碼是有執行順序的(大部分情況下類體當中的代碼沒有順序要求,方法體當中的代碼是有順序要求的,方法體當中的代碼必須遵守自上而下的順序依次逐行執行),另外靜態代碼塊當中的代碼在main方法執行之前執行,這是因為靜態代碼塊在類加載時執行,并且只執行一次。再來看一下以下代碼:
public class StaticTest02 {
int i = 100;
static{
System.out.println(i);
}
}
編譯結果如下圖所示:
圖11-23:靜態代碼塊中訪問實例變量編譯報錯
為什么編譯報錯呢?那是因為i變量是實例變量,實例變量必須先創建對象才能訪問,靜態代碼塊在類加載時執行,這個時候對象還沒有創建呢,所以i變量在這里是不能這樣訪問的。可以考慮在i變量前添加static,這樣i變量就變成靜態變量了,靜態變量訪問時不需要創建對象,直接通過“類”即可訪問,例如以下代碼:
public class StaticTest02 {
static int i = 100;
static{
System.out.println("靜態變量i = " + i);
}
public static void main(String[] args) {
}
}
運行結果如下圖所示:
圖11-24:靜態代碼塊中訪問靜態變量
代碼修改為這樣呢?
public class StaticTest02 {
static{
System.out.println("靜態變量i = " + i);
}
static int i = 100;
}
編譯報錯了,請看下圖:
圖11-25:編譯報錯信息
通過測試,可以看到有的時候類體當中的代碼也是有順序要求的(類體當中定義兩個獨立的方法,這兩個方法是沒有先后順序要求的),靜態代碼塊在類加載時執行,靜態變量在類加載時初始化,它們在同一時間發生,所以必然會有順序要求,如果在靜態代碼塊中要訪問i變量,那么i變量必須放到靜態代碼塊之前。