引用数据类型和基本数据类型作为方法形参的区别
1、基本数据类型作为形参传参时,变量值在本函数内部不会发生改变:
public class Test {
public static void main(String[] args)
{
int i=10;
Test test=new Test();
test.test(i);
System.out.println(i);
}
public void test(int i)
{
i=20;
System.out.println(i);
}
}
当引用类型作为参数的时候,局部变量会对实际参数造成影响:
public class Test{
public static void main(String[] args)
{
int arr[] ={1,2,3,4,5,8,9,4,7,2};
sort(arr);
put(arr);
}
public static void sort(int arr[])
{
for(int i=0;i<arr.length-1;i++)
{
for(int j=0;j<arr.length-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
public static void put(int arr[])
{
System.out.print("{")
for(int i=0;i<arr.length;i++)
{
if(i==arr.length-1){
System.out.println(arr[i]+"}");
}else
{
System.out.println(arr[i]+",");
}
}
}
}
可以看出元素发生了改变,我们调用sort()的时候并没有将arr返回接收给原来的main方法中定义的arr数组,但是arr中的数据还是被修改了!
这是因为基本数据类型的存储方式和引用类型的存储方式不一样,基本数据类型存储时直接存储在栈中,而引用类型的存储时引用存储在栈中,而真实的数据却存储在堆中,就是栈中存储的一个十六进制的地址,这个地址指向的位置就是数据真实存储的地址。
而引用类型作为参数就是将栈中存储的地址拷贝给了方法中的形参,形式参数通过地址找到数据存储地址然后进行一顿操作!这时候你原来的被拷贝所指向的地址中的数据就被修改了!就像别人找你要了你家地址,然后把你家弄得很乱,你自己回去看到的就不是原来的样子了,你和别人就像在栈中存储的引用,你家地址就是你们所存储的数据,而你的加就是堆中的真实数据。
在我的理解中:局部变量的实参传递是和引用类型是一样的,只不过基本数据存储的是值,而引用类型存储的是地址,他们之间参数传递都是通过copy的,只不过引用类型实际操作的地址的指向,而基本类型操作的栈中的复制数据。