Java中static塊執行時機
演示例子
在使用static進行初始化的操作,怎么也執行不了!代碼如下:
public class StaticDemo {
public static final String INIT = "init";
static {
System.out.println("------StaticDemo----");
}
}
public class TestStatic {
public static void main(String[] args) {
System.out.println(StaticDemo.INIT);
}
}
//打印
init
怎么沒有執行 static 塊的代碼呢?
最后發現是因為調用的靜態屬性被final修飾導致的。去掉final修飾,結果OK!
public class StaticDemo {
//去掉 final
public static String INIT = "init";
static {
System.out.println("------StaticDemo----");
}
}
public class TestStatic {
public static void main(String[] args) {
System.out.println(StaticDemo.INIT);
}
}
//打印結果
------StaticDemo----
init
這里就和類加載機制中的 初始化 相關!類被加載了不一定就會執行靜態代碼塊,只有一個類被主動使用的時候,靜態代碼才會被執行!
當一個類被主動使用時,Java虛擬就會對其初始化,如下六種情況為主動使用:
-
當創建某個類的新實例時(如通過new或者反射,克隆,反序列化等)
-
當調用某個類的靜態方法時
-
當使用某個類或接口的靜態字段時
-
當調用Java API中的某些反射方法時,比如類Class中的方法,或者java.lang.reflect中的類的方法時
-
當初始化某個子類時
-
當虛擬機啟動某個被標明為啟動類的類(即包含main方法的那個類)
Java編譯器會收集所有的類變量初始化語句和類型的靜態初始化器,將這些放到一個特殊的方法中:clinit。
重點:使用final修飾的靜態字段,在調用的時候不會對類進行初始化!
更多相關內容閱讀
如果您覺得這篇博文對你有幫助,請點贊或者喜歡,讓更多的人看到,謝謝!
如果帥氣(美麗)、睿智(聰穎),和我一樣簡單善良的你看到本篇博文中存在問題,請指出,我虛心接受你讓我成長的批評,謝謝閱讀!
祝你今天開心愉快!
歡迎訪問我的csdn博客,我們一同成長!
不管做什么,只要堅持下去就會看到不一樣!在路上,不卑不亢!
博客首頁 : http://blog.csdn.net/u010648555
© 每天都在變得更好的阿飛