栈的执行流程

bipush 将100 压栈
istore_1 将100 弹出到局部变量表索引为1的位置
return
----------------------------------------------------------------------------------------------------------------------------------------------------------------
sipushi 200 因为底层是btye 最多容纳127 若超出 是si200(short)转换为int 类型 压栈
istore_1 弹出到局部变量表中
----------------------------------------------------------------------------------------------------------------------------------------------------------------
参数 k 数存放在局部变量表的
sipush 300 将300压倒栈中
istore_2 局部变量表中有this 这就是我们能在方法中使用this 原因 因为this是在我们局部变量表中存在 只要不是static 方法 非static方法是需要对象的 这个方法的地址会在局部变量表中 为什么前面没有this ? 因为前面方法都是static方法
第0个位置是this 第一个位置是k 形参 第二个位置是i 局部变量
----------------------------------------------------------------------------------------------------------------------------------------------------------------
iload_1 因为是非静态方法 那么下标为0一定是this 下标为1 为 a 将a=3 压栈
iload_2 是b 将b=4压栈
iadd 拿出操作树栈中的两条指令 a和b (a和b 弹出栈) 执行相加 然后将结果扔回栈顶
istore_3 将7弹出 存入局部变量表下标为3的地方
return
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
m1 方法的指令:
sipush 200 将200 压栈
istore 将200 弹出到局部变量表的下标为1的位置
return
main 方法局部变量表结构
args 0
h 1
由于main方法调用了m1 方法 所以JVMstack 中有两个栈帧 一个是main方法栈帧 一个是m1 栈帧
当main 方法运行到m1 方法的时候会先执行m1 方法 等m1 方法结束 m1 弹出栈 结束了 才会到main 方法继续运行 return address 找到下一个栈帧运行的地址
new hello02 对象(new 对象的过程?)在堆内存中new出hello02 对象 这个对象的地址会压栈 这时候的值都是默认值
dup 在栈顶复制这个地址
invokespecial 执行空构造方法 执行构造方法的过程会将栈顶复制的地址弹出指向这个方法 这个对象里面的才会赋值初始值 这个对象才算构造完成
但此时栈中还有一个地址指向这个构造方法 但这个构造方法已经初始化完成了 new 只是半初始化 只有调用了构造方法 才算初始化完成
astore_1 将地址弹栈到局部变脸表 下标为1的位置 h 所以 h 指向了Hellow_02的内存地址
aload_1 将这个h对应的内存地址压栈
invokevirtual 调用m1方法 需要将h 弹栈 然后执行上面m1 的栈帧的操作
m1 操作完了 return
----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -----------------------------------------------------------------------------------
在 m 方法中 因为是非静态方法 0 this 1 3 将局部变量表中 下标为1的n 压栈 将 常量 1 压栈 if icmpne 如果 两个值比较ne 不相等 弹栈 就跳到第七条指令
第七条值指令 iload_1 将3压栈
将this 压栈
iload_1 将 3 压栈
将 1 压栈
isub 将3和1弹出 执行相减3-1 值为2 将2 压栈
invokevirtual 执行m方法 将2传入m 方法 调用m(2)方法 又要重新开始指令 还需要将this 传给m2 方法
将局部变量表的1 位置的2 压入栈
当n=1时 就将1 返回给m2 的栈帧 m2 在返回给m3 m3再返回main
<clinit > 静态语句块
<init> 构造方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律