一.與靜態方法的比較
一般情況下,如果有些程式碼必須在專案啟動的時候就執行的時候,需要使用靜態程式碼區塊,這種程式碼是主動執行的;需要在專案啟動的時候就初始化,在不創建物件的情況下,其他程式來呼叫的時候,需要使用靜態方法,靜態方法在類別載入的時候就已經載入可以用類別名稱直接呼叫例如main方法就必須是靜態的這是程式入口。兩者的差別就是:靜態程式碼區塊是自動執行的; 靜態方法是被呼叫的時候才執行的。
二.靜態方法注意事項
使用類別的靜態方法時,注意:
a.在靜態方法裡只能直接呼叫同類中其他的靜態成員(包括變數和方法),而不能直接存取類別)中的非靜態成員。這是因為,對於非靜態的方法和變量,需要先建立類別的實例物件後才可使用,而靜態方法在使用前
不用建立任何物件。
b.靜態方法不能以任何方式引用this和super關鍵字,因為靜態方法在使用前不用創建任何實例對象,當靜態方法調用時,this所引用的對像根本沒有產生(this關鍵字只能在方法內部使用,表示對「呼叫方法的那
個物件」的引用)。
靜態變數是屬於整個類別的變數而不是屬於某個物件的。注意不能將任何方法體內的變數宣告為靜態,例如: fun() { static int i=0;//非法。 }
三.程式舉例
public class TestStaticCon { public static int a = 0; static { a = 10; System.out.println("父类的静态代码块在执行a=" + a); } { a = 8; System.out.println("父类的非静态代码块在执行a=" + a); } public TestStaticCon() { this("a在父类带参构造方法中的值:" + TestStaticCon.a); // 调用另外一个构造方法 System.out.println(a); System.out.println("父类无参构造方法在执行a=" + a); } public TestStaticCon(String n) { System.out.println(n); System.out.println(a); } public static void main(String[] args) { TestStaticCon tsc = null; System.out.println("!!!!!!!!!!!!!!!!!!!!!"); tsc = new TestStaticCon(); } }
运行结果: 父类的静态代码块在执行a=10 !!!!!!!!!!!!!!!!!!!!! 父类的非静态代码块在执行a=8 a在父类带参构造方法中的值:10 8 8 父类无参构造方法在执行a=8
四.網友提供
public class StaticBlock { static { System.out.println("静态块"); } { System.out.println("构造块,在类中定义"); } public StaticBlock() { System.out.println("构造方法执行"); } public static void main(String[] args) { new StaticBlock(); new StaticBlock(); } }
静态块 构造块,在类中定义 构造方法执行 构造块,在类中定义 构造方法执行
結論:靜態程式碼區塊是在類別載入時自動執行的,非靜態程式碼區塊是在建立物件時自動執行物件時的程式碼執行該類別的非靜態程式碼區塊。且執行順序為靜態程式碼區塊------非靜態程式碼區塊----建構子。
其中讓我疑惑的是“a在父類帶參構造方法中的值:10”,我再想那時候為什麼不是8,debug了(F11,不能直接設置斷點然後運行,那樣和直接運行沒區別),發現先進入了無參的構造方法,執行了第一條語句並且切換到了另一個構造方法(不管是不是反正第一句都要執行,此時a還是10,非靜態代碼塊還未執行),提示找不到來源,不管是不是這條語句都提示了這個警告(不算錯誤,因為程式繼續正常運作),然後執行了非靜態程式碼區塊,繼而從有參的建構方法處繼續執行…
更多Java中的static靜態程式碼區塊的使用詳解相關文章請關注PHP中文網!