在声明中:
fooFunc().barFunc(bazFunc());
barFunc()
显然不能执行,直到两者bazFunc()
都fooFunc()
完成。
但是执行的顺序有fooFunc()
保证bazFunc()
吗?
相关(但不同!)问题: Java 中参数保证的执行顺序?
在声明中:
fooFunc().barFunc(bazFunc());
barFunc()
显然不能执行,直到两者bazFunc()
都fooFunc()
完成。
但是执行的顺序有fooFunc()
保证bazFunc()
吗?
相关(但不同!)问题: Java 中参数保证的执行顺序?
这方面的文档是15.12.4。方法调用的运行时评估
它说“在运行时,方法调用需要五个步骤。首先,可以计算目标引用。其次,评估参数表达式。第三,检查要调用的方法的可访问性。第四,实际代码定位要执行的方法。第五,创建新的激活帧,必要时进行同步,将控制权移交给方法代码。
在示例中,fooFunc()
作为计算目标引用的一部分被调用,并且bazFunc()
是参数表达式之一,因此fooFunc()
必须首先调用。
JLS , Java SE 7 Edition 有以下示例,它说它是fooFunc()
before bazFunc()
,但是我只能找到示例 - 我还没有找到指定它的关联语句:
示例 15.12.4.1-2。方法调用期间的评估顺序
作为实例方法调用(第 15.12 节)的一部分,有一个表达式表示要调用的对象。在评估方法调用的任何参数表达式的任何部分之前,该表达式似乎已被完全评估。因此,例如,在:
class Test2 { public static void main(String[] args) { String s = "one"; if (s.startsWith(s = "two")) System.out.println("oops"); } }
s
before的出现".startsWith"
首先被评估,在参数 expression 之前s = "two"
。因此,"one"
在将局部变量 s 更改为引用 string 之前,将对 string 的引用记住为目标引用"two"
。结果,该 方法是为具有参数startsWith
的目标对象调用的,因此调用的结果为假,因为字符串 不是以 开头。因此测试程序不打印。"one"
"two"
"one"
"two"
"oops"
首先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!
fooFunc()
将首先执行,然后执行,bazFunc()
最后执行barFunc()
我们都可以同意fooFunc()
必须执行之前barFunc()
有任何操作。
鉴于只有在需要它的参数bazFunc()
时才会调用barFunc()
它,所以有理由认为这会在fooFunc()
.