Java数组传递的问题
最近在写code的时候,遇到了一个问题:
将函数的数组形式参数的引用改变了,实参的引用没有改变
package com.cl.ch2;
import java.util.Arrays;
public class MoveZeros {
public void moveZeroes(int[] nums) {
int[] temp = new int[nums.length];
int j=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
temp[j++]=nums[i];
}
}
while(j<nums.length){
temp[j++]=0;
}
nums=temp;
}
public static void main(String[] args) {
int arr[] = {0,1,0,3,12};
new MoveZeros().moveZeroes(arr);
System.out.println(Arrays.toString(arr));
}
}
可以看到输出:
开始是百思不得其解。
数组明明传递的是引用,那么函数里改变引用,外面应该也会改变啊。
写了个测试:
package com.cl.ch2;
import java.util.ArrayList;
import java.util.Arrays;
public class TestArrat {
/**
* 测试ArrayList函数里形参的引用改变是否会引起实参引用的改变
* @param array
*/
public void testRefrence(ArrayList<Integer> array){
ArrayList<Integer> newArray = new ArrayList<Integer>();
newArray.add(1);
newArray.add(2);
array=newArray;
System.out.println("testRefrence: "+array.toString());
}
/**
* 测试形参数组对象的引用的内容的改变,实参数组是否改变
* 测试形参为基本数据类型时,其内容改变,实参是否改变
* @param array
* @param n
*/
public void testArray(int array[],int n){
array[0]=5;
n=10;
System.out.println("testArray:array:"+Arrays.toString(array)+": n="+n);
}
public static void main(String[] args) {
ArrayList<Integer> array = new ArrayList<Integer>();
array.add(4);
array.add(5);
TestArrat t = new TestArrat();
t.testRefrence(array);
System.out.println("main:array:"+array.toString()+"\n+***********************");
int arr[] = {55,66};
int n = 0;
t.testArray(arr,n);
System.out.println("main: arr:"+Arrays.toString(arr)+" n="+n);
}
}
结果:
可以看到
1.在函数里改变形参的引用,实参的引用不会发生改变。
2.函数形参引用的内容改变,实参的引用内容会改变。
3.基本数据类型形参在函数内部改变,实参不会改变。
经常听说java对象类型是引用传递,而基本类型是值传递。如果这样的话,上面的第一条就应该不成立啊。之前看过一篇文章,说java里都是值传递,只不过基本类型,在传递参数的时候,把值拷贝一份传递给形参;对象类型,在传递时,把对象的地址(引用)拷贝一份传递给形参。这样理解就可以解释上面的三种情况了。如下面的图:
初始情况:
testReference里,main把array的引用复制给形参,于是有图:
执行array=newArray后:
在testArray里:
main把arr的引用复制传递给形参后
执行
array[0]=5; n=10;
于是main里的arr改变而n不变。