符號引用(class文件中)
在Java中,一個java類將會編譯成- 一個class文件。在編譯時,java類 并不知道所引用的類的實際地址,因此只能使用簽號引用來代替。
比如org. simple.People類引用了org.simple.Language類,在編譯時People類 并不知道Language類的實際內(nèi)存地址,因此只能使用符號org.simple,.Language (假設(shè)是這個,當(dāng)然實際中是由類似于,CONSTANT Class info的常量來表示的)來表示Language類的地址。
直接引用(運行時內(nèi)存中)
直接引用可以是:
1.直接指向且標(biāo)的指釷(比如,指向“類型”[Class對象] 、類變量、類方法的直接引用可能是指向方法區(qū)的指針)
2.相對偏移量(比如,指向?qū)嵗兞?、實例方法的直接引用都是偏移?
3.一個能間接定位到且標(biāo)的句柄。
直接引用是和虛擬機(jī)的布局相關(guān)的,同一個符號引用在不同的虛擬機(jī)實例上翻譯出來的直接引用一般不會相同。如果有了直接引用,那引用的目標(biāo)必定已經(jīng)被加載入內(nèi)存中了。
引用替換的時機(jī)
1、類加載的解析階段(需要將一部分符 號引用轉(zhuǎn)換為直接引用)符號引用替換為直接引用的操作發(fā)生在類加載過程(加載->連接(驗證、準(zhǔn)備、解析) ->初始化)中的解析階段,會將符號引用轉(zhuǎn)換(替換)為對應(yīng)的直接引用,放入運行時常量池中。
2、運行期間(動態(tài)分派)