面試【JAVA基礎】類加載機制


一、類加載過程

1.一、加載

查找和導入class文件。java

1.二、連接
  • 驗證 檢驗載入的class文件的正確性,完整性。api

  • 準備 給類的靜態變量分配存儲空間,會賦對象類型的默認值。數組

  • 解析 將class常量池中的符號引用轉換成直接引用。安全

    符號引用和直接引用的區別:指針

    • 符號引用:java編譯階段不知道所引用的對象的實際地址,使用符號引用來代替
    • 直接引用:可以直接定位到對象的指針,或相對偏移量。能定位到一個對象的內存實際地址。
1.三、初始化

對類的靜態變量,代碼塊執行初始化操做,靜態變量賦值順序根據代碼定義的順序執行。對象

二、類的加載順序

  1. 父類靜態成員變量
  2. 父類靜態代碼塊
  3. 子類靜態成員變量
  4. 子類靜態代碼塊
  5. 父類非靜態成員變量
  6. 父類非靜態代碼塊
  7. 父類構造方法
  8. 子類非靜態成員變量
  9. 子類非靜態代碼塊
  10. 子類構造方法

三、類加載時機

  1. 建立類實例-使用new關鍵字,反射,克隆,反序列化。
  2. 調用類的靜態變量或者靜態方法,或對靜態變量進行賦值操做。
  3. 初始化子類時會先初始化父類。
  4. 虛擬機啓時,包含main方法的啓動類。

注意:blog

  1. 經過數組定義的引用類,不會形成類的初始化。
  2. 訪問類的靜態常量是不會形成類加載的。由於在編譯時期,靜態常量已經放入類的常量池中了。訪問類靜態常量實際上是直接訪問常量池中的常量,不須要加載類。

四、靜態常量是何時賦值的

靜態常量在編譯階段把初始值存入class文件的常量池中,在類的準備階段,將值賦給靜態變量。繼承

五、什麼是雙親委派

1.類加載器包括:BootstrapClassLoader、ExtensionClassLoader、 ApplicationClassLoader、自定義的類加載器。 2.雙親委派模型:若是一個類加載器收到了加載類的請求,首先交給父類加載器進行加載,若是父類加載器加載失敗,當前類纔會本身加載類。 3.雙親委派的做用:避免重複加載,父類已經加載子類不用加載,防止用戶自定義加載器加載java核心的api,帶來安全隱患。 4.一個類是否被加載是經過全類名和命名空間肯定的,命名空間是加載類的加載器名。內存

六、如何自定義類加載器

繼承classloader類,重寫findClass方法。ssl

tencent.jpg

相關文章
相關標籤/搜索