摘要:一多個類的初始化在進入正文前首先根據上面的例子試圖猜測為了類中的函數能夠運行需要做哪些前置工作呢這些工作是以什么順序展開的呢為了更好的描述多個類的情形可以先試圖描述一個更簡單的例子把行和行和行注釋掉二類從到一句話把類從介質中復制到方法區通過
一)Example: 多個類的初始化
package me; class A { static int a = 1; static { a = 2; System.out.print("A init"); } static int getA(){ return a; } } class B extends A{ static int b = 1; static { b = 2; System.out.print("B init"); } } class Main { static public void main(String... args){ System.out.print(A.a);//0 System.out.print(B.a);//1 System.out.print(B.getA());//2 System.out.print(B.b);//3 } }
在進入正文前,首先根據上面的例子試圖猜測:為了Main類中的main()函數能夠運行,JVM需要做哪些前置工作呢?這些工作是以什么順序展開的呢?
為了更好的描述多個類的情形,可以先試圖描述一個更簡單的例子:把行1和行2和行3注釋掉.
一句話: 把類從介質中復制到JVM方法區,通過各種規則驗證和符號解析,最后根據程序員的邏輯賦值或其他語句完成初始化
Step1.類的加載(Loading)加載是把存儲類的實體從各類介質(文件/網絡/數據庫/內存中實時生成等)加載到JVM的方法區中的過程,主要包含2步:
根據類的全限定名"me.B"通過 _ApplicationClassLoader_(或者是自己定義的ClassLoader)獲得B類的二進制流
把流讀入內存中,并轉化為JVM規定的方法區結構,生成對應的java.lang.Class對象
現在,你可以在程序中訪問到這個類~(≧▽≦)/~啦
Step2.類的連接(Linking)JVM中的連接細分為獨立的3步:驗證/準備/解析
驗證和準備的開始是有嚴格的順序的,但是JVM可以自由選擇解析發生的時機,甚至放到初始化之后
Step3.驗證(Validation)連接可以理解為把源代碼轉化為可執行程序的過程,當然不同于C/C++連接生成的.exe程序,JVM中的可執行程序一般是字節碼(bytecode)程序
驗證過程較為復雜,JVM主要驗證了class文件格式/java語義限制/java程序邏輯正確性和安全性,其主要技術為靜態的字節碼分析,所以不能保證100%的可靠
Step4.準備(Preparation)為me.B類中的靜態變量int b在堆中分配內存,并設置其初始值0
Step5.解析(Resolution)簡單地說,是將符號引用轉化為直接引用的過程,所有符號引用都必須轉化為直接引用
Step6.類的初始化(Initialization)符號引用: 如方法名/變量名/類等等的符號
直接引用: 直接指向一塊內存區域
在初始化之前,程序已經可以在內存中訪問到me.B類和其類變量了
初始化所做的事情也很簡單:JVM從上到下收集類變量賦值語句和類靜態初始化塊中的語句,把它放到JVM生成的
對于初始化的時機,JVM有嚴格的規范:只有在主動引用時才會觸發類的初始化
主動引用有5種情況:大致可以理解為以下幾種
以各種方式讀靜態變量/寫靜態變量/觸發靜態方法時(包括出現相應的字節碼指令/反射/invokedynamic)類卻沒有初始化
包含入口方法main()的類
初始化子類時父類還沒初始化
其他情況都是被動引用
可以看到,me.B的
b = 1; b = 2; System.out.print("B init");三)類:從1到n再到0 類的使用(Using)
類的實例化過程,包括new/反射等方法
類的卸載(Unloading)當程序中無論什么方法都無法引用該類時,類從方法區被回收,大致可以理解為
類的所有實例被回收
類的ClassLoader被回收
沒有地方引用Class對象,也無法通過反射訪問
四)Example:執行過程簡述回到最初的例子,可以列出預計的執行順序為:
初始化me.Main
加載me.B
初始化me.A: 輸出"A init"
System.out.print(A.a);:輸出2
System.out.print(B.a);:輸出2
System.out.print(B.getA());:輸出2
初始化me.B:輸出"B init"
System.out.print(B.b);:輸出2
實際執行結果驗證:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67281.html
摘要:原文地址游客前言金三銀四,很多同學心里大概都準備著年后找工作或者跳槽。最近有很多同學都在交流群里求大廠面試題。 最近整理了一波面試題,包括安卓JAVA方面的,目前大廠還是以安卓源碼,算法,以及數據結構為主,有一些中小型公司也會問到混合開發的知識,至于我為什么傾向于混合開發,我的一句話就是走上編程之路,將來你要學不僅僅是這些,豐富自己方能與世接軌,做好全棧的裝備。 原文地址:游客kutd...
摘要:極力推薦文章歡迎收藏干貨分享閱讀五分鐘,每日十點,和您一起終身學習,這里是程序員本篇文章主要介紹開發中的部分知識點,通過閱讀本篇文章,您將收獲以下內容生命周期簡介必須在中注冊啟動的方法啟動帶返回值的結束方法狀態保存,恢復的方法面 showImg(https://upload-images.jianshu.io/upload_images/5851256-0b56fc8e812963d7...
摘要:并總結經典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關注微信小程序的開發和面試問題,由基礎到困難循序漸進,適合面試和開發小程序。并總結vue React html css js 經典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...
閱讀 1047·2021-10-11 10:59
閱讀 3601·2021-09-26 09:55
閱讀 891·2019-08-30 15:55
閱讀 2649·2019-08-30 15:44
閱讀 433·2019-08-30 14:06
閱讀 679·2019-08-30 11:26
閱讀 3335·2019-08-30 10:49
閱讀 2466·2019-08-29 12:53