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程序实例,详细解析了String对象的创建过程及其在JVM中的内存分配方式。探讨了字符串常量池的概念及其实现机制,并解释了在Java中如何通过new关键字创建String对象。
428

被折叠的 条评论
为什么被折叠?



