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@
网友评论