java中只有一种传参方式,值传递。即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
值传递分为两种:基本数据类型传参和引用数据类型传参。为了更加形象的解释值传递,我们下面用“交换两个变量值”来说明。
基本数据类型传参:
public class ParamTransmit {
public static void main(String[] args) {
int i = 4;
int j = 5;
System.out.println("before: i = " + i + ", j = " + j);
exchange(i, j);
System.out.println("after: i = " + i + ", j = " + j);
}
public static void exchange(int m, int n) {
int temp = m;
m = n;
n = temp;
}
}
结果:
before: i = 4, j = 5
after: i = 4, j = 5
引用数据类型传参:
public class ParamTransmit {
public static void main(String[] args) {
DemoClazz demoClazz = new DemoClazz();
demoClazz.i = 4;
demoClazz.j = 5;
System.out.println("before: i = " + demoClazz.i + ", j = " + demoClazz.j);
exchange(demoClazz);
System.out.println("before: i = " + demoClazz.i + ", j = " + demoClazz.j);
}
public static void exchange(DemoClazz demo) {
int temp = demo.i;
demo.i = demo.j;
demo.j = temp;
}
}
class DemoClazz {
int i;
int j;
}
结果:
before: i = 4, j = 5
before: i = 5, j = 4
可以看到如果传入的参数是基本数据类型,exchange方法执行之后其实没有影响到原本的变量。但是如果传入的是引用数据类型,exchange方法执行之后是影响了原本的变量的。
下面给出两张内存图分别解释下两种情况下内存中是如何运行的:
基本数据类型内存图:
引用数据类型内存图:
可变个数形参
1、可变个数形参在调用时,可以传入0~无穷多个参数。
2、若参数除了可变形参还有其它参数,可变个数参数必须声明在最后一个位置。
3、可变个数形参与数组参数的使用方式一致。
/**
* 可变个数形参
*
* @param args
*/
public void test(String ...args) {
for (String str : args) {
System.out.println(str);
}
}
/**
* 数组参数
*
* @param args
*/
public void test2(String[] args) {
for (String str : args) {
System.out.println(str);
}
}