一、類的加載可以分為加載、連接、初始化 三個步驟
類的加載:
- 1、類的加載指的是將類的class文件加載到內存中,並且為之創建一個java.lang.Class對象。
- 2、JVM提供類加載器去加載類。JVM提供的類加載器通常稱為系統類加載器,可以繼承ClassLoader基類去創建自己的類加載器。
- 3、程序中所有的類實際上也是實例,他們都是java.lang.Class實例。
- 4、使用不同的類加載器可以從不同來源來加載類的二進制數據(本地文件系統、JAR包、網絡、java源文件動態編譯進行加載)。
類的連接:
- 1、連接階段負責把類的二進制文件數據合並到JRE中。
- 2、可以分為三個階段:
- 驗證:驗證類結構,是否和其他類協調一致。
- 准備:為類的類變量分配內存,設置默認初始值。
- 解析:將類的二進制文件中的符號引用替換為直接引用。
類的初始化:
- 1、主要對類變量初始化,(聲明類變量時指定初始值、使用靜態初始化塊)。
- 2、步驟:
- 當這個類沒有加載和連接,則先加載並且連接。
- 當這個類的直接父類沒有被初始化,則先初始化。
- 當類中有初始化語句,則系統依次執行初始化語句。
- 3、類初始化時機:
- 創建類的實例(new、反射、反序列化)。
- 調用某個類的靜態方法。
- 訪問某個類或者接口的類變量,或者為該類變量賦值。
- 初始化某個類的子類。
注意:對於一個final型的類變量,如果在編譯時期能確定其值,則java編譯器在編譯時期就會在這個類變量出現的地方替換成它的值。那么程序使用該
靜態變量也不是導致初始化。
二、類加載器
- 1、一旦一個類被加載到JVM中,同一個類就不會被載入了,這里同一個類是指:
一個類用全限定類名作為標識,在jvm中,一個類用全限定類名和其類加載器作為唯一標識,
- 2、JVM啟動時會形成三個類加載器組成的初始類加載器層次結構:
- Bootstrap ClassLoader :根類加載器,負責加載Java的核心類比如rt.jar,由jvm自身實現,不是java.lang.ClassLoader的子類。
- Extension ClassLoader : 擴展類加載器,負責加載jre的擴展目錄,.\jre1.8.0_181\lib\ext 中的類。
- System ClassLoader :系統類加載器,負責加載由CLASSPATH環境變量所指定的jar包和類路徑。
- 3、類加載機制:
- 全盤負責:當一個類加載器負責一個類的加載時,該類所依賴的和引用的其他類也將由該類加載器負責載入,除非顯示聲明。
- 父類委托:嘗試讓父類加載器加載,當父類加載器無法加載時才讓從自己的類路徑中加載。
- 緩存機制:所有加載過的Class都會被緩存。
