什麼情況下需要開始類載入過程的第乙個階段:"載入"。虛擬機器規範中並沒強行約束,這點可以交給虛擬機器的的具體實現自由把握,但是對於初始化階段虛擬機器規範是嚴格規定了如下幾種情況,如果類未初始化會對類進行初始化。
建立類的例項
訪問類的靜態變數(除常量【被final修辭的靜態變數】
原因:常量一種特殊的變數,因為編譯器把他們當作值(value)而不是域(field)來對待。如果你的**中用到了常變數(constant variable),編譯器並不會生成位元組碼來從物件中載入域的值,而是直接把這個值插入到位元組碼中。這是一種很有用的優化,但是如果你需要改變final域的值那麼每一塊用到那個域的**都需要重新編譯。
訪問類的靜態方法
反射如(class.forname("my.xyz.test"))
當初始化乙個類時,發現其父類還未初始化,則先出發父類的初始化
虛擬機器啟動時,定義了main()方法的那個類先初始化
以上情況稱為稱對乙個類進行
「主動引用」,除此種情況之外,均不會觸發類的初始化,稱為
「被動引用」
介面的載入過程與類的載入過程稍有不同。介面中不能使用static{}塊。當乙個介面在初始化時,並不要求其父介面全部都完成了初始化,只有真正在使用到父介面時(例如引用介面中定義的常量)才會初始化。
子類呼叫父類的靜態變數,子類不會被初始化。只有父類被初始化。。對於靜態字段,只有直接定義這個欄位的類才會被初始化.
通過陣列定義來引用類,不會觸發類的初始化
訪問類的常量,不會初始化類
程式執行輸出 superclass initclass superclass
public static int value = 123;
}
class subclass extends superclass
}
public class test
}
123從上面的輸入結果證明了被動引用1與被動引用2
class constclass
public static final string helloworld = "hello world";
}
public class test
}
程式輸出結果
hello world
從上面的輸出結果證明了被動引用3
類初始化時機
虛擬機器規範中並沒有強制約束何時進行載入,但是規範嚴格規定了有且只有下列五種情況必須對類進行初始化 載入 驗證 準備都會隨之發生 以上 5 種場景中的行為稱為對乙個類進行主動引用。除此之外,所有引用類的方式都不會觸發初始化,稱為被動引用。被動引用的常見例子包括 system.out.println ...
JVM中類的初始化時機
只有對類進行主動引用,才會觸發其初始化方法,而除此之外的引用方式稱之為被動引用,不會觸發其初始化方法 這裡先定義乙個utils 名字隨便起的,不要見怪 作為被測試類 package day12 author weihuanwen date created in 2019 5 23 00 14 des...
資源的初始化時機
zend framework 中的資源是什麼時候初始化的呢?還是直接上 來看比較有說服力 protected function bootstrap resource null foreach this getpluginresourcenames as resource elseif is stri...