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

bac*_*car 17 java

在声明中:

fooFunc().barFunc(bazFunc());
Run Code Online (Sandbox Code Playgroud)

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

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

相关(但不同!)问题: Java中参数的执行顺序保证?

Pat*_*han 7

这方面的文件是15.12.4.方法调用的运行时评估

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

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


bac*_*car 6

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"); 
    } 
}
Run Code Online (Sandbox Code Playgroud)

在参数表达式s之前".startsWith"首先计算before 的出现次数s = "two".因此,在"one"更改局部变量s以引用字符串之前,将记住对字符串的引用作为目标引用"two".因此,使用参数 startsWith为目标对象调用该 方法,因此调用的结果为false,因为字符串 不是以字符串开头的.因此,测试程序不会打印."one""two""one""two""oops"