将参数传递给方法的顺序(Java)

时间:2011-04-22 15:05:46

标签: java methods parameter-passing

是否将参数传递给定义的方法(在Java中)?例如,在代码段

Arrays.equals(ascendingSegment, Arrays.sort(ascendingSegment))

用于检查数组是否实际上按升序排序,我保证在调用sort方法之前传入原始数组吗?

修改 好像有点误会。在第一个参数传递之前,equals方法是否在排序之前获取了ascendingSegment的副本,或者是第一个调用的排序?给定{1, 5, 2, 4}之类的数组,equals方法会将{1, 5, 2, 4}{1, 2, 4, 5}作为参数或{1, 2, 4, 5}的两个副本吗?

3 个答案:

答案 0 :(得分:6)

如果您使用调试器逐步执行它并逐步执行它,您将看到所有参数都被计算,然后调用该函数。

我还会说尝试做你发布的内容是一种不好的做法。在测试对象时,您不应该对该对象执行任何会使其变异的操作。在该方法调用之后,您将无法在测试之前显示列表的顺序。

修改 Arrays.sort()没有返回值,它就地排序了。因此你不能像这样使用它。您应该使用Arrays.copyOf()制作数组的副本,对副本进行排序,然后比较两个数组。

答案 1 :(得分:1)

Java遵循按值传递

传值意味着当您调用方法时,会将每个实际参数的值的副本传递给该方法。您可以在方法内更改该副本,但这对实际参数没有影响。

因此,在您的示例中,您的数组将首先进行排序,然后传递给Array.equals方法。

您的困惑可能是因为您正在考虑 Pass-by-reference 。这是一个解释为什么Java 按值传递的问题:Is Java "pass-by-reference" or "pass-by-value"?

答案 2 :(得分:1)

首先,您的示例将无法编译,因为Arrays.sort(...)不会返回任何内容。

其次,如果(假设)Arrays.sort(...)确实返回了某些东西,那么它将取决于它返回的内容。

  • 如果(假设的)Arrays.sort(...)返回了原始数组的已排序的副本,那么

        Arrays.equals(ascendingSegment, Arrays.sort(ascendingSegment));
    
    将使用两个不同的数组参数调用

    ;即原始数组和分类副本。

  • 如果(假设的)Arrays.sort(...)在完成就地排序后返回了原始数组,那么

        Arrays.equals(ascendingSegment, Arrays.sort(ascendingSegment));
    

    等同于:

        Arrays.sort(ascendingSegment);
        Arrays.equals(ascendingSegment, ascendingSegment);
    

注意:

  1. Java调用参数按值传递,但为引用类型(即对象或数组)传递的值是引用。这意味着当传递数组参数时,实际上是传递数组引用,并且被调用的方法获取原始数组,而不是副本。
  2. 过程调用的参数表达式从左到右进行计算。