欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

JVM之对象创建以及调用main方法调用其他方法详解

 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

JVM之对象创建以及调用main方法调用其他方法详解

0 sipush 200
3 istore_1
4 return

3.1 new

JVM之对象创建以及调用main方法调用其他方法详解

会在堆内存开辟一个对象的空间,并将对象的赋值为默认值,同时会将对象的地址值压入操作数栈

3.2 dup

dup指令全称应该是duplicate复制的意思,将操作数栈中存的对象的地址值复制一份

JVM之对象创建以及调用main方法调用其他方法详解

3.3 invokespecial

invokespecial指令就是调用初始化方法,把堆内存的对象赋值为初始值,同时将上一步复制的地址值要弹出去,为了告诉哪个对象再执行所以需要弹栈拿出去进行计算。

JVM之对象创建以及调用main方法调用其他方法详解

弹栈处理完后的结果图如下

JVM之对象创建以及调用main方法调用其他方法详解

3.4 astore_1

将地址值弹栈压入局部变量表赋值给索引为1的变量

JVM之对象创建以及调用main方法调用其他方法详解

3.5 aload_1

把局部变量表中索引为1的变量的值压入操作数栈当中

JVM之对象创建以及调用main方法调用其他方法详解

3.6 invokevirtual

invokevirtual把操作数栈的值弹栈,去另外一个操作数栈中得到值

JVM之对象创建以及调用main方法调用其他方法详解

3.7 m方法的JVM指令

0 sipush 200
3 istore_1
4 return

sipush 200是将200压入操作数栈当中

istore_1就是将200弹栈到局部变量表当中

return返回

JVM之对象创建以及调用main方法调用其他方法详解

3.8 m的return之后回到了main方法的invokevirtual指令结束

JVM之对象创建以及调用main方法调用其他方法详解