java 中方法参数传递看似有两种,值传递和引用传递。而实际上都是值传递。
所谓值传递,传递的是变量的副本就是说,在将变量 a 作为参数传进方法中时,方法中接收到的是 a 的副本,在方法中对参数的修改实际上修改的是 a 的副本,所以不会影响到 a 的值。
而引用传递,传递的是变量的内存地址。在将变量 a 作为参数传递给方法时,传递的是 a 的内存地址,在方法中对参数的修改,实际上是修改的 a 本身。
因为 java 的变量有两类,一类是基本数据类型,一类是引用类型。所以就把基本数据类型作为参数进行传递时,当做了“值传递“;把引用类型作为参数进行传递时,当做了“引用传递“。 事实上无论是传递基本数据类型还是引用类型,java 中都是按“值传递”进行操作的。
在引用变量 r 作为 参数传到方法中时,传递的是 r 的副本。只不过 r 和 r 的副本都指向了同一个对象。
public class TestParamPassing {
public static void main(String[] args) {
int b = 4;
testValueParam(b);
System.out.println("======== b : " + b);
List list = new ArrayList();
list.add("a");
list.add("b");
testReferenceParam(list);
System.out.println("======== list : " + list);
}
public static void testReferenceParam(List list){
list.add("c");
list = new ArrayList<>();
list.add("d");
System.out.println("-------- list : " + list);
}
public static void testValueParam(int a){
System.out.println("======== a: " + a);
a=3;
System.out.println("======== a after : " + a);
}
}
执行结果为:
======== a: 4
======== a after : 3
======== b : 4
-------- list : [d]
======== list : [a, b, c]
在方法 testValueParam(int a)中,因为是“值传递”,所以传到方法中的是原始值的副本,所以在方法中对 a 的修改,不会影响到原始值。
在方法 testReferenceParam(List list)中,因为是“值传递”,所以传到方法中的是原始值的副本,所以两者都指向了同一个对象,因此在方法中对对象的修改,会影响到原始值指向的对象。但是,当在方法中,将副本指向了其他的对象,再对副本指向的对象进行修改,就不会影响到原始值所指向的对象了。所以在传递引用变量时,也是“值传递”。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于