乙個簡單地程式示例剖析類載入機制

2021-08-10 07:10:24 字數 1122 閱讀 6448

例項如下:

public class loadingtest 

public static void main(string args)

}

結果:

初始化 value1 之前-->10

初始化 value2 之前-->10

初始化 value1 之後-->10

初始化 value2 之後-->0

分析:
類的載入流程:載入位元組碼、驗證階段、準備階段、解析階段、初始化階段

* 在準備階段:jvm會對存放在方法區中的類資料資訊的類變數執行初始化

* 這裡的初始化只是對類中的所有靜態變數分配記憶體空間,並為其設定初始值

* 初始化階段:jvm會將乙個類中所有的static關鍵字標示的**統統執行一遍

* 回到程式,為什麼結果是這樣呢?

* 因為:首先在準備階段,jvm會按照順序準備obj、value1、value2

* 也就是開闢空間並設定初始值,此時obj=null,value1=value2=0;然後,到了初始化階段,會一次檢查

* obj、value1、value2是否需要初始化,obj通過構造方法初始化,

* 此時value1、value2的初始值被覆蓋為10,然後到value1,使用者沒有直接賦值

* 不用覆蓋,最後到了value2,使用者賦值0,那麼就會覆蓋之前的值,因此value2又回到0

接下裡我們變換**的順序:

public static int value1;

public static int value2=0;

public static loadingtest2 obj=new loadingtest2();

其它不變,執行的結果是:

初始化 value1 之前-->10

初始化 value2 之前-->10

初始化 value1 之後-->10

初始化 value2 之後-->10

載入的過程還是和上面解釋的一樣,只是因為**的順序發生變化結果就不同。
總結:類載入的結果和**的順序有關。

乙個游標簡單示例

下面是乙個游標的例項,方便初學者學習,也可以防止自己忘記 if exists select 1 from sysobjects where name hehe drop procedure hehe goset ansi nulls on set quoted identifier on gocre...

乙個MEX程式示例

mex檔案是由c或fortran語言編寫的源 經matlab編譯器處理而產生的二進位制檔案。它可以被matlab直譯器自動裝載並執行的動態鏈結程式,類似windows下的dll檔案。mex檔案實現了c語言與matlab的介面,以下例子闡述該介面。include mex.h include doubl...

乙個最簡單的MFC程式框架剖析

首先在vc中 我使用的是vc2008 建立乙個win32應用程式,並且選擇空專案。建立完成後,選擇專案屬性 配置屬性 常規 mfc的使用 選擇在共享dll中使用mfc。現在這個空專案中沒有任何的檔案。class public public virtual bool initinstance fram...