相同點:都是在JVM加載類時且在構造方法執行以前執行,在類中均可以定義多個,
通常在代碼塊中對一些static變量進行賦值。
不一樣點:靜態代碼塊在非靜態代碼塊以前執行(靜態代碼塊—>非靜態代碼塊—>構造方法)。
靜態代碼塊只在第一次new執行一次,以後再也不執行,而非靜態代碼塊在每new
一次就執行一次。非靜態代碼塊可在普通方法中定義(不過做用不大);而靜態代碼塊不行。
例:
//普通類
public class PuTong {
public PuTong(){
System.out.print("默認構造方法!-->");
}
//非靜態代碼塊
{
System.out.print("非靜態代碼塊!-->");
}
//靜態代碼塊
static{
System.out.print("靜態代碼塊!-->");
}
public static void test(){
{
System.out.println("普通方法中的代碼塊!");
}
}
}
//測試類
public class TestClass {
/**
* 區別兩次new靜態與非靜態代碼塊執行狀況
*/
public static void main(String[] args) {
PuTong c1 = new PuTong();
c1.test();
PuTong c2 = new PuTong();
c2.test();
}
}
/*
運行輸出結果是:
靜態代碼塊!-->非靜態代碼塊!-->默認構造方法!-->普通方法中的代碼塊!
非靜態代碼塊!-->默認構造方法!-->普通方法中的代碼塊!
*/測試