方法参数传递
Java只有值传递,没有引用传递
下面是非常经典的例子:
public static void main(String[] args) {
int a = 1;
int[] arr = {1}
test(a);
test2(arr);
System.out.println(a); // 结果为1
System.out.println(arr[0]); // 结果为2
}
public static void main(int a) {
a = a * 2;
}
public static void main(int a) {
arr[0] = arr[0] * 2;
}
从结果上看,基本数据类型的传参是明显的值传递,不会对实参产生影响,而引用数据类型类型则对实参产生了影响,似乎引用数据类型的传参是引用传递
其实引用数据类型传参过程本质还是值传递,只是拷贝了引用数据类型的引用,与下面代码等价:
int[] args = new int[]{1};
int[] paras = args;
para[0] = paras[0] * 2;
这就是多个引用指向同一个对象
再举个例子:
int[] arr = {1, 2, 3};
int[] arr2 = {3, 2, 1};
sout...//输出两个数组
swap(arr, arr2);
sout...//输出两个数组
public static void swap(int[] arr, int[] arr2) {
int[] temp = arr;
arr = arr2;
arr2 = temp;
}
/*
输出结果:
交换前
[1, 2, 3]
[3, 2, 1]
交换后
[1, 2, 3]
[3, 2, 1]
*/
这段代码希望通过交换引用来实现交换两个数组的输出,如果成功则方法调用是引用传递,如果失败则是值传递
从输出结果可以看出Java是值传递的,即使传递的对象是引用。这个例子中的交换其实只有引用的拷贝互相交换了引用的数组,如果在这个方法中输出两个数组,则会发现交换了。
结论:
1.方法的传参只有值传递,意味着不能对原来的变量的取值产生影响
2.从第一点出发,方法体内的局部变量是不能跨方法的,即不能在其他方法中原原本本地被使用
3.引用的值传递可以改变对象的状态,改变对象的数据