静态方法什么时候执行?_面试官:知道类在什么时候加载吗?
前言
什么情況下會觸發類加載的進行呢?本文將結合代碼demo談談幾種情況,希望對大家有幫助。
類加載時機
什么情況需要開始類加載過程的第一階段:加載?Java虛擬機規范中并沒有進行強制約束,這點可以交給虛擬機的具體實現來自由把握。但是對于初始化階段,虛擬機規范則嚴格規定了以下幾種情況必須立即對類進行初始化,如果類沒有進行過初始化,則需要先觸發其初始化。
創建類的實例
為了驗證類加載,我們先配置一個JVM參數
-XX:+TraceClassLoading 監控類的加載復制代碼在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()方法的那個類會先觸發類加載。
練習與小結
觸發類加載的六大時機,我們都分析完啦,是不是不做個題都覺得意猶未盡呢?接下來,我們來分析類加載一道經典面試題吧。
運行結果:
分析:
原文:https://juejin.im/post/5d872bdfe51d4561eb0b275b
總結
以上是生活随笔為你收集整理的静态方法什么时候执行?_面试官:知道类在什么时候加载吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: swift 组件化_打造完备的iOS组件
- 下一篇: python爬取地图上的经纬度_Pyth