在声明中:
fooFunc().barFunc(bazFunc());
显然,只有在bazFunc()
和fooFunc()
都完成之后,barFunc()
才能执行。
但是fooFunc()
和bazFunc()
的执行顺序有保证吗?
相关(但不同!)问题:Order of execution of parameters guarantees in Java?
发布于 2012-12-05 22:12:16
这方面的文档是15.12.4. Run-time Evaluation of Method Invocation
它说“在运行时,方法调用需要五个步骤。第一,可以计算目标引用。第二,计算参数表达式。第三,检查要调用的方法的可访问性。第四,定位要执行的方法的实际代码。第五,创建新的激活帧,必要时执行同步,并将控制转移到方法代码。”
在本例中,fooFunc()
是作为计算目标引用的一部分调用的,而bazFunc()
是参数表达式之一,因此必须首先调用fooFunc()
。
发布于 2012-12-05 22:06:19
JLS,JavaSE7版有以下示例,它是在bazFunc()
之前的fooFunc()
,但是我只能找到这个示例-我还没有找到指定它的相关语句:
Example 15.12.4.1-2.方法调用期间的求值顺序
作为实例方法调用的一部分(§15.12),有一个表达式表示要调用的对象。在对方法调用的任何参数表达式的任何部分求值之前,此表达式似乎已完全求值。因此,例如,在:
类Test2 { public static void main(String[] args) { String s= "one";if (s.startsWith(s = "two")) System.out.println("oops");}}
在参数表达式s = "two"
之前,首先计算出现在".startsWith"
之前的s
。因此,在将局部变量s更改为引用字符串"two"
之前,会记住对字符串"one"
的引用作为目标引用。因此,将使用参数"two"
为目标对象"one"
调用startsWith
方法,因此调用的结果为false,因为字符串"one"
不是以"two"
开头的。因此,测试程序不会打印"oops"
。
发布于 2012-12-05 22:07:56
先是fooFunc
,然后是bazFunc
,最后是barFunc
下面是一些演示它的代码:
public class OrderJava {
public static void main(String[] args) {
fooFunc().barFunc(bazFunc());
}
public static Bar fooFunc() {
System.out.println("I am fooFunc!");
return new Bar();
}
public static class Bar {
public void barFunc(Object o) {
System.out.println("I am barFunc!");
}
}
public static Object bazFunc() {
System.out.println("I am bazFunc!");
return null;
}
}
此代码的输出为:
I am fooFunc!
I am bazFunc!
I am barFunc!
https://stackoverflow.com/questions/13724952
复制相似问题