先看下簡單的調用
圖中的代碼:
package test;
public class Main {
String a ="asd";
public void test(){
int a = 4;
}
public static void main(String[] args) {
String b ="asd";
}
}
進行javap -v 進行反編譯後產生的效果爲
在圖中的Constant pool中的#12 #13我們可以看出jvm將String值存儲在常量池中,並且我們可以發現在下面的public static void main(java.lang.String[]) 這個方法中的反編譯爲ldc #12(把常量池中的項壓入棧) 將常量池中的String值取出來並賦值給變量b
下面看String 對象中的值調用
同樣運行javap -v 我們可以發現
常量池中的代碼沒有變
在main主方法中的反編譯爲調用new String(String str)方法並且將str指向常量池中的#12中的值