2011-09-08 33 views
3

在我的Java測試是下一個問題:Java數組 - 從測試

有下一個方法:

public void changer(int[] x, int y) { 

    x[y] = x[y] +3; 
    y = y * 2; 
} 

我們已經陣列命名a,與值:

2,4,0,1,-6,3,8,7,5 

如果B = 3

將是什麼a和b值後,下一個電話:

changer(a,b); 

我的回答是: B = 6

a = 2,4,0,4,-6,3,8,7,5 

我上測試它BlueJ得到了同樣的答案,但測試人員寫道:錯了!

你說什麼?

+0

讓我擔心BlueJ如果說6是正確的...(我從來沒有用過它,所以我不知道你是否正確使用它。) – Poodlehat

+0

你確定你測試了這個並得到b = 6嗎? ! – Daniel

回答

7

你是對的數組值,但錯誤的b值。

當你調用一個方法時,java按值傳遞所有的東西,這意味着改變y只會在本地改變這個值,並且這個改變不會反映在b上。

但是,當傳遞數組和對象時,會傳遞一個表示指向數組的指針的值。這意味着x = new int[8]完全不會改變,因爲它發生在y上,所以這個改變不會反映到a中。但是,更改數組成員或對象屬性的工作方式與您的預期相同,導致a和x都指向內存中的相同數組。

+0

很好的解釋。確切地說,它爲什麼/不起作用。 – Nicholas

+0

感謝您的明確回答。 – Oshrib

4

changer被稱爲b的範圍不會改變,因爲Java是通過值並且b是原語。所以b在方法調用後仍然是3。在changer聲明:數組中修改完畢

y = y * 2

有效地什麼也不做。

您的回答爲a是正確的。

2

b應該仍然是3.傳遞一個整數將「按值」傳遞它,所以它本質上是b的副本,它進入changer方法。

+0

哦......我很匆忙......怎麼樣? – Oshrib

2

B不會被更改,因爲它是作爲方法參數傳遞的基元。在這種情況下,製作一個本地副本,在這種情況下,乘以2。原來的b不會受到這個影響。因爲數組(即使是基元數組)也是Java中的對象,所以對數組的引用被傳遞到方法中,並且對數組的更改(通過引用)被反映到唯一的數組中 - 沒有副本是在這種情況下製作。

2

你在混淆值和引用,並且認爲y值就像是引用。第一行 x[y] = x[y] +3; 設置數組的第y個元素的值以下行y = y * 2; 更改參數的值,但不會更改陣列設置。