2011-04-22 78 views
0

是否將參數傳遞到方法(使用Java)定義的順序?例如,在代碼段將參數傳遞給方法的順序(Java)

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

這是用來檢查一個數組其實是在有序的上升,我在保證原來的數組傳入排序方法被調用之前就可以了?

編輯: 似乎有點誤解。在第一個參數傳遞之前,equals方法在排序之前是否獲取了ascendingSegment的副本,或者是第一次調用的排序?給定一個數組,例如{1, 5, 2, 4},equals方法是否會收到{1, 5, 2, 4}{1, 2, 4, 5}作爲參數或{1, 2, 4, 5}的兩個副本?

回答

1

Java如下傳遞值

傳遞值意味着當您調用方法時,每個實際參數的值的副本將傳遞給該方法。您可以在該方法內更改該副本,但這對實際參數沒有影響。

因此,在您的示例中,您的數組將首先被排序,然後傳遞給Array.equals方法。

您的困惑可能是因爲您在考慮通過引用。這裏的解釋問題,爲什麼Java是傳遞按值Is Java "pass-by-reference" or "pass-by-value"?

+0

是的,但在這些情況下,數組實際上是一個指針,而不是實際值。因此,指針的值將被複制,但它仍然指向相同的數組 – FeifanZ 2011-04-22 15:13:51

+0

事實上,Java期望每個參數都會顯示一個值。由於這個原因,你的例子中的所有參數在被傳遞之前都會被評估。 – KushalP 2011-04-22 15:17:18

+0

謝謝。這是一個地方。但是排序之前複製的第一個參數?換句話說,是否將參數值與實際傳球分開一步? – FeifanZ 2011-04-22 15:22:09

5

如果你用調試器遍歷它並逐步完成它,你會看到所有參數都被評估,然後調用該函數。

我也會說,試圖做你發佈的內容是一個不好的做法。在測試一個對象時,你不應該在該對象上執行任何操作來改變它。在該方法調用之後,您將無法在測試之前顯示列表的順序。

編輯: Arrays.sort()不返回一個值,它排序到位。因此,你不能像這樣使用它。您應該使用Arrays.copyOf()複製數組,對副本進行排序,然後比較兩個數組。

+0

我是Java的新手......不知道在哪裏可以找到調試器或如何使用它。 :( – FeifanZ 2011-04-22 15:14:23

+1

@ Inspire48:你是否在使用像Eclipse這樣的IDE?它內置了一個。 – unholysampler 2011-04-22 15:17:40

+0

我已經在Eclipse中玩過了,但是我沒有做任何嚴肅的Java編程,所以我主要使用帶有宏的NotePad ++調用'javac'和'java' – FeifanZ 2011-04-22 15:21:01

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 ca ll參數是按值傳遞的,儘管爲參考類型傳遞的值(即,一個對象或數組)是一個參考。這意味着當傳遞一個數組參數時,實際上是傳遞數組引用,並且被調用的方法獲取原始數組,而不是副本。
  2. 過程調用的參數表達式從左到右計算。
+0

謝謝你 - 沒有發現那裏的編譯問題,這是一個假設的例子。這是一個很好的解釋。 – FeifanZ 2011-04-22 15:59:49