面試官:知道類在什麼時候加載嗎?


面試官:知道類在什麼時候加載嗎?

前言

什麼情況下會觸發類加載的進行呢?本文將結合代碼demo談談幾種情況,希望對大家有幫助。

類加載時機

什麼情況需要開始類加載過程的第一階段:加載?Java虛擬機規範中並沒有進行強制約束,這點可以交給虛擬機的具體實現來自由把握。但是對於初始化階段,虛擬機規範則嚴格規定了以下幾種情況必須立即對類進行初始化,如果類沒有進行過初始化,則需要先觸發其初始化。

面試官:知道類在什麼時候加載嗎?

創建類的實例

為了驗證類加載,我們先配置一個JVM參數

<code>-XX:+TraceClassLoading 監控類的加載
複製代碼/<code>

在IDE配置如下:

面試官:知道類在什麼時候加載嗎?

demo代碼:

面試官:知道類在什麼時候加載嗎?

運行結果:

面試官:知道類在什麼時候加載嗎?

結論:

new ClassLoadInstance實例時,發現ClassLoadInstance被加載了,因此 new創建實例對象,會觸發類加載進行。

訪問類的靜態變量

demo代碼:

面試官:知道類在什麼時候加載嗎?

運行結果:

面試官:知道類在什麼時候加載嗎?

結論:

訪問類ClassLoadStaticVariable的靜態變量i時,發現ClassLoadStaticVariable類被加載啦,因此訪問類的靜態變量會觸發類加載。

注意:

訪問final修飾的靜態變量時,不會觸發類加載,因為在編譯期已經將此常量放在常量池了。

訪問類的靜態方法

demo代碼:

面試官:知道類在什麼時候加載嗎?

運行結果:

面試官:知道類在什麼時候加載嗎?

結論:

訪問類ClassLoadStaticMethod的靜態方法method時,發現ClassLoadStaticMethod類被加載啦,因此訪問類的靜態方法會觸發類加載。

反射

demo代碼:

面試官:知道類在什麼時候加載嗎?

運行結果:

面試官:知道類在什麼時候加載嗎?

結論:

反射得到類ClassLoadStaticReflect時,發現ClassLoadStaticReflect類被加載啦,因此反射會觸發類加載。

當初始化一個類時,發現其父類還未初始化,則先觸發父類的初始化

demo代碼:

面試官:知道類在什麼時候加載嗎?

運行結果:

面試官:知道類在什麼時候加載嗎?

看了運行結果,是不是發現,網上那道經典面試題(講講類的實例化順序?)也很清晰啦。 先父類靜態變量/靜態代碼塊-> 再子類靜態變量/靜態代碼塊->父類構造器->子類構造器結論:

實例化子類ClassLoadSub的時候,發現父類ClassLoadSuper先被加載,因此當初始化一個類時,發現其父類還未初始化,則先觸發父類的初始化

虛擬機啟動時,定義了main()方法的那個類先初始化

demo代碼:

面試官:知道類在什麼時候加載嗎?

運行結果:

面試官:知道類在什麼時候加載嗎?

結論:

虛擬機啟動時,即使有ClassLoadSub,ClassLoadSuper,ClassLoadTest等類被加載, 但ClassLoadTest最先被加載,即定義了main()方法的那個類會先觸發類加載。

練習與小結

觸發類加載的六大時機,我們都分析完啦,是不是不做個題都覺得意猶未盡呢?接下來,我們來分析類加載一道經典面試題吧。

面試官:知道類在什麼時候加載嗎?

運行結果:

面試官:知道類在什麼時候加載嗎?

分析:

  1. SingleTon.getInstance(),調用靜態方法,觸發SingleTon類加載。
  2. SingleTon類加載初始化,按順序初始化靜態變量。
  3. 先執行private static SingleTon singleTon = new SingleTon(); ,調用構造器後,count1,count2均為1;
  4. 按順序執行 public static int count1; 沒有賦值,所以count1依舊為1;
  5. 按順序執行 public static int count2 = 0;所以count2變為0.

Java最全面試手冊(性能優化+微服務架構+併發編程+開源框架)

Java面試手冊

一、性能優化面試專欄

1.1、 tomcat性能優化整理

面試官:知道類在什麼時候加載嗎?


1.2、JVM性能優化整理

面試官:知道類在什麼時候加載嗎?


1.3、Mysql性能優化整理

面試官:知道類在什麼時候加載嗎?


二、微服務架構面試專欄

2.1、SpringCloud面試整理

面試官:知道類在什麼時候加載嗎?


2.2、SpringBoot面試整理

面試官:知道類在什麼時候加載嗎?


2.3、Dubbo面試整理


面試官:知道類在什麼時候加載嗎?

三、併發編程高級面試專欄

面試官:知道類在什麼時候加載嗎?

四、開源框架面試題專欄

4.1、Spring面試整理

面試官:知道類在什麼時候加載嗎?


4.2、SpringMVC面試整理

面試官:知道類在什麼時候加載嗎?


4.3、MyBatis面試整理

面試官:知道類在什麼時候加載嗎?


五、分佈式面試專欄

5.1、分佈式限流面試整理.

面試官:知道類在什麼時候加載嗎?


5.2、分佈式通訊面試整理

面試官:知道類在什麼時候加載嗎?


5.3、分佈式數據庫面試整理

面試官:知道類在什麼時候加載嗎?


正文

一、性能優化專欄

1.1、tomcat性能優化整理

面試官:知道類在什麼時候加載嗎?

二,微服務架構面試專欄

1、SpringCloud面試整理

1、什麼是Spring Cloud?

Spring cloud流應用程序啟動器是基於Spring Boot的Spring集成應用程序,提供與外部系統的集成。Spring cloud Task,一個生 命週期短暫的微服務框架,用於快速構建執行有限數據處理的應用程序。


面試官:知道類在什麼時候加載嗎?


面試官:知道類在什麼時候加載嗎?

資料過多就不給大家一一展示了 獲取這份面試手冊的轉發+關注+私信小編(學習)免費獲取哦!


分享到:


相關文章: