我最近開始用 Java 編碼。以前我使用 C 作為我最常用的語言。
我一直在使用一些方法(C 中的函式)來解決一些演算法問題。但是,根據我使用的引數型別,我發現會發生一些意想不到的事情。
當我使用 int 型別變數作為引數時,該方法完全符合我的預期。

變數 b 的值永遠不會改變;該方法的結果僅適用于變數 c。

現在問題來了。當我使用 int 型別“陣列”作為引數時,會發生這種情況。
'''類主{
static int[] add_three(int[] input) {
int[] result = input;
result[3] = 3;
return result;
}
public static void main(String[] args) {
int[] b = {1, 2, 3, 4};
for (int i = 0; i < 4; i ) System.out.print(b[i] " ");
System.out.println();
int[] c = new int[4];
for (int i = 0; i < 4; i ) {
c[i] = b[i];
}
c = add_three(c);
for (int i = 0; i < 4; i ) System.out.print(b[i] " ");
System.out.println();
for (int i = 0; i < 4; i ) System.out.print(c[i] " ");
System.out.println();
}
}'''
方法“add_three”不應更改陣列 b 的值。該方法的結果應該只應用于陣列 c。我期望的結果是:{1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 7}。

但是在呼叫 add_three 之后,我可以看到陣列 b 和 c 都存盤了方法的結果。聽說在Java中使用陣列作為方法的引數時,陣列的參考是由方法呼叫的。所以我試圖通過將引數復制為方法中的單獨陣列來防止這種情況,但它不起作用。
任何人都可以解釋這是如何發生的,Java 是如何作業的,以及獲得我實際預期結果的任何方法嗎?如果您可以將 Java 與 C 進行比較,將會更容易理解。
謝謝!
uj5u.com熱心網友回復:
傳遞一個陣列就是傳遞一個參考。底層/目標陣列保持不變。陣列本身的變化隨處可見。
C 復制其所有引數。因此 C 還將創建兩個完整的陣列副本
- INTO 方法作為引數
- 通過從方法回傳
return x; - (以及任何時候您為此使用賦值運算子
=)
在 Java 中,只復制參考本身,而不復制目標陣列。
因此,您必須創建一個新陣列,甚至可能將資料復制到其中,具體取決于您要如何使用它:
int[] copiedArray = new int[input.length];
System.arraycopy(input, 0, copiedArray, 0, input.length);
作為旁注:請不要像我一樣將代碼粘貼為影像,將其作為文本插入,這樣其他人可以復制您的代碼,如果他們想測驗它,并且不必手動重新輸入所有內容來幫助您。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419568.html
標籤:
