在声明中:
fooFunc().barFunc(bazFunc());
Run Code Online (Sandbox Code Playgroud)
barFunc()显然不能执行,直到双方bazFunc()并fooFunc()已完成.
但就是执行的顺序fooFunc()和bazFunc()保障?
相关(但不同!)问题: Java中参数的执行顺序保证?
这方面的文件是15.12.4.方法调用的运行时评估
它说"在运行时,方法调用需要五个步骤.首先,可以计算目标引用.第二,计算参数表达式.第三,检查要调用的方法的可访问性.第四,实际的代码找到要执行的方法.第五,创建新的激活帧,必要时执行同步,并将控制转移到方法代码.
在该示例中,fooFunc()被称为计算目标引用的一部分,并且bazFunc()是参数表达式之一,因此fooFunc()必须首先调用.
在JLS,Java SE 7中版具有以下的例子,它说这是fooFunc()以前bazFunc(),但我只能找到的例子-我还没有找到相关的声明,指定它:
例15.12.4.1-2.方法调用期间的评估顺序
作为实例方法调用(第15.12节)的一部分,有一个表达式,表示要调用的对象.在评估方法调用的任何参数表达式的任何部分之前,此表达式似乎已完全评估.所以,例如,在:
Run Code Online (Sandbox Code Playgroud)class Test2 { public static void main(String[] args) { String s = "one"; if (s.startsWith(s = "two")) System.out.println("oops"); } }在参数表达式
s之前".startsWith"首先计算before 的出现次数s = "two".因此,在"one"更改局部变量s以引用字符串之前,将记住对字符串的引用作为目标引用"two".因此,使用参数startsWith为目标对象调用该 方法,因此调用的结果为false,因为字符串 不是以字符串开头的.因此,测试程序不会打印."one""two""one""two""oops"
| 归档时间: |
|
| 查看次数: |
474 次 |
| 最近记录: |