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虚拟机复制了操作数栈顶部的一个字长的内容,然后在将复制的内容压入栈。本指令能够从操作数栈顶不复制任何单字长的值。
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虚拟机复制了操作数栈顶部的一个字长的内容,然后在将复制的内容压入栈。本指令能够从操作数栈顶不复制任何单字长的值。
这样,当构造完成之后,该对象仍然留了一个引用在栈顶。
但如果只是为了调方法的话为什么还要再把栈顶元素再复制一份呢?
为什么要留一份到栈顶?
高人的说明。