在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'}
可以看到,虽然在方法内部将参数指向了一个新的对象,但是原对象的值并没有改变。