一、類的加載過程
綜述:
1.加載
2.連接
(2.1)驗證
(2.2)準備
(2.3)解析
3.初始化
1. 加載(二、類的加載器class的作用)
- 一、ClassLoader類加載器的作用:
- 將編譯器生成的.class文件加載到內存中,
- 將硬盤中的靜態數據轉化爲內存中方法區的動態數據
就是下圖的過程.classLoader
2. 鏈接(2.2準備
很重要)
2.1.驗證(就是判斷編譯是否能通過.)
(1)保證加載進來的字節流符合JVM的規範,不會造成安全錯誤
(2)驗證文件格式:比如常量final中是否有不支持的常量,文件是否規範
(3)驗證元數據:是否有繼承被final修飾的類(有就報錯error),類中的字段,方法是否和父類衝突,是否出現不合理的重載Override
(4) 對字節碼的驗證,保證程序語義的合理性,比如保證轉換類型的合理(比如 int 賦值給 short 就報錯)
(5)對符號引用的 驗證,
2.2.準備(重要
!)
(1)給類變量(static修飾的)(不是實例變量非static修飾)分配內存**(方法區
),初始化默認值(private static int age = 0 )
類變量實例變量局部變量的區別
(2)方法區
(3)常量:常量儲存在方法區,且默認值爲自定的值
**(private static final float PI = 3.14f)
2.3.解析(將常量池中的符號引用替換爲直接引用)
(1)符號引用:就是 final float PI 中的 PI 就是符號
(2)直接引用:final float PI 的 PI的方法區的地址2341410x 就是直接引用
(3)解析階段,JVM會吧所有的類名,方法名,字段名,的符號引用替換爲內存地址的直接引用。
3.初始化 (重要)
只對static修飾的變量、或者static修飾的代碼塊{}構造代碼塊、初始化(private static int age = 18)
- 初始化一個類的時候能如果父類沒有初始化,就先初始化父類
- 如果同時多個靜態代碼塊(構造代碼塊)或者靜態變量 按順序 初始化.
注意區別構造函數 Person() 的初始化是在 運行期間 new 的時候 初始化實例的 ,這個static 構造代碼塊的初始化是在 類加載的時候運行的 .
二、什麼是類加載器ClassLoader?
https://blog.csdn.net/xyang81/article/details/7292380
1. 作用
* 一、ClassLoader類加載器的作用:
* 1. 將編譯器生成的.class文件加載到內存中,
* 將硬盤中的靜態數據轉化爲內存中方法區的動態數據
2.上圖
哪個紅裏透綠的就是類加載器ClassLoader了
3.類的緩存機制
* 二、類的緩存機制:
* 1. 標準的JavaSE類加載器可以按要求查找類,但一旦某個類被加載到類加載器中,
* 它將維持一段時間,(緩存)不過就JVM的垃圾回收機制可以回收這些Class對象。
* `
類加載器的分類:
1. 分類3
* 三、ClassLoader分類
* 1. 引導類加載器null:--------- 核心內褲
* 負責Java的核心自帶類庫,無法使用方法直接獲取 rt.jar
*
* 2. (平臺)加載器Platform:-----------ext/拓展內褲
* jre/lib/ext 目錄下的jar包
*
* 3. (應用)加載器App,------自己寫的類
* 加載自所有權限public --private類,最常用。
* `