【问题标题】:Order in which arguments are passed into method (Java)将参数传递到方法中的顺序 (Java)
【发布时间】:2011-04-22 15:05:46
【问题描述】:

是否定义了将参数传递给方法(在 Java 中)的顺序?比如在代码段中

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

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

编辑: 好像有点误会似的。 equals 方法是在排序之前获取升序段的副本,还是在传递第一个参数之前先调用排序?给定一个数组,例如{1, 5, 2, 4},equals 方法是接收{1, 5, 2, 4}{1, 2, 4, 5} 作为参数还是{1, 2, 4, 5} 的两个副本?

【问题讨论】:

    标签: java methods parameter-passing


    【解决方案1】:

    如果您使用调试器单步执行它并单步执行它,您将看到所有参数都已评估,然后调用该函数。

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

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

    【讨论】:

    • 我是 Java 新手...不知道在哪里可以找到调试器或如何使用它。 :(
    • @Inspire48:您使用的是 Eclipse 之类的 IDE 吗?它有一个内置的。
    • 我在 Eclipse 中玩过,但我没有做任何认真的 Java 编程,所以我主要使用带有宏的 NotePad++ 来调用 javacjava
    • @Inspire48:您将自己置于严重的劣势。仅仅因为您没有编写计划提供给其他人的程序并不意味着您不应该使用最好的工具来完成这项工作。
    • 您可能是对的,但是当我没有 IDE 来分散我的注意力时,学习 Java 会更容易。我们不要把这变成一场 IDE 战争,好吗?
    【解决方案2】:

    Java 遵循 按值传递

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

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

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

    【讨论】:

    • 是的,但在这些情况下,数组实际上是一个指针,而不是实际值。因此,指针的值会被复制,但仍然指向同一个数组
    • 确实如此,但 Java 期望每个参数都出现一个值。出于这个原因,您示例中的所有参数都会在传递之前进行评估。
    • 谢谢。那是在某个地方。但是第一个参数是在排序之前复制的吗?换句话说,参数值的复制是与实际传递不同的步骤吗?
    • 啊,Array.sort() 就地进行排序。在这种情况下,您可能应该复制该数组并将其传递给您的方法。
    【解决方案3】:

    首先,您的示例无法编译,因为 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. 过程调用的参数表达式从左到右计算。

    【讨论】:

    • 谢谢你——没有发现那里的编译问题,这是一个假设的例子。这是一个写得很好的解释。
    猜你喜欢
    • 2013-10-04
    • 2011-10-07
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多