日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

静态方法什么时候执行?_面试官:知道类在什么时候加载吗?

發布時間:2025/3/20 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 静态方法什么时候执行?_面试官:知道类在什么时候加载吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

什么情況下會觸發類加載的進行呢?本文將結合代碼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()方法的那個類會先觸發類加載。

練習與小結

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

運行結果:

分析:

  • SingleTon.getInstance(),調用靜態方法,觸發SingleTon類加載。
  • SingleTon類加載初始化,按順序初始化靜態變量。
  • 先執行private static SingleTon singleTon = new SingleTon(); ,調用構造器后,count1,count2均為1;
  • 按順序執行 public static int count1; 沒有賦值,所以count1依舊為1;
  • 按順序執行 public static int count2 = 0;所以count2變為0.
  • 原文:https://juejin.im/post/5d872bdfe51d4561eb0b275b

    總結

    以上是生活随笔為你收集整理的静态方法什么时候执行?_面试官:知道类在什么时候加载吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。