類加載器個人總結

類加載器的意義:

.java文件編譯後變成.class文件,保留着虛擬機指令,當某個類需要被加載的時候,虛擬機加載他的.class文件,並創建class對象,放到內存中


類加載過程:

加載:沒什麼好說的

驗證:報錯應該是在這裏產生的

準備:爲類變量分配內存並設置該類變量的初始值(注:實例變量會隨着對象一起分配到堆中)(static int i= 3 在這裏時 初始化int =0 在初始化時在賦值)

解析:將常量池中的符號引用替換成直接引用的過程(個人理解 int  a = 2 ;2在常量池中,這一步去掉a的引用,直接去常量池中引用2)

初始化:對其父類初始化,對成員變量賦值

(感覺以上不用掌握,瞭解即可)


啓動/引導(Bootstrap)類加載器

加載jvm自身需要的類

擴展(Extension)類加載器

加載擴展庫(額外的jar?)

系統(System)類加載器

加載classpath


(圖網上找的,侵刪)


一個重要的概念:雙親委派模式

當一個類需要再加的時候,先去加載他的父類,如果父類還有父類,則先去加載爺爺類。如果某個父類無法加載,則子加載器纔會嘗試自己去加載

(這應該是java單繼承的原因)

補充一道面試題:

能否定義String類

答案,可以,但是不能寫一個java.lang.String 

原因  java.lang不會加載,因爲雙親委派模式(會在啓動類加載器加載String ,不會加載你自己寫的,而且你也不能寫java.lang 會報錯)


  • 啓動類加載器,由C++實現,沒有父類。

  • 拓展類加載器(ExtClassLoader),由Java語言實現,父類加載器爲null

  • 系統類加載器(AppClassLoader),由Java語言實現,父類加載器爲ExtClassLoader

  • 自定義類加載器,父類加載器肯定爲AppClassLoader。


發佈了48 篇原創文章 · 獲贊 22 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章