<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                虛擬機把描述類的數據從Class文件加載到內存,并對數據進行校驗、轉換、解析和初始化,最終形成可以被虛擬機直接使用的Java類型,這就是虛擬機的類加載機制。Java類的加載、連接和初始化都是在程序運行期間完成的,也就是動態加載和動態連接的。 # 類加載的時機 ![](https://img.kancloud.cn/72/1c/721c99a683916644e86d1ab6b3c6449f_487x162.png) 加載、驗證、準備、初始化、卸載這5個階段的順序是確定的,解析則不一定,有時可以在初始化之后再開始。 Java虛擬機并沒有規定什么時候一定要開始第一個階段“加載”,但規定了有且僅有下面5中情況一定要進行“初始化”: 1、遇到new、getstatic、putstatic、invokestatic四個字節碼指令時,生成這幾個指令最常見的場景:new關鍵字實例化對象時、讀取或設置一個類的靜態字段時、調用一個類的靜態方法時。 2、使用java.lang.reflect包的方法對類進行反射調用時,如果類沒有進行過初始化,需要觸發初始化 3、初始化一個類時,如果發現其父類還沒初始化,需要先觸發其父類的初始化 4、虛擬機啟動時,需要指定一個要執行的主類(包含main方法的那個類),虛擬機會先初始化這個主類 5、使用JDK1.7的動態語言支持時,如果一個java.lang.invoke.MethodHandle實例最后解析的結果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,且這個方法句柄對應的類沒有進行過初始化,需要先觸發其初始化 上面5中情況中的行為稱為對一個類進行主動引用,除此之外其他引用類的方式不會觸發類的初始化,稱為被動引用。 # 類加載的過程 ## 加載 ## 驗證 ## 準備 ## 解析 ## 初始化 # 類加載調用順序 以下面示例進行測試: ```java /** * 控制臺打印 */ class Log { public static String baseFieldInit() { System.out.println("Base Normal Field"); return ""; } public static String baseStaticFieldInit() { System.out.println("Base Static Field"); return ""; } public static String fieldInit() { System.out.println("Normal Field"); return ""; } public static String staticFieldInit() { System.out.println("Static Field"); return ""; } } /** * 基類 */ class Base { static { System.out.println("Base Static Block 1"); } private static String staticValue = Log.baseStaticFieldInit(); static { System.out.println("Base Static Block 2"); } { System.out.println("Base Normal Block 1"); } private String value = Log.baseFieldInit(); { System.out.println("Base Normal Block 2"); } Base() { System.out.println("Base Constructor"); } } /** * 派生類 */ class Derived extends Base { static { System.out.println("Static Block 1"); } private static String staticValue = Log.staticFieldInit(); static { System.out.println("Static Block 2"); } { System.out.println("Normal Block 1"); } private String value = Log.fieldInit(); { System.out.println("Normal Block 2"); } Derived() { System.out.println("Derived Constructor"); } /** * MAIN 主線程 */ public static void main(String[] args) { Derived d = new Derived(); } } ``` 打印結果如下: ```java Base Static Block 1 Base Static Field Base Static Block 2 Static Block 1 Static Field Static Block 2 Base Normal Block 1 Base Normal Field Base Normal Block 2 Base Constructor Normal Block 1 Normal Field Normal Block 2 Derived Constructor ``` 可以看到,執行順序如下: 1、基類靜態代碼塊、基類靜態成員變量(優先級相同,按代碼出現順序依次執行)(只有第一次加載類時執行) 2、派生類靜態代碼塊、派生類靜態成員變量(優先級相同,按代碼出現順序依次執行)(只有第一次加載類時執行) 3、基類普通代碼塊、基類普通成員變量(優先級相同,按代碼出現順序依次執行) 4、基類構造函數 5、派生類普通代碼塊、派生類普通成員變量(優先級相同,按代碼出現順序依次執行) 6、派生類構造函數 參考文檔:[https://www.zhihu.com/question/49196023](https://www.zhihu.com/question/49196023)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看