Java中static塊執行時機


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虛擬就會對其初始化,如下六種情況為主動使用:

  1. 當創建某個類的新實例時(如通過new或者反射,克隆,反序列化等)

  2. 當調用某個類的靜態方法時

  3. 當使用某個類或接口的靜態字段時

  4. 當調用Java API中的某些反射方法時,比如類Class中的方法,或者java.lang.reflect中的類的方法時

  5. 當初始化某個子類時

  6. 當虛擬機啟動某個被標明為啟動類的類(即包含main方法的那個類)

    Java編譯器會收集所有的類變量初始化語句和類型的靜態初始化器,將這些放到一個特殊的方法中:clinit。

重點:使用final修飾的靜態字段,在調用的時候不會對類進行初始化!

更多相關內容閱讀

java中靜態代碼塊的用法 static用法詳解

java]static關鍵字的四種用法

JAVA靜態代碼塊會在類被加載時自動執行?

java的static塊執行時機


如果您覺得這篇博文對你有幫助,請點贊或者喜歡,讓更多的人看到,謝謝!

如果帥氣(美麗)、睿智(聰穎),和我一樣簡單善良的你看到本篇博文中存在問題,請指出,我虛心接受你讓我成長的批評,謝謝閱讀!
祝你今天開心愉快!


歡迎訪問我的csdn博客,我們一同成長!

不管做什么,只要堅持下去就會看到不一樣!在路上,不卑不亢!

博客首頁 : http://blog.csdn.net/u010648555

© 每天都在變得更好的阿飛



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM