java中static塊到底在什么時(shí)候運(yùn)行的呢?

那么static塊到底在什么時(shí)候運(yùn)行的呢?
如果了解JVM原理,我們知道,一個(gè)類的運(yùn)行分為以下步驟:
裝載->連接->初始化
其中裝載階段又三個(gè)基本動(dòng)作組成:
1、通過(guò)類型的完全限定名,產(chǎn)生一個(gè)代表該類型的二進(jìn)制數(shù)據(jù)流
2、解析這個(gè)二進(jìn)制數(shù)據(jù)流為方法區(qū)內(nèi)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)
3、創(chuàng)建一個(gè)表示該類型的java.lang.Class類的實(shí)例
另外如果一個(gè)類裝載器在預(yù)先裝載的時(shí)遇到缺失或錯(cuò)誤的class文件,
它需要等到程序首次主動(dòng)使用該類時(shí)才報(bào)告錯(cuò)誤。

連接階段又分為三部分:

1、驗(yàn)證,確認(rèn)類型符合Java語(yǔ)言的語(yǔ)義,檢查各個(gè)類之間的二進(jìn)制兼容性(比如final的類不用擁有子類等),
另外還需要進(jìn)行符號(hào)引用的驗(yàn)證。
2、準(zhǔn)備,Java虛擬機(jī)為類變量分配內(nèi)存,設(shè)置默認(rèn)初始值。
3、解析(可選的) ,在類型的常量池中尋找類,接口,字段和方法的符號(hào)引用,
把這些符號(hào)引用替換成直接引用的過(guò)程。

當(dāng)一個(gè)類被主動(dòng)使用時(shí),Java虛擬就會(huì)對(duì)其初始化,如下六種情況為主動(dòng)使用:

1、當(dāng)創(chuàng)建某個(gè)類的新實(shí)例時(shí)(如通過(guò)new或者反射,克隆,反序列化等)
2、當(dāng)調(diào)用某個(gè)類的靜態(tài)方法時(shí)
3、當(dāng)使用某個(gè)類或接口的靜態(tài)字段時(shí)
4、當(dāng)調(diào)用Java API中的某些反射方法時(shí),比如類Class中的方法,或者java.lang.reflect中的類的方法時(shí)
5、當(dāng)初始化某個(gè)子類時(shí)
6、當(dāng)虛擬機(jī)啟動(dòng)某個(gè)被標(biāo)明為啟動(dòng)類的類(即包含main方法的那個(gè)類)

Java編譯器會(huì)收集所有的類變量初始化語(yǔ)句和類型的靜態(tài)初始化器,將這些放到一個(gè)特殊的方法中:clinit。

實(shí)際上,static塊的執(zhí)行發(fā)生在“初始化”的階段。初始化階段,jvm主要完成對(duì)靜態(tài)變量的初始化,靜態(tài)塊執(zhí)行等工作。

下面我們看看執(zhí)行static塊的幾種情況:

1、第一次new A()的過(guò)程會(huì)打印"";因?yàn)檫@個(gè)過(guò)程包括了初始化

2、第一次Class.forName("A")的過(guò)程會(huì)打印"";因?yàn)檫@個(gè)過(guò)程相當(dāng)于Class.forName("A",true,this.getClass().getClassLoader());

3、第一次Class.forName("A",false,this.getClass().getClassLoader())的過(guò)程則不會(huì)打印""。因?yàn)閒alse指明了裝載類的過(guò)程中,不進(jìn)行初始化。不初始化則不會(huì)執(zhí)行static塊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,871評(píng)論 18 399
  • (一)Java部分 1、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,280評(píng)論 0 62
  • 一:java概述:1,JDK:Java Development Kit,java的開(kāi)發(fā)和運(yùn)行環(huán)境,java的開(kāi)發(fā)工...
    ZaneInTheSun閱讀 2,824評(píng)論 0 11
  • 因?yàn)殛幪?,就算是有燈也像是悲涼的點(diǎn)綴。整個(gè)環(huán)境壓抑的讓人難受,靜的快要發(fā)出靜的聲音。我想我一定是瘋了,要不然就...
    小伙伴們都叫我大鵬閱讀 384評(píng)論 1 3
  • 前三天在布拉格,高導(dǎo)帶我們基本吃遍了布拉格有名的中餐廳,比如城隍飯店,上海飯店,昨天晚上最后一家還提供wifi,讓...
    與姝會(huì)友閱讀 562評(píng)論 0 0

友情鏈接更多精彩內(nèi)容