Java 传参的方法---值传递
Java 使用按值传递的方式将实参传递给方法。同时传递基本数据类型变量的值与传递引用数据类型的值有很大的不同。接下来我将举例说明。
java传参过程:
调用方法时,把实参传递给形参,在方法内部使用形参(实参 ——>形参 传的永远是地址)
基本数据类型包括:整型、浮点型、字符型、布尔型
引用数据类型包括:接口、类、数组
基本数据类型按值传参:传的是就是常量本身,而常量在常量池中有固有的地址,所以实质上基本数据类型传参传的是就是常量在常量池中的地址,
引用数据类型按值传参:传的是对象的值,而对象的值就是地址,所以实质上引用数据类型传参传的就是对象在堆内存中的地址
接下来我会举例说明:
class test{
public static void main(String[] args){
int c=3;
int d=7;
System.out.println("交换前"+c+","+d);
swap(c,d);
System.out.println("swap交换后"+c+","+d);
int [] a = {3,7};
System.out.println("交换前"+a[0]+","+a[1]);
swap(a[0],a[1]);
System.out.println("swap交换后"+a[0]+","+a[1]);
System.out.println("交换前"+a[0]+","+a[1]);
swapArr(a);
System.out.println("swapArr交换后"+a[0]+","+a[1]);
}
public static void swapArr(int[] array){//参数为引用数据类型
int temp = array[0];
array[0] = array[1];
array[1] = temp;
}
public static void swap(int n1, int n2){//参数为基本数据类型
int temp = n1;
n1 = n2;
n2 =temp;
}
}

代码1-6行:(基本数据类型传参)

综上所述,在主函数中并没有执行交换c,d的操作,他只是在swap方法中将n1,n2的值交换,不影响主函数中c,d的值,所以输出值不变仍为3,7
代码7-10行:(基本数据类型传参)

理由同上,即使此时main函数中定义的是引用数据类型数组,它的值也不发生变换的原因是 swap方法的参数列表中定义的是基本数据类型,所以此时交换也只是交换了swap方法中n1,n2的值,不影响主函数中c,d的值,所以输出值不变仍为3,7
代码11-14行:(引用数据类型传参)

因为方法中的数组和main函数中的数组始终指向堆中数组a的地址,即图中④⑤所示,所以当堆中数组a[0],a[1]的值发生交换时,main函数中a[0],a[1]也随之变化,所以输出值为7,3
总结:
基本数据类型:你买了一瓶水a(形参),你朋友也买了一瓶水b(实参),你把你的水喝掉了,并不影响你朋友瓶子里的水,即当使用基本数据类型作为方法的形参时,在方法体中对形参的修改不会影响到实参的数值
引用数据类型:你和你朋友共同买了一瓶水(这瓶水既扮演了形参又扮演了实参),你把水喝掉了,那你跟你朋友就都没水了,即当使用引用数据类型作为方法的形参时,若在方法体中修改形参指向的数据内容(水的多少),则会对实参变量的数值产生影响,因为形参变量和实参变量共享同一块堆区; 当你把水喝掉后,你朋友并没有喝水的意思,而是想吃苹果(形参变量的指向,由原来的喝水变为吃苹果),此时他吃苹果并不影响你喝水,即当使用引用数据类型作为方法的形参时,若在方法体中修改形参变量的指向,此时不会对实参变量的数值产生影响,因此形参变量和实参变量分别指向不同的堆区;
Java采用值传递方式传参,基本数据类型传递的是常量池中的值,而引用数据类型传递的是堆内存中的对象地址。在方法内对基本数据类型形参的修改不会影响实参,但对引用数据类型形参的修改可能影响实参,取决于是否改变指向。

809

被折叠的 条评论
为什么被折叠?



