Java 值转递?引用传递?
常见的情况
当我们向方法中传递参数的时候,有时会向方法里传递基本类型的数据,可能会传递引用类型的数据。
在方法里可能会对这个传递参数进行修改,但是不知道会不会对方法外的值造成影响。
通过以下例子则可以完全不再困惑。
/**
* 值传递和引用传递
*/
public class Test {
public static void main(String[] args) {
int a = 1;
StringBuilder stringBuilder = new StringBuilder();
change(a);
System.out.println(a);//输出为1
change(stringBuilder);
System.out.println(stringBuilder);//输出为1
}
public static void change(int a) {
a = 2;
}
public static void change(StringBuilder stringBuilder) {
stringBuilder.append("1");//对stringBuilder指向的内存修改
stringBuilder = null;//对这个地址修改,对外部的stringBuilder无效
}
}
定义
1、值传递
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
2、引用传递
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
结论
java中只有值传递。
如果方法传递的参数是基本数据类型,则真正传入的是这个基本数据的数值拷贝,方法里的任何操作都不会影响方法外的值。
如果方法传递的参数是引用类型,则传入的是这个引用类型指向堆内存地址的拷贝,如果在这个方法里对这个拷贝地址指向的内存区域有所改变,则会影响方法外的引用变量的改变;如果是修改这个拷贝地址的指向,则不会对方法外的变量生效。