跳转操作符return,break,continue

return,break.结束最近闭合循环
continue跳到最近的闭合循环的下一次循环

return
线程会为每一个方法分配一小块栈空间来作为
该方法执行的内存空间。栈分三个区域:
1.操作数栈:用来保存正在执行的表达式中的操作数
2.局部变量区:用来保存方法使用的变量,包括方法参数,方法内部声明的变量,以及方法中使用到的对象的成员变量或类的成员变量(静态变量),最后两种变量会复制到局部变量区,因此在多线程环境下,这种变量需要根据需要声明为volatile类型
关于return 我们要记住的就是return 就是return[expression]
返回的是return指令执行的时刻,操作数栈顶的值,不管expression是怎么的表达式,究竟做了什么工作,对于return指令来说都不重要,它只负责把操作数栈顶的值返回。
而return [expression]是分成两部分执行的:
执行:expression
执行:return指令

例如 return x+y;

这句代码先执行 x+y, 再执行return
首先执行将x以及y从局部变量区复制到操作数栈的指令,然后执行加法指令,这个时候结果x+y的值会保存在操作数栈的栈顶,最后执行return指令,返回操作数栈顶的值。

对于return x;

先执行x,x也是一个表达式,这个表达式只有一个操作数,会执行将变量x从局部变量区复制到操作数栈的指令,然后执行return,返回操作数栈顶的值。因此return x实际返回的是return 指令执行时,x在操作数栈顶的一个快照或者叫副本,而不是x这个值。

而当存在finally语句块的时候,

首先我们知道,finally语句是一定会执行,但他们的执行顺序是怎么样的呢?他们的执行顺序如下:

1、执行:expression,计算该表达式,结果保存在操作数栈顶;

2、执行:操作数栈顶值(expression的结果)复制到局部变量区作为返回值;

3、执行:finally语句块中的代码;

4、执行:将第2步复制到局部变量区的返回值又复制回操作数栈顶;

5、执行:return指令,返回操作数栈顶的值;

我们可以看到,在第一步执行完毕后,整个方法的返回值就已经确定了,由于还要执行finally代码块,因此程序会将返回值暂存在局部变量区,腾出操作数栈用来执行finally语句块中代码,等finally执行完毕,再将暂存的返回值又复制回操作数栈顶。所以无论finally语句块中执行了什么操作,都无法影响返回值,所以试图在finally语句块中修改返回值是徒劳的。因此,finally语句块设计出来的目的只是为了让方法执行一些重要的收尾工作,而不是用来计算返回值的。

所以在finally中更改返回值是无效的,因为它只是更改了操作数栈顶端复制到局部变量区的快照,并不能真正的更改返回值,但是如果在

finally中使用return的话则是会将新的操作数栈的顶端数据返回,而不是之前复制到局部变量区用作返回内容快照的值返回,所以这样是可以返回的,同样的在cathch语句块里

也是这样,只有重新出现了return才有可能更改返回值

3.字节码指令区:方法中的代码翻译成的指令
Kotlin 代码标签
标签通过@结尾表示 例如:abc@, footBar@

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,735评论 0 38
  • Java byte code 的学习意义 为啥要学java bytecode,这就跟你问我已经会python了为...
    shanggl阅读 5,642评论 0 3
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,674评论 0 13
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 9,942评论 0 5
  • 我想与你说晚安! 你看那月下的河畔, 还停着弯弯的小船。 那未灭的灯盏, 是谁摇曳的思念? 我想与你说晚安! 你听...
    點下阅读 1,839评论 0 5