流程控制语句知识点里的java原理

breakDraw 发表于 2021/11/12 18:19:57 2021/11/12
【摘要】 相信大家经常会遇到这种问题可是这个知识点是为什么呢? 我继续以问题的形式来记忆这个问题中的原理。Q: 什么是操作数栈A:可以理解为jvm做计算时,需要一个临时的寄存器,把需要计算的数据或者传方法的参数放到栈中,然后做计算。Q: 什么是栈帧?A: 每个线程有一个自己的栈帧,然后运行到每个方法时,每个方法中都会可以理解为是摄影里的一帧。Q: 栈帧里包含什么?A:局部变量表操作数栈动态链接方法返回...

相信大家经常会遇到这种问题
image.png

可是这个知识点是为什么呢? 我继续以问题的形式来记忆这个问题中的原理。


Q: 什么是操作数栈
A:
可以理解为jvm做计算时,需要一个临时的寄存器,把需要计算的数据或者传方法的参数放到栈中,然后做计算。
image.png


Q: 什么是栈帧?
A: 每个线程有一个自己的栈帧,然后运行到每个方法时,每个方法中都会可以理解为是摄影里的一帧。
image.png


Q: 栈帧里包含什么?
A:

  • 局部变量表
  • 操作数栈
  • 动态链接
  • 方法返回地址

Q: 栈帧的大小什么时候确定?
A:
在编译程序代码的时候


Q: 什么是局部变量表?
A:
每个线程所在栈帧都会有一个自己的局部变量表,里面存储方法中使用到的局部变量。
image.png


Q: 实例方法(就是某new出来的对象调用的某个方法)局部变量表的第一个变量是什么?
A:
是this引用。
因此在实例方法(即非静态方法)中调用f()时, 实际上调用的是this.f(), 而这个this就来自局部变量表。
image.png

PS:

  • returnAddress类型是为字节码指令jsr、jsr_w和ret服务的,它指向了一条字节码指令的地址。
  • 局部变量表的容量以变量槽(Slot)为最小单位,32位虚拟机中一个Slot可以存放一个32位以内的数据类型(boolean、byte、char、short、int、float、reference和returnAddress八种)

Q:为什么java中局部变量没有默认初始?
A:我的理解,局部变量在局部变量表中,而局部变量表是运行时生成的, 因此没法在编译期去生成他的默认初始,所以必须通过赋值指令在运行时给他赋值。(没找到很好的解释,有更好理解的可以帮忙回答一下)


Q:某个方法中执行return a时, 操作数栈和局部变量表会如何变化?
A:
a的值会被放到操作数栈的栈顶,后面取返回值时,就从这里取(即jvm总得知道返回值放哪,而return肯定是方法的最后一步操作,于是默认栈顶)
image.png


Q:在return a之后, 如果在finally操作又对a执行a=2+b, 操作数栈和局部变量表又会如何变化?
A:
原先准备返回的值会被作为局部变量存起来, 接着为了做计算,会取出a和b放到操作数栈中做计算
image.png

而在finally计算结束后,之前存的返回值会被放回栈顶。
image.png

因此,finally里对返回变量的修改,无法修改真正的返回值。
除非在finally里再执行return操作,这时候就会更改返回值。
image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。