類的初始化時機

2021-08-15 16:21:39 字數 1230 閱讀 7073

什麼情況下需要開始類載入過程的第乙個階段:"載入"。虛擬機器規範中並沒強行約束,這點可以交給虛擬機器的的具體實現自由把握,但是對於初始化階段虛擬機器規範是嚴格規定了如下幾種情況,如果類未初始化會對類進行初始化。

建立類的例項

訪問類的靜態變數(除常量【被final修辭的靜態變數】

原因:常量一種特殊的變數,因為編譯器把他們當作值(value)而不是域(field)來對待。如果你的**中用到了常變數(constant variable),編譯器並不會生成位元組碼來從物件中載入域的值,而是直接把這個值插入到位元組碼中。這是一種很有用的優化,但是如果你需要改變final域的值那麼每一塊用到那個域的**都需要重新編譯。

訪問類的靜態方法

反射如(class.forname("my.xyz.test"))

當初始化乙個類時,發現其父類還未初始化,則先出發父類的初始化

虛擬機器啟動時,定義了main()方法的那個類先初始化

以上情況稱為稱對乙個類進行

「主動引用」,除此種情況之外,均不會觸發類的初始化,稱為

「被動引用」

介面的載入過程與類的載入過程稍有不同。介面中不能使用static{}塊。當乙個介面在初始化時,並不要求其父介面全部都完成了初始化,只有真正在使用到父介面時(例如引用介面中定義的常量)才會初始化。

子類呼叫父類的靜態變數,子類不會被初始化。只有父類被初始化。。對於靜態字段,只有直接定義這個欄位的類才會被初始化.

通過陣列定義來引用類,不會觸發類的初始化

訪問類的常量,不會初始化類

class superclass   

public static int value = 123;

}

class subclass extends superclass

}

public class test

}

程式執行輸出    superclass init 

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...