函数传参一直是一个比较重要的点,今天我就详细解释一下。
最重要的一点:实参-->形参,传的永远是地址
- 基本数据类型传参------传的是常量在常量池中的地址
- 引用数据类型传参------传的是对象在堆内存中的地址
基本数据类型和引用数据类型的区别
- 基本数据类型------原子型数据,就是不可再拆分。基本类型就是直接赋值就可以了,比如:
inta=123; boolean=true;
- 引用数据类型------复合型数据,在当前的对象数据中,还包括了其他更多的子数据。所谓复合型数据,指得就是有多个基本数据或其他引用数据组成的一个数据。引用类型一般都是通过new关键字创建对象,然后把这个对象赋予给相应的变量,最常用的引用类型是String类型,它也比较特殊,可以直接通过关键字new来创建对象,也可以通过字符串直接赋值,比如: Strings=newString("abc"); Strings="abc";
传参的具体分析:
- 形参变量永远不可能去改变实参中已储存的数据地址 除非return 实参且接收。
- 就算形参变量所存储的数据地址被改变 那也是改变形参自己 与实参无关
- 无非是:实参本身指向的是一个对象,然后把这个对象的地址传递给了形参,形参就可以通过该地址去堆内存中找对象,可以修改对象中的数据,实参再去访问对象时,对象中的数据就已经被改变,因为实参和形参目前使用操作的都是同一个对象!
- 无论实参还是形参 实参就是把变量空间所存的地址给了形参而已。他们都是变量!
- 对于变量的修改而言,主要分两种:
1.要么改变该变量空间所存储的地址
int a=3;
a=7; //改变空间所存储的地址
int[] arr=new int[]{1,2,3};
arr=new int[]{3,2,1}; //改变空间所存储的地址
2.要么改变该变量空间所存储的地址所指向的那个对象中的数据
int[] arr=new int[]{1,2,3};
arr[0]=10; //改变该变量空间所存储的地址所指向的那个对象中的数据
对与基本数据类型而言,不能支持2操作!因为基本数据类型是原子性数据,不可再拆分!
那么今天我们的传参的相关问题就说完了,这是很重要的,一定要搞明白!!!
class Test02{
public static void main(String[] args){
int a=3;
int b=7;
swap(a,b);
System.out.printf("a=%d,b=%d\n",a,b);
int[] arr={3,7};
swap(arr[0],arr[1]);
System.out.printf("arr[0]=%d,arr[1]=%d\n",arr[0],arr[1]);
swap(arr);
System.out.printf("arr[0]=%d,arr[1]=%d\n",arr[0],arr[1]);
swap2(arr);
}
public static void swap(int m,int n){
m=7;
n=3;
}
public static void swap(int[] arr){
arr[0]=7;
arr[1]=3;
}
public static void swap2(int[] arr){//0xabc
arr=new int[]{10,20};
}
}
结果展示:
那么今天我们的传参的相关问题就说完了,这是很重要的,一定要搞明白!!!