qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          類的生命周期回顧篇

           一、JAVA虛擬機和JAVA程序的生命周期

            JAVA虛擬機的生命周期和JAVA程序的生命周期一致,當我們在命令行中敲入java命令運行java程序時,java虛擬機進程啟動,程序運行,當程序終止時,則JAVA虛擬機的生命也結束。

            二、類的生命周期

            1、加載:將.class文件的二進制數據放到內存方法區中,并在堆區中創建一個Class對象,這個Class對象封裝了方法區的數據結構,用戶能通過Class對象訪問到方法區中。

            2、連接

            (1)驗證:驗證.class文件是否是通過JAVA程序編譯出來的,因為有可能這個.class文件是黑客特意制造出來的。

            (2)準備:為類中的靜態變量分配空間,并初始化為默認值。

            (3)解析:把類的符號引用變為直接引用。

            3.初始化:為靜態變量和靜態塊賦予值。

            JAVA程序對于類的使用方式:

            (1)主動使用。

            (2)被動使用。

            這里注意:

            JAVA虛擬機對于加載和連接的時間節點是很寬松的,沒有嚴格規定,可以提前加載也可以;但是對于初始化,JAVA虛擬機規定當某個類被主動使用時才能初始化。

            我們把3個步驟細講一下:

            1、類的加載:類是通過類加載器進行加載。

            類加載的來源:

            (1)文件系統中的class文件

            (2)jar包

            (3)網絡中下載。

            類加載目的地:內存。

            類加載器分類:

            (1)根類加載器:沒有父類,加載java.lang.*。

            (2)擴展類加載器:父類是根類加載器,用于加載jre\lib\ext的jar包。

            (3)系統類加載器:父類是擴展類加載器,用于加載classpath的jar包。Class scl = Class.getSystemClassLoader();

           (4)自定義加載器:自定義加載,通常父類是系統類加載器。

            注意:通過類虛擬機自帶的(1)(2)(3)加載器是JAVA虛擬機創建的,而他們加載的類,他的生命周期是虛擬機的生命周期,因為始終被加載器鎖引用。

            2、類的解析

            將符號引用轉換成直接引用。比如:

            A函數調用了B函數,原本只是符號引用即標明引用了B函數,直接引用是將符號改成指針指向B函數。

            3、類的初始化

            規則:

            (1)初始化的靜態變量都是運行時變量,即不能在編譯時就能判斷值是多少。

            (2)初始化的順序就是按照代碼的順序執行。

            (3)如果初始化子類時父類還沒有被初始化,則先初始化父類。

            初始化時機:當遇到以下情況會進行初始化。

            (1)new創建實例、反射創建實例、clone創建實例、反序列化創建實例。

            (2)訪問靜態變量,即讀和寫。

            (3)調用靜態方法。

            (4)啟動類需要首先初始化。

            (5)Class.forName();

            注意:

            (1)當遇到編譯時常量,則直接用數字替換,而不會導致類初始化。比如public static final int a= 3;這就是一個編譯時常量。

            (2)當子類對象調用父類的靜態變量或方法,則只對父類進行初始化。比如:Sub.a,其中a是父類的靜態變量,則只對Base初始化。

            (3)當子類被初始化時,父類一定要先初始化;

            但是如果一個類實現了一個接口,當類被初始化時,不用初始化父接口。

            只有對這個接口進行訪問時,才會對接口進行初始化。

            (4)loader.loadClass("....");只是對類的加載,而不是初始化。

            類加載過程采用“父親委托機制”,即如果loader2的父類是loader1,loader2想要加載test類,則先會檢查loader1是否能夠加載test類,如果能,則通過父類加載。

            運行時包的概念:包名相同,類加載器相同。


          posted on 2011-11-21 10:17 順其自然EVO 閱讀(232) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2011年11月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 肇州县| 海林市| 延长县| 泌阳县| 隆安县| 泗阳县| 呈贡县| 泽普县| 东乌珠穆沁旗| 怀柔区| 武义县| 确山县| 泾川县| 西和县| 皮山县| 巴南区| 曲水县| 波密县| 新丰县| 吉首市| 南昌市| 台东市| 开平市| 桐柏县| 古浪县| 鲁甸县| 浦北县| 库伦旗| 云龙县| 苏州市| 历史| 璧山县| 清原| 望都县| 中方县| 会东县| 宁城县| 宝山区| 许昌市| 蕉岭县| 衡山县|