为什么 String str = new String("ABC"); 会创建2个对象? 为什么 String str = new String("ABC"); 会创建2个对象?请详细解答内存过程, 谢谢~! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 此回复为自动发出,仅用于显示而已,并无任何其他特殊作用楼主【ABC123CBA321】截止到2008-07-16 11:56:59的历史汇总数据(不包括此帖):发帖的总数量:26 发帖的总分数:535 每贴平均分数:20 回帖的总数量:26 得分贴总数量:2 回帖的得分率:7% 结贴的总数量:19 结贴的总分数:480 无满意结贴数:0 无满意结贴分:0 未结的帖子数:7 未结的总分数:55 结贴的百分比:73.08 % 结分的百分比:89.72 % 无满意结贴率:0.00 % 无满意结分率:0.00 % 楼主加油 先在STRING POOL中创建ABC 然后在HEAP中创建 NEW STRING("") 一个在栈内存中,new 的那个在堆内存中 看看这个例子就明白了: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: returnpublic 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出来的堆中的字符串… 如果代码是这样的话String str=new String("ABC")就创建一次了,呵呵,刚刚学到的public class Test{ public static void main(String[] args) { String a = "ABC"; String str=new String("ABC"); }} java 包的问题 jframe和frame的区别 小弟初来,CSDN有没有程序发布平台 long型能作为switch因子嘛 急求《Thinking in java》英文电子书! 问一个简单问题?(如何获得和修改文件名) J2SE设置软件全屏后黑屏 用新版sun虚拟机,为什么找不到类了? Think in Java 大讨论一 ( 关于 Inner class ) 谁有JPad,JCreator的注册码? 如何访问一个类的静态内部类 如何才能获取TABLE控件中某一格的信息
楼主【ABC123CBA321】截止到2008-07-16 11:56:59的历史汇总数据(不包括此帖):
发帖的总数量:26 发帖的总分数:535 每贴平均分数:20
回帖的总数量:26 得分贴总数量:2 回帖的得分率:7%
结贴的总数量:19 结贴的总分数:480
无满意结贴数:0 无满意结贴分:0
未结的帖子数:7 未结的总分数:55
结贴的百分比:73.08 % 结分的百分比:89.72 %
无满意结贴率:0.00 % 无满意结分率:0.00 %
楼主加油
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: returnpublic 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出来的堆中的字符串…
public static void main(String[] args) {
String a = "ABC";
String str=new String("ABC");
}
}