Java方法的参数传递方法只有一种:值传递。
所谓值传递,就是将实际参数的副本传入方法,而参数本身不会受任何影响。
分为基本类型参数和引用类型参数两种传递考虑
1.基本类型参数传递
例如:
package parameter;
public class FundamentalType {
public static void swap(int a,int b){
int tmp=a;
a=b;
b=tmp;
System.out.println("swap方法里,a的值是"+a+",b的值是"+b);
}
public static void main(String[] args){
int a=6;
int b=9;
swap(a, b);
System.out.println("交互结束后方法里,a的值是"+a+",b的值是"+b);
}
}
结果为
swap方法里,a的值是9,b的值是6
交互结束后方法里,a的值是6,b的值是9
可见swap()方法里a,b的值是9,6;j交换结束后变量a,b的值依然是6,9并没有改变
也就是说main()方法里的变量a,b,并不是swap方法里的a,b
实际上,当系统开始执行方法时,系统为形参执行初始化,就是把实参变量的值附给方法的形参变量,方法里操作的并不是实际的实参变量。
2.引用类型参数传递
引用类型参数传递一样采用值传递的方式,只不过是在传值的时候,将实参所指向的地址值传给了形参,并没有改变栈内存中的实参,而是改变了他们所引用的堆内存的对象,这样在形参引用堆内存中的对象时,会对堆内存的对象进行修改,看起来就像传入实参本身一样
例如:
package parameter;
class DataWrap{
int a;
int b;
}
public class ReferenceType {
public static void swap(DataWrap dw){
int tmp=dw.a;
dw.a=dw.b;
dw.b=tmp;
System.out.println("swap方法里,a成员变量的值是"+dw.a+",b成员变量的值是"+dw.b);
}
public static void main(String[] args){
DataWrap dw=new DataWrap();
dw.a=6;
dw.b=9;
swap(dw);
System.out.println("交换结束后,a成员变量的值是"+dw.a+",b成员变量的值是"+dw.b);
}
}
运行结果为
swap方法里,a成员变量的值是9,b成员变量的值是6
交换结束后,a成员变量的值是9,b成员变量的值是6
示意图: