【实战JVM】字节码文件详讲之方法

在这里插入图片描述



个人名片:

在这里插入图片描述


🐼作者简介:一名大三在校生,喜欢AI编程🎋
🐻‍❄️个人主页🥇:落798.
🐼个人WeChat:hmmwx53
🕊️系列专栏:🖼️




方法

字节码中的方法区域是存放字节码指令的核心位置,字节码指令的内容存放在方法的Code属性中。
在这里插入图片描述

通过分析方法的字节码指令,可以清楚地了解一个方法到底是如何执行的。先来看如下案例:`

int i = 0;
int j = i + 1;

这段代码编译成字节码指令之后是如下内容:

在这里插入图片描述

要理解这段字节码指令是如何执行的,我们需要先理解两块内存区域:操作数栈和局部变量表。

操作数栈是用来存放临时数据的内容,是一个栈式的结构,先进后出。

局部变量表是存放方法中的局部变量,包含方法的参数、方法中定义的局部变量,在编译期就已经可以确定方法有多少个局部变量。

1、iconst_0,将常量0放入操作数栈。此时栈上只有0。
在这里插入图片描述
2、istore_1会从操作数栈中,将栈顶的元素弹出来,此时0会被弹出,放入局部变量表的1号位置。局部变量表中的1号位置,在编译时就已经确定是局部变量i使用的位置。完成了对局部变量i的赋值操作。

在这里插入图片描述
3、iload_1将局部变量表1号位置的数据放入操作数栈中,此时栈中会放入0。

在这里插入图片描述

4、iconst_1会将常量1放入操作数栈中。

在这里插入图片描述

5、iadd会将操作数栈顶部的两个数据相加,现在操作数栈上有两个数0和1,相加之后结果为1放入操作数栈中,此时栈上只有一个数也就是相加的结果1。

在这里插入图片描述

6、istore_2从操作数栈中将1弹出,并放入局部变量表的2号位置,2号位置是j在使用。完成了对局部变量j的赋值操作。

在这里插入图片描述

7、return语句执行,方法结束并返回。

在这里插入图片描述
同理,同学们可以自行分析下i++++i的字节码指令执行的步骤。

i++的字节码指令如下,其中iinc 1 by 1指令指的是将局部变量表1号位置增加1,其实就实现了i++的操作。

在这里插入图片描述
++i只是对两个字节码指令的顺序进行了更改:

在这里插入图片描述

面试题:
问:int i = 0; i = i++; 最终i的值是多少?

答:答案是0,我通过分析字节码指令发现,i++先把0取出来放入临时的操作数栈中,

接下来对i进行加1,i变成了1,最后再将之前保存的临时值0放入i,最后i就变成了0。


欢迎评论 💬点赞👍🏻 收藏 📂加关注+



在这里插入图片描述

欢迎添加微信,加入我的核心小队,请备注来意

👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

相关推荐

  1. JVM字节文件的组成

    2024-04-09 03:42:01       38 阅读

最近更新

  1. Leetcode101 判断二叉树是否对称

    2024-04-09 03:42:01       0 阅读
  2. 【深入剖析】Kylin架构全景及其组件详解

    2024-04-09 03:42:01       0 阅读
  3. poi导出值班excel

    2024-04-09 03:42:01       1 阅读
  4. MP公共字段填充

    2024-04-09 03:42:01       1 阅读

热门阅读

  1. HBase高并发机制

    2024-04-09 03:42:01       19 阅读
  2. KamaCoder 52. 携带研究材料(第七期模拟笔试)

    2024-04-09 03:42:01       17 阅读
  3. 华为机试(03)

    2024-04-09 03:42:01       14 阅读
  4. I2C协议介绍

    2024-04-09 03:42:01       15 阅读
  5. 逐步学习Go-sync.Once(只执行一次)Exactly Once

    2024-04-09 03:42:01       12 阅读