值传递
在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,因为实参和形参再内存上是两个独立的变量,所以方法执行中形式参数值的改变不影响实际参数的值。简单来说值传递中传递的参数是值的拷贝。
- 基本数据类型是值传递
引用传递
在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。实际参数是对象(或数组),这时形参和实参在内存上指向的是同一地址,对形参的改变会影响实参。对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。
- 所有的对象都是引用传递
代码分析
现在有如下代码:
public static void main(String[] args) {
int a = 2;
String b = "3";
int[] arr = new int[]{1,2,3,4};
Ch ch = new Ch();
System.out.println("调用方法前主方法中a = "+ a + ",b = " + b);
System.out.println("调用方法前主方法中arr:"+ Arrays.toString(arr));
System.out.println("调用方法前主方法中ch.c = "+ ch.c);
change(a,b,arr,ch);
System.out.println("调用方法后主方法中a = "+ a + ",b = " + b);
System.out.println("调用方法后主方法中arr:"+ Arrays.toString(arr));
System.out.println("调用方法后主方法中ch.c = "+ ch.c);
}
public static void change(int a, String b,int[] arr,Ch ch) {
a = 100;
b = "200";
arr[0] = 999;
arr[1] = 888;
ch.c = 'Z';
System.out.println("change方法中a = "+ a + ",b = " + b);
System.out.println("change方法中arr:"+ Arrays.toString(arr));
System.out.println("change方法中ch.c = "+ ch.c);
}
static class Ch {
public char c = 'A';
}
运行结果如下:
通过代码的运行结果,我们可以看出,通过方法传递后,int类型变量a和String类型的变量b原先的值并没有受到change方法执行后的影响,并输出了原值,而数组arr和类Ch的成员变量经过change方法后值被改变了。此时变量a和变量b的传递就是值传递,而数组arr和类Ch的成员变量的值的传递被改变 ,则为引用传递。
总结
- 值传递:基本数据类型的传递,对行参的修改不会影响实参
- 引用传递:引用数据类型的传递,对参数的修改会影响到实际的对象
- Integer、String、Double等特殊类型的传递,也为值传递
- 传递的是数组或对象,都为引用传递