public class Test{
public static void main(String[] args) {
String str=new String("ABC");
}
}
它的虚拟机指令集:
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2; //class java/lang/String
3: dup
4: ldc #3; //String ABC
6: invokespecial #4; //Method java/lang/String."<init>":(Ljava/lang/String;)V
9: astore_1
10: return
}
看看main方法里的操作,
new String()//这是 你要创建的对象
ldc #3;//String ABC 这是池中的对象
java里面的对象都是放在heap中,引用是可以放到stack中的,String str=new String("ABC");在编绎时会把"ABC"作为常量放到类的常量池中,运行时调用new指令时会再在堆中产生一个String类型的对象,把常量池中的"ABC"的值复制过来,然后让str指向堆中的String对象,所以应该是两个对象,一个是String类的Class对象中的常量字符串对象,一个是new出来的堆中的字符串…