9个问题,带你掌握流程控制语句中的java原理
摘要:利用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原理的更多相关文章
- “全栈2019”Java第二十七章:流程控制语句中循环语句for
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第二十六章:流程控制语句中循环语句do-while
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第二十五章:流程控制语句中循环语句while
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第二十四章:流程控制语句中决策语句switch下篇
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第二十三章:流程控制语句中决策语句switch上篇
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第二十一章:流程控制语句中的决策语句if
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java(6)流程控制语句中分支结构if与switch
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201528.html 博客主页:https://www.cnblogs.com/testero ...
- Java(7)流程控制语句中的for、while、do while循环
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201543.html 博客主页:https://www.cnblogs.com/testero ...
- [.net 面向对象编程基础] (7) 基础中的基础——流程控制语句
[.net 面向对象编程基础] (7) 基础中的基础——流程控制语句 本来没有这一节的内容,后来考虑到既然是一个系列文章,那么就尽可能写的详细一些,本节参考了网上朋友所写的例子,为的是让更多小伙伴学习 ...
- Java基础之路(三)下--流程控制语句
上次我们说了流程控制语句中的if语句,那本次就来聊聊switch语句. if else语句可以用来描述"二叉路口",而switch可用于"多叉路口"的情况. s ...
随机推荐
- P1522 [USACO2.4] 牛的旅行 Cow Tours
Problem 题目简述 给你两个独立的联通块,求:在两个联通块上各找一个点连起来,使得新的联通块的直径的最小值. 思路 本题主要做法:\(Floyd\). 首先,Floyd求出任意两个点之间的最短路 ...
- [vue]精宏技术部试用期学习笔记 III
精宏技术部试用期学习笔记(vue) 父子通信 什么是通信 / 为什么要通信 通信即在不同组件之间传输数据 当在 复用组件 时,需要传递不同数据达成不同的表现效果 能够根据其他组件的行动,响应式 的做出 ...
- OA、CRM、SCM、ERP之间的区别和联系是什么?
当然,各个系统之间要集成.集成之后的东西,不叫做ERP.做ERP的人说叫ERP,做PLM的人说叫PLM,卖OA的人更愿意叫OA.其实,那个集成之后的东西,啥也不叫. 英文名 中文名 百科释义 关注 ...
- JVM-Java虚拟机是怎么实现synchronized的?
1. JVM的锁优化 今天我介绍了 Java 虚拟机中 synchronized 关键字的实现,按照代价由高至低可分为重量级锁.轻量级锁和偏向锁三种. 重量级锁会阻塞.唤醒请求加锁的线程.它针对的是多 ...
- dmd-50
按r键将其转换为字符 再将其拷贝下来 将其md5解密 得到一串英文,根据wp需要再将其加密一下,不知道为啥,得到的md5即为flag
- JavaWeb项目中web.xml配置文件<servlet-class>…</servlet-class>中的路径出现问题以及服务器错误的解决办法
问题如图 原因: 1.改变了 WEB-INF 文件夹下 lib 文件夹下 servlet-api.jar 的路径2.缺失lib文件夹下的 servlet-api.jar,没有添加到库中 解决办法: 不 ...
- 洛谷4159 [SCOI2009] 迷路(矩阵快速幂,拆点)
题意:该有向图有 n 个节点,节点从 1至 n 编号,windy 从节点 1 出发,他必须恰好在 t 时刻到达节点 n.现在给出该有向图,你能告诉 windy 总共有多少种不同的路径吗?答案对2009 ...
- c语言实现this指针效果
概要 由于目前在做一个比较复杂的嵌入式项目,想要借此提升一下代码的结构设计能力,所以想要以面向对象的思想来完成这个项目,即把每个板载外设资源视为一个对象,采用msp+bsp的模式,对每个bsp外设实现 ...
- [编程] AI助力软件项目正向生成,注释编写的革命
引言 软件项目质量直接影响着用户体验和企业效益.随着软件的应用范围不断扩大,提高软件质量的重要性也日益凸显.传统上,软件工程师通常采用自下而上的开发模式,自行设计实现代码并进行测试,这给质量把控带来一 ...
- .NET8顶级调试lldb观察FOH堆字符串分配
前言 好久没有动用LLDB了,这种未来的下一代高性能调试器应该是用在Linux内核系统的Arm64/Riscv64/X64系统指令集上的,LLDB Debug .NET有点杀鸡用牛刀.本篇通过它来看下 ...