摘要:利用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操作,这时候就会更改返回值。

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

9个问题,带你掌握流程控制语句中的java原理的更多相关文章

  1. “全栈2019”Java第二十七章:流程控制语句中循环语句for

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. “全栈2019”Java第二十六章:流程控制语句中循环语句do-while

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. “全栈2019”Java第二十五章:流程控制语句中循环语句while

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. “全栈2019”Java第二十四章:流程控制语句中决策语句switch下篇

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. “全栈2019”Java第二十三章:流程控制语句中决策语句switch上篇

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. “全栈2019”Java第二十一章:流程控制语句中的决策语句if

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. Java(6)流程控制语句中分支结构if与switch

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201528.html 博客主页:https://www.cnblogs.com/testero ...

  8. Java(7)流程控制语句中的for、while、do while循环

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201543.html 博客主页:https://www.cnblogs.com/testero ...

  9. [.net 面向对象编程基础] (7) 基础中的基础——流程控制语句

    [.net 面向对象编程基础] (7) 基础中的基础——流程控制语句 本来没有这一节的内容,后来考虑到既然是一个系列文章,那么就尽可能写的详细一些,本节参考了网上朋友所写的例子,为的是让更多小伙伴学习 ...

  10. Java基础之路(三)下--流程控制语句

    上次我们说了流程控制语句中的if语句,那本次就来聊聊switch语句. if else语句可以用来描述"二叉路口",而switch可用于"多叉路口"的情况. s ...

随机推荐

  1. MVC(JSP+JavaBean+Servlet)入门实例:用户登陆验证

    一.JSP.JavaBean.Servlet的区别 1.JSP:JSP通过在标准的HTML页面中嵌入Java代码,其静态的部分无效Java程序控制,只有那些需要从数据库读取或需要动态生成的页面内容,才 ...

  2. centOS7 防火墙基本操作

    一.防火墙的开启.关闭.禁用命令 (1)设置开机启用防火墙:systemctl enable firewalld.service (2)设置开机禁用防火墙:systemctl disable fire ...

  3. Java之引用传递

    引用传递分析 类本身就属于引用数据类型,既然是引用数据类型,就会牵扯到内存的引用传递. 引用传递的本质:同一块堆内存空间可以被不同的栈内存所指向,也可以变更指向. 引用传递案例 先看一个应用传递的例子 ...

  4. raspberry pi Pico使用MicroPython变砖后的解决方法

    使用raspberry pi Pico的原因 在硬件产品(单片机)的开发中我们往往需要借助一些额外的仪器/设备进行产品的辅助测试, 假设我们需要一个IO+ADC类型辅助设备, 以往的做法是 原理图-& ...

  5. js朗读实现

    js 利用window实现朗读功能 ` 发音

  6. 🔥🔥Java开发者的Python快速进修指南:文件操作

    Python提供的文件操作相对于Java来说,确实简单方便许多.不仅操作简单,代码可读性也相对较高.然而,我们需要注意的不仅仅是文件操作的简单性,还有文件操作的各种模式.在Java中,我们并不经常使用 ...

  7. 全屏API及vue3 hook封装

    最近在一个大屏项目遇到一个需求:用户可以通过一个按钮,触发页面部分模块全屏.通过以下API可以实现: Element.requestFullscreen()方法用于发出异步请求使元素进入全屏模式. 且 ...

  8. ACPM高效C++组件管理让音视频终端SDK性能更好、稳定性更高

    本专栏将分享阿里云视频云MediaBox系列技术文章,深度剖析音视频开发利器的技术架构.技术性能.开发能效和最佳实践,一起开启音视频的开发之旅.本文为MediaBox技术架构篇,重点从 ACPM介绍. ...

  9. [CF1364E] X-OR

    X-OR 题面翻译 题目描述 本题是交互题. 有一个固定的长度为 \(n\) 的排列 \(P\),其值域为 \([0,n-1]\),你可以进行不超过 \(4269\) 次询问,之后你需要输出这个排列 ...

  10. java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present

    完整的报错信息 java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present at ...