Java中實現按引用傳遞的幾種方法
初學者程式設計師,特別是那些過去已經使用過C和C++的程式設計師,最常問的問題是Java是否支援按引用傳遞或按值傳遞。通常,程式語言使用按值傳遞和按引用傳遞來將引數傳遞給方法。但是,Java不支援這兩種方法,而是使用按值傳遞來傳遞原始型別和引用型別的值。但是,它提供了一些實現按引用傳遞的方法,我們將透過本文探討這些方法。
實現按引用傳遞的方法
讓我們首先了解Java的儲存機制。引用變數、方法名和類名儲存在棧中,它們的值儲存在堆中。但是,原始型別及其值直接儲存在棧記憶體中。
如前所述,Java只支援對原始型別和引用型別的按值傳遞,這意味著當呼叫方法時,每個引數的值的副本都會傳遞給該方法。
對於原始型別,例如int、double和Boolean,引數的值與變數的原始值相同。例如,如果我們有一個值為10的變數“x”,並將“x”作為引數傳遞給一個方法,則該方法會接收原始值10的副本作為其引數。
方法
定義一個名為“changeVal()”的使用者定義方法來修改原始型別。
在main()方法中,宣告並初始化一個整數型別變數。
現在,呼叫使用者定義的方法來執行操作並退出。
示例1
以下示例顯示了Java中的按值傳遞。
import java.util.*; public class ParameterPassing { public static void changeVal(int n) { n = n * 2; // modifying value System.out.println("Inside method: n = " + n); } public static void main(String[] args) { int val1 = 10; System.out.println("Before calling changeVal method: val1 = " + val1); changeVal(val1); // calling the method System.out.println("After calling changeVal method: val1 = " + val1); } }
輸出
Before calling changeVal method: val1 = 10 Inside method: n = 20 After calling changeVal method: val1 = 10
正如您在輸出中看到的,對於原始型別“val1”,在呼叫“changeVal”方法後,其值不會改變。
使用按值傳遞處理按引用傳遞
由於引用變數儲存在棧中,因此對於引用型別,例如陣列、物件和字串,引數的值是給定變數的引用或地址。例如,如果我們有一個包含元素{1, 2, 3}的陣列“arr”,並將“arr”作為引數傳遞給一個方法,則該方法會接收“arr”的引用或地址的副本作為其引數。
方法
定義一個名為“changeAray()”的使用者定義方法來修改引用型別。
在main()方法中,宣告一個引用型別變數。
現在,呼叫使用者定義的方法來執行操作並退出。
示例2
以下示例演示了按引用傳遞。
import java.util.*; public class ParameterPassing { public static void changeAray(int[] a) { a[0] = a[0] * 2; // modifying value System.out.println("Inside method: a = " + Arrays.toString(a)); } public static void main(String[] args) { int[] aray = {1, 2, 3}; System.out.println("Before calling changeAray method: arr = " + Arrays.toString(aray)); changeAray(aray); // calling the method System.out.println("After calling changeAray method: arr = " + Arrays.toString(aray)); } }
輸出
Before calling changeAray method: arr = [1, 2, 3] Inside method: a = [2, 2, 3] After calling changeAray method: arr = [2, 2, 3]
上面的輸出顯示,對於引用型別“arr”,在呼叫“changeAray”方法後,其值確實發生了變化。
將修改後的值儲存回原始變數
這種方法將解釋如何實現原始變數的按引用傳遞。我們可以透過將修改後的值儲存回原始值來實現這一點。首先,我們將宣告並初始化一個變數。然後,定義一個返回型別的方法來修改其值。最後,呼叫該方法並將返回值儲存回原始變數。這將導致值成功更改。
示例3
以下示例演示了上述方法。
public class ParameterPassing { public static int changeVal(int nums) { return nums = nums * 2; // modifying value } public static void main(String[] args) { int val1 = 10; System.out.println("Before calling changeVal method: val1 = " + val1); int newNums = changeVal(val1); // calling the method val1 = newNums; // storing modified value System.out.println("After calling changeVal method: val1 = " + val1); } }
輸出
Before calling changeVal method: val1 = 10 After calling changeVal method: val1 = 20
結論
將引用型別值作為引數傳遞與原始型別不同。在本文中,我們透過示例程式學習了實現原始型別和引用型別變數按引用傳遞的不同方法。