在Java中描述实例和参数的方法的执行顺序?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

在声明中:

fooFunc().barFunc(bazFunc());

barFunc()显然不能执行,直到双方bazFunc()fooFunc()已完成。

但是执行fooFunc()bazFunc()保证的顺序是?

提问于
用户回答回答于

这个文档是15.12.4。方法调用的运行时评估

它说:“在运行时,方法调用需要五个步骤:首先,可以计算目标引用;第二,评估参数表达式;第三,检查要调用的方法的可访问性;第四,实际代码要执行的方法位于第五位,创建一个新的激活帧,必要时执行同步,并将控制转移到方法代码。

在该示例中,fooFunc()被称为计算目标引用的一部分,并且bazFunc()是参数表达式之一,所以fooFunc()必须先调用它。

用户回答回答于

JLS,Java SE 7中版具有以下的例子,它说这是fooFunc()以前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之前".startsWith"评估before 的发生s = "two"。因此,"one"在将局部变量s更改为引用字符串之前,对字符串的引用将被记忆为目标引用"two"。因此,该 startsWith方法是针对"one"具有参数的 目标对象调用的"two",因此调用的结果为false,因为该字符串"one" 不以其开头"two"。因此测试程序不会打印"oops"

扫码关注云+社区