java构造器_Java类加载的过程
大家好,我是你們的導師,經常看我朋友圈的同學應該知道,我每天會在微信上給大家免費提供以下服務!
1、長期為你提供最優質的學習資源!
2、給你解決技術問題!
3、每天在朋友圈里分享優質的技術文章!
4、每周1、3、5送紙質書籍免費送給大家,每年至少送書800本書!
5、為大家推薦靠譜的就業單位!
請注意!我上面說的5點全部都是免費的!全網你應該找不到第二家吧!
當然,大家在我私人微信上問我問題,僅限回答web前端、java相關的。
---------------------------
好了,接下來開始今天的技術分享!上次老師跟大家分享了ArrayList底層原理及實現的知識,今天跟大家分享下Java類加載的過程的知識。
1?類的生命期
當程序要使用某個類時,如果該類還未被加載到內存中,則系統會通過加載,連接,初始化三步來實現這個類進行初始化。可以看到類的生命周期包含了加載、驗證、準備、解析、初始化、使用、卸載七個步驟,其中驗證、準備和解析可以叫做一步連接。其中類的加載過程是前面的3步,加載、驗證、準備、解析和初始化。
1.?加載
加載,是指Java虛擬機查找字節流(查找.class文件),并且根據字節流創建java.lang.Class對象的過程。這個過程,將類的.class文件中的二進制數據讀入內存,放在運行時區域的方法區內。然后在堆中創建java.lang.Class對象,用來封裝類在方法區的數據結構。
類加載階段:
(1)Java虛擬機將.class文件讀入內存,并為之創建一個Class對象。
(2)任何類被使用時系統都會為其創建一個且僅有一個Class對象。
(3)這個Class對象描述了這個類創建出來的對象的所有信息,比如有哪些構造方法,都有哪些成員方法,都有哪些成員變量等。
Student類加載過程圖示:
2.鏈接
鏈接包括驗證、準備以及解析三個階段。
(1)驗證階段。主要的目的是確保被加載的類(.class文件的字節流)滿足Java虛擬機規范,不會造成安全錯誤。
(2)準備階段。負責為類的靜態成員分配內存,并設置默認初始值。
(3)解析階段。將類的二進制數據中的符號引用替換為直接引用。
說明:
符號引用。即一個字符串,但是這個字符串給出了一些能夠唯一性識別一個方法,一個變量,一個類的相關信息。
直接引用。可以理解為一個內存地址,或者一個偏移量。比如類方法,類變量的直接引用是指向方法區的指針;而實例方法,實例變量的直接引用則是從實例的頭指針開始算起到這個實例變量位置的偏移量。
舉個例子來說,現在調用方法hello(),這個方法的地址是0xaabbccdd,那么hello就是符號引用,0xaabbccdd就是直接引用。
在解析階段,虛擬機會把所有的類名,方法名,字段名這些符號引用替換為具體的內存地址或偏移量,也就是直接引用。
3.初始化
初始化,則是為標記為常量值的字段賦值的過程。換句話說,只對static修飾的變量或語句塊進行初始化。
如果初始化一個類的時候,其父類尚未初始化,則優先初始化其父類。
如果同時包含多個靜態變量和靜態代碼塊,則按照自上而下的順序依次執行。
2?對象的初始化順序
首先對象初始化會有幾個東西,構造函數,構造代碼塊,靜態代碼塊,靜態變量,對于構造函數,構造函數只會初始化一次,用來初始化對象,構造方法只會調用一次,對象的方法可以重復調用,對于構造方法塊,同構造方法一樣只會在new的時候執行一次,也是用來初始化對象的,對于靜態代碼塊,是給類進行初始化的,只會在類初始化的時候執行一次,對于靜態變量,也只會在類初始化的時候初始化一次。
對于一個類,這幾個的順序如下,靜態變量和代碼塊優先于構造代碼塊優先于構造函數。對于有繼承的情況,這幾個的順序如下,父類靜態變量、代碼塊優先于自雷靜態變量、代碼塊優先于父類變量、構造代碼塊、構造方法優先于子類變量、構造代碼塊、構造方法。
3?類加載器
類加載器用于實現類的加載,java中分為了三種類加載器,啟動類加載器,拓展類加載器,應用程序類加載器,其中啟動類加載器是由C++編寫,用于加載JAVA_HOME>\lib目錄下的類,也就是我們用到的基本的像String什么的都是這個加載器加載的。
然后是拓展類加載器是用于加載<JAVA_HOME>\lib\ext中的類,這個目錄下的類不常用到,最后應用程序類加載器是加載用戶自己實現的類。接下來介紹下類加載器的雙親委派模型,圖示:
雙親委派模型體現了類加載器之間的層次模型,除了啟動類加載器外,每個加載器都有自己的父加載器,
工作過程如下:如果類加載器收到了類加載的請求,那么會將這個請求一層一層的傳遞到父加載器中,當父加載器反饋自己不能加載的時候才會有這個加載器加載,這樣的好處是,避免一個類被多個加載器重復加載,并且由于不同加載器加載的類是不一樣的,導致程序混亂。
4?總結
類加載過程只是一個類生命周期的一部分,在其前,有編譯的過程,只有對源代碼編譯之后,才能獲得能夠被虛擬機加載的字節碼文件;在其后還有具體的類使用過程,當使用完成之后,還會在方法區垃圾回收的過程中進行卸載(垃圾回收)。
今天就分享這么多,關于Java類加載的過程,你學會了多少?歡迎在留言區評論,對于有價值的留言,我們都會一一回復的。如果覺得文章對你有一丟丟幫助,請點右下角【在看】,讓更多人看到該文章。
總結
以上是生活随笔為你收集整理的java构造器_Java类加载的过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python内存池机制_看过来啦!教你用
- 下一篇: 学云计算能干什么_陌陌主播等级计算?陌陌