Java:變數總是以複製的方式傳遞
我正在學習Java。理解是否函數參數是通過複製還是引用傳遞的一個重要觀念。
複製傳遞意味著當一個變數被傳遞給函數時,會製作該變數的一個副本。引用傳遞則意味著函數中的程式碼運作在原始變數上,而非其副本上。
在Java中,變數始終會通過複製來傳遞。讓我們通過以下三種情況來探索這一點:
情況1:傳遞基本類型
void incrementValue(int inFunction) {
inFunction++;
System.out.println("In function: " + inFunction);
}
int original = 10;
System.out.println("Original before: " + original);
incrementValue(original);
System.out.println("Original after: " + original);
結果如下:
Original before: 10
In function: 11
Original after: 10
原始值並未變動。
情況2:將基本類型包裹在對象中傳遞
void incrementValue(int[] inFunction){
inFunction[0]++;
System.out.println("In function: " + inFunction[0]);
}
int[] arOriginal = {10, 20, 30};
System.out.println("Original before: " + arOriginal[0]);
incrementValue(arOriginal);
System.out.println("Original after: " + arOriginal[0]);
結果如下:
Original before: 10
In function: 11
Original after: 11
原始值有變動!這是因為複雜對象變數是引用。引用變數指向內存中的位置。當變數被傳遞到函數時,始終會創建新的引用。兩個引用都指向原始對象或值。
int[] original = {10, 20, 30};
original[0] --> | 10 | <-- inFunction[0]
| 20 |
| 30 |
兩個陣列元素都指向相同的內存位置。
情況3:傳遞字符串
void changeString(String inFunction){
inFunction = "New!";
System.out.println("In function: " + inFunction);
}
String original = "Original!";
System.out.println("Original before: " + original);
changeString(original);
System.out.println("Original after: " + original);
結果如下:
Original before: Original!
In function: New!
Original after: Original!
請記住,字符串是不變的。當傳遞給函數時,會創建新的字符串,使原始字符串保持不變。