java類的生命週期(一)

目錄

概述

一、加載

二、連接

    2.1驗證  ​   

    2.2準備

    2.3解析

三、初始化

四、使用

五、卸載


概述

java類的生命週期大致會經歷一下幾個階段:加載——>連接——>初始化——>使用——>卸載。其中加載、連接、初始化階段都是在程序“運行”期間(runtime)完成的,這是Java代碼的特點,有很多其他的面嚮對象語言它們的類型的加載、連接階段其實是在程序“編譯”階段完成的,java的這種特性其實爲我們的程序提供了更大的靈活新和更多的可能性,當然這一點對像我這種菜鳥感受可能不是太明顯,但對於一些有創意的大神來說優點就非常明顯,比如對於已經生成的多種文件,我們可以在這些文件“運行”的時候做一些“手腳”,讓這些文件在運行的過程中有機的結合起來,產生1+1>2的效果。下面我們分別就每個階段展開來說一說。

一、加載

我們在不同的開發工具(Eclipse、IDEA等)編寫完Java代碼後,這些IDE會爲我們自動把Java文件編譯爲爲class文件(class文件是二進制數據),並把這些class文件存放到我們電腦某個磁盤中。類的“加載”就是由Java中的類加載器(ClassLoader)去磁盤中查找這些class文件,找到後把它們加載到JVM中(內存中),這就是類的加載過程,可見加載過程還是比較簡單的。

二、連接

連接階段的主要作用是確定類與類之間的關係,比如我們定義了一個Student類,而這個類的成員變量有一個引用類型,如下代碼所示,那麼這個階段就是主要確定Student類和Address類之間是個什麼關係的作用。

class Student{
    int age = 20;
    String name = "zhangsan";
    Address address = new Address("北京");

}

連接這個階段其實可以進一步細分爲如下三個階段:驗證、準備、解析。每一個小的階段都有其不同的職責和任務。

    2.1驗證

        驗證階段的主要作用就是確保被加載的類的正確性,也就是確保第一個階段加載的class文件的正確性。因爲我們知道Java源碼編譯後產生的class文件是放在我們的磁盤中的,我們完全可以找到並打開它後在裏面胡亂改一通。如果你亂改錯了,那麼在這個階段就會被校驗出來。直觀的感受一下某個類的class文件長啥樣:

                    

                 用十六進制工具打開後:

                       

    2.2準備

        爲類的“靜態變量”分配內存,並將其初始化爲“默認值”。這裏需要格外注意一下,假如我們定義的一個類中有如下一個靜態成員變量static int num = 10;準備階段會把num賦值爲int的默認值0,之後(初始化階段)纔會將0修改爲10。

    2.3解析

        這個階段的主要作用就是把類的“符號引用”轉換爲“直接引用”。這裏關於符號引用和直接引用的概念可以簡單的理解爲符號引用就是一種間接的引用方式,它是通過符號的表示來引用一個類,而直接應用就是直接通過內存地址來指向某個類。比如我們在com.classperiod包下創建了一個Student類,前期階段,還不知道類的具體內存地址,只能使用com.classperiod.student來代替student類,com.classperiod.student就稱爲符號引用,而到了解析階段就可以將com.classperiod.student映射成Student類的內存地址,以後就用內存地址來代替Student類,這種使用內存地址來使用類的方法稱爲直接引用。

三、初始化

類的初始話階段就是給類中的static變量賦予正確的值,像我們上面所講的在類的連接中的準備階段,jvm只是給num賦了一個默認值0,而到了初始化階段纔會爲其賦上我們真正定義的值10。

四、使用

使用這個階段我們就很熟悉了,這也是平常和我們程序人員打交道最多的一個階段,像我們平常new一個對象出來、調用類中的方法等等都屬於使用階段。

五、卸載

類在加載的時候把class文件加載到了內存中去,那麼它就會駐留在內存中,卸載的主要作用就是把它從內存中去除掉,當一個類被卸載掉以後我們就不能通過new關鍵字來創建它的對象了。我們在平常的開發中一般很少會接觸到卸載的概念,它只會在一些特殊的場景中用到,我們瞭解即可。

綜上,一個類從加載,到使用,再到最後的被卸載,一共會經歷加載、連接、初始化、使用、卸載這五個完整的階段。最後上一張圖最爲收尾總結:

                     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章