写点什么

9 个问题,带你掌握流程控制语句中的 java 原理

  • 2021 年 11 月 16 日
  • 本文字数:955 字

    阅读完需:约 3 分钟

​​摘要:利用 9 个问题帮助记忆流程控制语句中的 Java 原理知识。

 

本文分享自华为云社区《流程控制语句知识点里的java原理》,作者:breakDraw 。

 

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



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


Q: 什么是操作数栈

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



Q: 什么是栈帧?

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



Q: 栈帧里包含什么?

A:

  • 局部变量表

  • 操作数栈

  • 动态链接

  • 方法返回地址


Q: 栈帧的大小什么时候确定?

A:在编译程序代码的时候


Q: 什么是局部变量表?

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



Q: 实例方法(就是某 new 出来的对象调用的某个方法)局部变量表的第一个变量是什么?

A:是 this 引用。因此在实例方法(即非静态方法)中调用 f()时, 实际上调用的是 this.f(),而这个 this 就来自局部变量表。



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 肯定是方法的最后一步操作,于是默认栈顶)



Q:在 return a 之后, 如果在 finally 操作又对 a 执行 a=2+b,操作数栈和局部变量表又会如何变化?

A:原先准备返回的值会被作为局部变量存起来, 接着为了做计算,会取出 a 和 b 放到操作数栈中做计算



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



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



点击关注,第一时间了解华为云新鲜技术~

发布于: 3 小时前阅读数: 8
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
9个问题,带你掌握流程控制语句中的java原理