淘先锋技术网

首页 1 2 3 4 5 6 7

在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'}

可以看到,虽然在方法内部将参数指向了一个新的对象,但是原对象的值并没有改变。