先看一组代码:
public static void main(String[] args) {
int a = 1;
int b = 2;
int[] array = {1,2};
swap(a, b);
System.out.println(a + " " + b);
swap(array, 0, 1);
System.out.println(array[0] + " " + array[1]);
}
public static void swap(int x,int y){
int z = x;
x = y;
y = z;
}
public static void swap(int[] array,int x,int y){
int xx = array[x];
int yy = array[y];
array[x] = yy;
array[y] = xx;
}
最后结果分别是1,2(基础数据类型传值);2,1(引用数据类型传值)
基础数据类型传值和引用数据类型传值的区别
基本变量类型:
在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的
引用变量类型:
只要是引用数据类型变量,其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址
! 地址的区别
在方法中定义的非全局基本数据类型变量,调用方法时作为参数是按数值传递的
也就是说
public static void swap(int x,int y)
这里的x和y实际上是新开创的地址,然后将外部的a和b的数值复制而成的。
因此在方法内部对x和y的任何操作都不会对外部的a和b造成影响
引用数据类型变量,调用方法时作为参数是按引用传递的
public static void swap(int[] array,int x,int y)
我们可以看到,这里传进去的x和y,是array数组的下标。
也就是说,所谓引用传递,就是说传进方法内的是外部a和b两个数所在的地址。
因此,在方法内部,是对计算机底层对应地址中的数进行操作,由于外部的数实际上就是对应地址中的值,所以外部的数也就被改变了。