在声明中:
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"); } }
sbefore的出现".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().