Java的参数传递方式分为值传递和引用(地址)传递
值传递:是将变量的一个副本传递到方法中,方法中如何操作该变量副本,都不会改变原变量的值。
引用传递:是将变量的内存地址传递给方法,方法操作变量时会找到保存在该地址的变量,对其进行操作。会对原变量造成影响。
通过下面的例子来理解这两种方式的区别
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Main main = new Main();
String str = "123";
System.out.println("before:"+str);
main.changeStr(str);
System.out.println("after:"+str);
System.out.println("==============================");
User user = new User("user A");
System.out.println("before:"+user.name);
main.changeObject(user);
System.out.println("after:"+user.name);
System.out.println("==============================");
User user2 = new User("user A");
System.out.println("before:"+user2.name);
main.changeObjectValue(user2);
System.out.println("after:"+user2.name);
System.out.println("==============================");
int a[] = {1,2,3};
System.out.println("before:"+Arrays.toString(a));
main.changeArrayValue(a);
System.out.println("after:"+Arrays.toString(a));
}
public void changeStr(String str){
str = "hello world";
}
public void changeObject(User u){
u = new User("user B");//此处无法修改u为一个新的对象
}
public void changeObjectValue(User u){
u.name = "user C";//此处可以修改u对象的值
}
public void changeArrayValue(int[] a){
a[0] = 4;
a[1] = 5;
a[2] = 6;
}
static class User{
public User(String name){
this.name = name;
}
String name;
}
}
输出结果如下:
before:123
after:123
==============================
before:user A
after:user A
==============================
before:user A
after:user C
==============================
before:[1, 2, 3]
after:[4, 5, 6]
通过上面例子可以得出结论如下:
一个方法不能修改一个基本数据类型的参数(即数值型、布尔型、String)。
一个方法可以改变一个对象(数组)参数的状态。
一个方法不能让对象参数(数组)引用一个新的对象。