美文网首页
跳转操作符return,break,continue

跳转操作符return,break,continue

作者: 黄嵘才 | 来源:发表于2018-09-01 18:47 被阅读32次

    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@

    相关文章

      网友评论

          本文标题:跳转操作符return,break,continue

          本文链接:https://www.haomeiwen.com/subject/drmuwftx.html