首先解释一下值传递和引用传递的概念
值传递:值传递是指在参数的传递过程中,形参拿到的只是实参的数值,而并非实参的地址,是对实参所指向对象的一个副本的操作,对形参的修改不会影响到实参的值。
引用传递:引用传递是指在参数的传递过程中形参拿到的是实参的地址,是对数据单元的数据的直接操作,对形参的修改会影响到实参的值。
java中只存在值传递。
值传递举例:
public class Test{
public static void main(String[] args) {
int a = 1, b=2;
Test test = new Test();
test.change(a, b);
System.out.println("a="+a+"b="+b);
}
public void change(int i, int j) {
int t = i;
i = j;
j = t;
}
}
结果:
a=1b=2
很显然是一个值传递,只是将a所指的对象在内存单元中复制一个副本,然后将副本传递给形参。
画图说明
对象空间分配
参数传递后
方法体执行后
可以看出是值传递的过程。
再看一个例子:
public class Test{
public static void main(String[] args) {
int[] a = {1,2,3,4};
Test test = new Test();
test.change(a);
System.out.println(a[1]);
}
public void change(int[] b) {
b[1] = 3;
}
}
结果:
3
你可能会问不是说只有值传递吗?,其实这里也是值传递,传递的是地址。为什么这样说的,int[] a = {1,2,3,4},其实是
int[] a = new int[]{1,2,3,4}; 在调用方法change时,会将a所引用的地址复制一份,然后将地址传递给方法的形参,方法对地址的对象进行改变,所有改变的还是原对象。而基本数据类型引用的直接是值,传递的是复制的值,改变也是改变的值的副本,所以原来的值是不变的。