JVM之对象创建以及调用main方法调用其他方法详解
程序员文章站
2022-06-01 13:37:40
...
三、方法中new对象同时调用另外一个方法的JVM指令详解
package com.zhou.jvm.runtimedataAreainstructionset;
/**
* @author zhouyanxiang
* @create 2020-08-2020/8/6-8:43
*/
public class TestMethod {
public static void main(String[] args) {
TestMethod t = new TestMethod();
t.m();
}
public void m() {
int i = 200;
}
}
这个是main方法的Bytecode
0 new #2 <com/zhou/jvm/runtimedataAreainstructionset/TestMethod>
3 dup
4 invokespecial #3 <com/zhou/jvm/runtimedataAreainstructionset/TestMethod.<init>>
7 astore_1
8 aload_1
9 invokevirtual #4 <com/zhou/jvm/runtimedataAreainstructionset/TestMethod.m>
12 return
这个是m方法的Bytecode
0 sipush 200
3 istore_1
4 return
3.1 new
会在堆内存开辟一个对象的空间,并将对象的赋值为默认值,同时会将对象的地址值压入操作数栈
3.2 dup
dup指令全称应该是duplicate复制的意思,将操作数栈中存的对象的地址值复制一份
3.3 invokespecial
invokespecial指令就是调用初始化方法,把堆内存的对象赋值为初始值,同时将上一步复制的地址值要弹出去,为了告诉哪个对象再执行所以需要弹栈拿出去进行计算。
弹栈处理完后的结果图如下
3.4 astore_1
将地址值弹栈压入局部变量表赋值给索引为1的变量
3.5 aload_1
把局部变量表中索引为1的变量的值压入操作数栈当中
3.6 invokevirtual
invokevirtual把操作数栈的值弹栈,去另外一个操作数栈中得到值
3.7 m方法的JVM指令
0 sipush 200
3 istore_1
4 return
sipush 200是将200压入操作数栈当中
istore_1就是将200弹栈到局部变量表当中
return返回