Java類從加載到虛擬機內存中開始,到卸載出內存為止,它的整個生命周期包括,加載 ,驗證 , 准備 , 解析 , 初始化 ,卸載 ,總共七個階段。其中驗證 ,准備 , 解析 統稱為連接。
而在解析階段會有一個步將常量池當中二進制數據當中的符號引用轉化為直接引用的過程。
符號引用 :符號引用以一組符號來描述所引用的目標。符號引用可以是任何形式的字面量,只要使用時能無歧義地定位到目標即可,符號引用和虛擬機的布局無關。個人理解為:在編譯的時候一個每個java類都會被編譯成一個class文件,但在編譯的時候虛擬機並不知道所引用類的地址,多以就用符號引用來代替,而在這個解析階段就是為了把這個符號引用轉化成為真正的地址的階段。
public class Test{
public static void main() {
String s=”adc”;
System.out.println(“s=”+s);
}
}

這個代碼中在編譯的時候對應的s會被解析成為符號引用,
public class Test{
public static void main() {
System.out.println(“s=”+”abc”);
}
}

而這段代碼執行的時候會直接解析成直接引用。
直接引用 :直接引用和虛擬機的布局是相關的,不同的虛擬機對於相同的符號引用所翻譯出來的直接引用一般是不同的。如果有了直接引用,那么直接引用的目標一定被加載到了內存中。
直接引用可以是:
1:直接指向目標的指針。(個人理解為:指向對象,類變量和類方法的指針)
2:相對偏移量。 (指向實例的變量,方法的指針)
3:一個間接定位到對象的句柄。
