在Java中,方法參數的傳遞方式有兩種,分別是值傳遞和引用傳遞。
值傳遞是指將變量的值復制一份傳遞給方法參數,在方法內部對參數的修改不會影響原變量的值。
public class Test{ public static void main(String[] args){ int a = 10; System.out.println("原值:" + a); change(a); System.out.println("修改后:" + a); } public static void change(int b){ b = 20; System.out.println("方法內修改后:" + b); } }
運行結果:
原值:10 方法內修改后:20 修改后:10
可以看到,雖然在方法內部修改了參數的值,但是原變量的值并沒有改變。
引用傳遞是指將變量的地址傳遞給方法參數,對參數的修改會直接影響原變量的值。
public class Test{ public static void main(String[] args){ int[] arr = new int[]{1, 2, 3}; System.out.println("原數組:" + Arrays.toString(arr)); change(arr); System.out.println("修改后數組:" + Arrays.toString(arr)); } public static void change(int[] arr){ arr[0] = 4; System.out.println("方法內修改后數組:" + Arrays.toString(arr)); } }
運行結果:
原數組:[1, 2, 3] 方法內修改后數組:[4, 2, 3] 修改后數組:[4, 2, 3]
可以看到,在方法內部修改了參數的值后,原數組的值也隨之改變了。
在Java中,基本類型(如int、float、char等)都是值傳遞,而對象類型(如數組、集合、自定義類等)都是引用傳遞。
需要注意的是,雖然對象類型是引用傳遞,但是如果在方法內部將參數重新指向了一個新的對象,原對象并不會受到影響。
public class Test{ public static void main(String[] args){ MyClass obj = new MyClass("hello"); System.out.println("原對象:" + obj); change(obj); System.out.println("修改后對象:" + obj); } public static void change(MyClass obj){ obj = new MyClass("world"); System.out.println("方法內修改后對象:" + obj); } } class MyClass{ private String name; public MyClass(String name){ this.name = name; } public String toString(){ return "MyClass{" + "name='" + name + '\'' + '}'; } }
運行結果:
原對象:MyClass{name='hello'} 方法內修改后對象:MyClass{name='world'} 修改后對象:MyClass{name='hello'}
可以看到,雖然在方法內部將參數指向了一個新的對象,但是原對象的值并沒有改變。