Java中的方法参数的传递,分为值传递和引用传递,但是,实际上Java中只有值传递。而引用传递可以理解为传的是指针(c语言中)。值传递就是把变量的值传递过去,引用传递则是把数据的地址(即变量在内存空间的地址)传递过去。
目录
1.值传递
2.引用传递
一.值传递
当方法内传递的是基本数据类型时采用值传递,在这种传递方式下,传递的是值的拷贝,形参的改变并不会影响实参(即方法内外互不相干)。
再此之前需要了解一下Java内部的内存布局:
基本数据类型:
数值型:
整型:byte,short,int,long
浮点型:float,double。
字符型: char
布尔型: boolean
接下来看代码
public class swap_9 {
public static void main(String[] args){
AB sp=new AB();
int a=10,b=20;
sp.swap(a,b);
System.out.println("出方法后a和b的值"+a+" "+b);
}
}
class AB{
public void swap(int a,int b){
int tmp=a;
a=b;
b=tmp;
System.out.println("在方法内交换后的a和b的值"+a+" "+b);
}
}
这段代码执行后的结果是
可以看到,在swap方法内对形参a和b进行交换,出方法后实参a和b并没有发生改变,它jvm中的执行过程如下,当执行到方法后进入swap栈桢,在swap栈内,swap栈内的a,b,进行交换,输出20,10,之后swap方法执行完,sawp栈会销毁,继续执行main栈内的代码,而此时的a,b是main栈内的,所以,a,b并不发生改变,仍旧是10,20。
二.引用传递
引用传递主要发生在引用数据类型中,在方法调用时,传递的是引用的地址(变量在内存空间内的地址),传递的是拷贝(副本),所以此时,变量和他的拷贝(副本都指向同一个空间地址),形参的改变将影响实参。
下面以数组为列:
public class swap_9 {
public static void main(String[] args){
AB sp=new AB();
int[] a={1,2,3};
sp.swap(a);
System.out.println("出方法后a[0]="+a[0]);
}
}
class AB{
public void swap(int[] a){
a[0]=500;
System.out.println("在方法内改变a[0]的值后a[0]="+a[0]);
}
}
可以看到,在方法内改变了a[0]的值,外部a[0]的值也发生了改变。它在内存中的执行过程如下
在swap栈内的a数组是main栈内a数组的副本(拷贝),二者指向同一地址所以这两个a数组任一方的改变,都影响着彼此,即形参的改变影响着实参。