String str = new String("ABC")

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出来的堆中的字符串…

你可能感兴趣的:(java,虚拟机)