public class S{
   public static void main(String[] args){
   StringBuilder sb=new StringBuilder("abc");
   }
}javap后new       #2; //class java/lang/StrinbBuilder
dup   
ldc       #3; //String abc
invokespecial    #4; //Method java/lang/StringBuilder "<init>":(Ljava/lang/String;)V
astore_1
return
问题:
为什么要有dup,dup意思为:This pops the top single-word value off the operand stack, and then pushes that value twice - i.e. it makes an extra copy of the top item on the stack.
ldc后栈内都有那些元素
invokespecial是怎么进行的,简明说下
还有#2 #3都是啥意思
谢谢大家了

解决方案 »

  1.   

    #2; //class java/lang/StrinbBuilder 
     是说这里调用了lang包(这个包是默认导入的)中的StrinbBuilder  #3; //String abc 
     是说建立了一个String(字符串)类型的实例对象 它的值是 abc其他的还没看明白
      

  2.   

    请查看Java Vitual Machine Specification
      

  3.   

    熟悉Java Vitual Machine Specification,来看看吧
      

  4.   

    dup是复制栈顶的引用。
    new      #2; //class java/lang/StrinbBuilder,通过new得到的StringBuilder类型的引用放在栈顶
    dup    //复制一份,注意现在栈顶上的两个单元都是这个引用了。
    ldc      #3; //String abc 从常量池里获取String abc
    invokespecial    #4; //Method java/lang/StringBuilder " <init>":(Ljava/lang/String;)V  调用StringBuilder的构造方法,注意这里是用栈顶dup的引用来调用方法,上面加载的 “abc”作为参数。方法执行完之后,参数出栈。这时候栈顶还有一个StringBuilder的引用,供下面使用
    astore_1 //把引用赋值给局部变量1。也就是源代码中的sb=操作。  
    return 应该明白dup的作用了,一个是供调用构造方法使用,一个是供赋值使用。想想如果不用dup的话该如何处理?这是优化的结果。 
      

  5.   

    #2 #3是常量池的索引。
    你使用 javap -verbose
    选项就可以看到常量池的信息了。
      

  6.   

    ZangXT,高手呀,就是受你影响才看这东西的,哈哈.谢谢你了
      

  7.   

    原来这里"abc"成参数了,懂了.谢谢了