值传递
基本类型和引用类型数据存储
在Java中声明一个基本类型,基本类型的值与基本类型的句柄信息一同存放在栈中。而声明一个引用类型时,引用类型的值放在堆中,而句柄信息和值在堆中的地址放在栈中。如图:
值传递
上简单的测试代码帮助我们理解:
public static void exchange(int a,int b)
{
int c=a;
a=b;
b=c;
}
这里定义了一个交换函数,形参为整形的a,b。
我们定义int a=10;int b=20;执行exchange(a,b);
这时我们再查看a和b的值发现a,b的值并没有互换,而是保持原来的样子,这是为什么呢?结合存储,我们来分析下:
a’,b’为函数的形参,形参复制对应,a,b的值,而新声明的c复制a’的值为10;
之后执行函数里面的赋值操作,最后函数结束,内存回收,则a’、b’和c都被回收,而原有的a和b的值并没有改变。
我们再来看引用类型例子:
public static void exchange(Person a,Person b)
{
Person c=a;
a=b;
b=c;
}
同理,这时候形参复制的就不是对应数据的值了,而是对应在堆中的地址,同样在函数结束后回收,而原数据依旧没有改变。
这里的箭头,意思是句柄信息指向堆中的地址。我们发现a和b的地址指向并没有改变。