类的加载连接和初始化
類的加載、連接和初始化
? 當Java程序中需要使用到某個類時,虛擬機會保證這個類已經(jīng)被加載、連接和初始化。而連接又包含驗證、準備和解析這三個子過程,這個過程必須嚴格的按照順序執(zhí)行。
類的加載
? 通過類的完全限定名(包名和類名)查找此類的字節(jié)碼文件,把類的.class文件中的二進制數(shù)據(jù)讀入到內(nèi)存中,并存放在運行時數(shù)據(jù)區(qū)的方法區(qū)內(nèi)。然后利用字節(jié)碼文件創(chuàng)建一個Class對象,用來封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)并存放在堆區(qū)內(nèi)。這個過程是由類加載器完成的,我們后面會進行詳細講解。
連接
-  驗證:確保被加載類的正確性。class文件的字節(jié)流中包含的信息符合當前虛擬機要求,不會危害虛擬機自身安全。 
-  準備:為類的靜態(tài)變量分配內(nèi)存,并將其初始化為默認值。此階段僅僅只為靜態(tài)類變量(即static修飾的字段變量)分配內(nèi)存,并且設(shè)置該變量的初始值。(比如 static int num=5,這里只將num初始化為0,5的值將會在初始化時賦值)。對于final static修飾的變量,編譯的時候就會分配了,也不會分配實例變量的內(nèi)存。 
-  解析:把類中的符號引用轉(zhuǎn)換為直接引用。符號引用就是一組符號來描述目標,而直接引用就是直接指向目標的指針、相對偏移量或一個間接定位到目標的句柄。(可參考“虛擬機指令”相關(guān)內(nèi)容) 
初始化
? 類加載最后階段,若該類具有父類,則先對父類進行初始化,執(zhí)行靜態(tài)變量賦值和靜態(tài)代碼塊代碼,成員變量也將被初始化。
總結(jié)
以上是生活随笔為你收集整理的类的加载连接和初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Java 扫描并加载包路径下class文
- 下一篇: 根类加载器
