18

在声明中:

fooFunc().barFunc(bazFunc());

barFunc()显然不能执行,直到两者bazFunc()fooFunc()完成。

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

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

4

4 回答 4

7

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

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

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

于 2012-12-05T14:12:16.180 回答
6

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"

于 2012-12-05T14:06:19.413 回答
1

首先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!
于 2012-12-05T14:07:56.260 回答
-1

fooFunc()将首先执行,然后执行,bazFunc()最后执行barFunc()

我们都可以同意fooFunc()必须执行之前barFunc()有任何操作。

鉴于只有在需要它的参数bazFunc()时才会调用barFunc()它,所以有理由认为这会在fooFunc().

于 2012-12-05T14:03:55.017 回答