JAVA源代码:【简单地创建Test6的对象t6】public class Test6 { public static void main(String[] args) {
Test6 t6 = new Test6();
}
}通过javap将上面的代码反编译为虚拟机指令,如下:public class com.zte.practical1.Test6 extends java.lang.Object{
public com.zte.practical1.Test6();
  Code:
   0:   aload_0
   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   4:   returnpublic static void main(java.lang.String[]);
  Code:
   0:   new     #1; //class com/zte/practical1/Test6
   3:   dup
   4:   invokespecial   #16; //Method "<init>":()V
   7:   astore_1
   8:   return
}我最近在阅读<<深入JAVA虚拟机>>这本书,感触很多,但有一些地方仔细看完本书,也没能理解其中的原由,所以想听听你们的想法。如果看过这本书或此类的朋友,我想问一下,其中的dup指令在上面指令
new
dup
invokespecial
astore_1
return
这个上下文中的作用,我个人不是很理解为什么要使用dup指令。下面是《深入JAVA虚拟机》书中dup指令解释的原话:要执行dup指令,Java虚拟机复制了操作数栈顶部的一个字长的内容,然后在将复制的内容压入栈。本指令能够从操作数栈顶不复制任何单字长的值。

解决方案 »

  1.   

    dup的作用是将当前栈顶的对象引用复制一份。这里复制的作用是,将一份用作调用构造函数。
    这样,当构造完成之后,该对象仍然留了一个引用在栈顶。
      

  2.   

    dup指令确实是如楼上朋友所说.
    但如果只是为了调方法的话为什么还要再把栈顶元素再复制一份呢?
    为什么要留一份到栈顶?
      

  3.   

    http://blog.csdn.net/axman/archive/2008/05/05/2393621.aspx
    高人的说明。
      

  4.   

    下面还有astore_1 操作呢,实现对局部变量t6的赋值