亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

【Java】類的生命周期簡述

qpwoeiru96 / 535人閱讀

摘要:一多個類的初始化在進入正文前首先根據(jù)上面的例子試圖猜測為了類中的函數(shù)能夠運行需要做哪些前置工作呢這些工作是以什么順序展開的呢為了更好的描述多個類的情形可以先試圖描述一個更簡單的例子把行和行和行注釋掉二類從到一句話把類從介質中復制到方法區(qū)通過

一)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
    }
}

在進入正文前,首先根據(jù)上面的例子試圖猜測:為了Main類中的main()函數(shù)能夠運行,JVM需要做哪些前置工作呢?這些工作是以什么順序展開的呢?
為了更好的描述多個類的情形,可以先試圖描述一個更簡單的例子:把行1和行2和行3注釋掉.

二)類:從0到1

一句話: 把類從介質中復制到JVM方法區(qū),通過各種規(guī)則驗證和符號解析,最后根據(jù)程序員的邏輯賦值或其他語句完成初始化

Step1.類的加載(Loading)

加載是把存儲類的實體從各類介質(文件/網(wǎng)絡/數(shù)據(jù)庫/內存中實時生成等)加載到JVM的方法區(qū)中的過程,主要包含2步:

根據(jù)類的全限定名"me.B"通過 _ApplicationClassLoader_(或者是自己定義的ClassLoader)獲得B類的二進制流

把流讀入內存中,并轉化為JVM規(guī)定的方法區(qū)結構,生成對應的java.lang.Class對象

現(xiàn)在,你可以在程序中訪問到這個類~(≧▽≦)/~啦

Step2.類的連接(Linking)

JVM中的連接細分為獨立的3步:驗證/準備/解析
驗證和準備的開始是有嚴格的順序的,但是JVM可以自由選擇解析發(fā)生的時機,甚至放到初始化之后

連接可以理解為把源代碼轉化為可執(zhí)行程序的過程,當然不同于C/C++連接生成的.exe程序,JVM中的可執(zhí)行程序一般是字節(jié)碼(bytecode)程序

Step3.驗證(Validation)

驗證過程較為復雜,JVM主要驗證了class文件格式/java語義限制/java程序邏輯正確性和安全性,其主要技術為靜態(tài)的字節(jié)碼分析,所以不能保證100%的可靠

Step4.準備(Preparation)

me.B類中的靜態(tài)變量int b在堆中分配內存,并設置其初始值0

Step5.解析(Resolution)

簡單地說,是將符號引用轉化為直接引用的過程,所有符號引用都必須轉化為直接引用

符號引用: 如方法名/變量名/類等等的符號
直接引用: 直接指向一塊內存區(qū)域

Step6.類的初始化(Initialization)

在初始化之前,程序已經可以在內存中訪問到me.B類和其類變量了

初始化所做的事情也很簡單:JVM從上到下收集類變量賦值語句和類靜態(tài)初始化塊中的語句,把它放到JVM生成的()方法中,再執(zhí)行之

對于初始化的時機,JVM有嚴格的規(guī)范:只有在主動引用時才會觸發(fā)類的初始化

主動引用有5種情況:大致可以理解為以下幾種

以各種方式讀靜態(tài)變量/寫靜態(tài)變量/觸發(fā)靜態(tài)方法時(包括出現(xiàn)相應的字節(jié)碼指令/反射/invokedynamic)類卻沒有初始化

包含入口方法main()的類

初始化子類時父類還沒初始化
其他情況都是被動引用

可以看到,me.B()方法中執(zhí)行了下列代碼:

b = 1;
b = 2;
System.out.print("B init");
三)類:從1到n再到0 類的使用(Using)

類的實例化過程,包括new/反射等方法

類的卸載(Unloading)

當程序中無論什么方法都無法引用該類時,類從方法區(qū)被回收,大致可以理解為

類的所有實例被回收

類的ClassLoader被回收

沒有地方引用Class對象,也無法通過反射訪問

四)Example:執(zhí)行過程簡述

回到最初的例子,可以列出預計的執(zhí)行順序為:

初始化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

實際執(zhí)行結果驗證:

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/67281.html

相關文章

  • 金三銀四,2019大廠Android高級工程師面試題整理

    摘要:原文地址游客前言金三銀四,很多同學心里大概都準備著年后找工作或者跳槽。最近有很多同學都在交流群里求大廠面試題。 最近整理了一波面試題,包括安卓JAVA方面的,目前大廠還是以安卓源碼,算法,以及數(shù)據(jù)結構為主,有一些中小型公司也會問到混合開發(fā)的知識,至于我為什么傾向于混合開發(fā),我的一句話就是走上編程之路,將來你要學不僅僅是這些,豐富自己方能與世接軌,做好全棧的裝備。 原文地址:游客kutd...

    tracymac7 評論0 收藏0
  • Activity 使用詳解

    摘要:極力推薦文章歡迎收藏干貨分享閱讀五分鐘,每日十點,和您一起終身學習,這里是程序員本篇文章主要介紹開發(fā)中的部分知識點,通過閱讀本篇文章,您將收獲以下內容生命周期簡介必須在中注冊啟動的方法啟動帶返回值的結束方法狀態(tài)保存,恢復的方法面 showImg(https://upload-images.jianshu.io/upload_images/5851256-0b56fc8e812963d7...

    Caicloud 評論0 收藏0
  • 前端面試題總結(js、html、小程序、React、ES6、Vue、算法、全棧熱門視頻資源)

    摘要:并總結經典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關注微信小程序的開發(fā)和面試問題,由基礎到困難循序漸進,適合面試和開發(fā)小程序。并總結vue React html css js 經典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...

    pumpkin9 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<