在介绍Java的传递方式之前先看以下代码
public static void main(String[] args) {
int n=10;
int m=20;
exchange(n,m);
System.out.println("n="+n);
System.out.println("m="+m);
}
public static void exchange(int a,int b) {
int temp=a;
a=b;
b=temp;
//下面是程序运行结果
n=10
m=20`。
}
这是因为Java时是按值调用在进行参数传递。在exchange方法种a,b值是拷贝的n,m的值。在经过互换之后,随着函数的结束 ,a,b随之被内存回收。而n,m的值并没有发生任何改变。从中不难看出Java在进行方法调用的时候不会改变原参数。
再看下面的代码
public static void main(String[] args) {
int []i= {1,3};
int []j= {2,4};
exchange(i,j);
System.out.println(Arrays.toString(i));
System.out.println(Arrays.toString(j));
}
public static void exchange(int []a,int []b) {
int []temp=a;
a=b;
b=temp;
}
//下面是程序运行结果
[1, 3]
[2, 4]
同样的数组i和j的值并没有发生任何变化。下面对代码进行分析。
数组 i 记录的信息只有它的首地址和长度。i指向的是{1,3}中“1”的地址。在exchange中int[]a和int[]b中传递的值是地址信息。通过转换之后a,b中的信息进行了转换。但是在函数结束之后a,b。又被内存回收了。a,b发生的变化完全作用不到数组i,j。
我们在exchange中加入如下代码
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
会发现在exchange中a,b的值发生了互换。这就证明了Java中一个方法不会对原参数的值发生改变。
通过这两个例子我们不难发现在方法结束的时候a,b都会被舍弃。这说明Java语言对对象采用的不是引用调用,而是按值传递的。
下面是Jav中方法参数的使用情况
- 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)
- 一个方法可以改弊哪一个对象参数的状态
- 一个方法不能让对象参数引用一个新的对象。