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.函数形参引用的内容改变,实参的引用内容会改变。

扫描二维码关注公众号,回复: 5661182 查看本文章

3.基本数据类型形参在函数内部改变,实参不会改变。

经常听说java对象类型是引用传递,而基本类型是值传递。如果这样的话,上面的第一条就应该不成立啊。之前看过一篇文章,说java里都是值传递,只不过基本类型,在传递参数的时候,把值拷贝一份传递给形参;对象类型,在传递时,把对象的地址(引用)拷贝一份传递给形参。这样理解就可以解释上面的三种情况了。如下面的图:

初始情况:

testReference里,main把array的引用复制给形参,于是有图:

执行array=newArray后:

在testArray里:

main把arr的引用复制传递给形参后

执行

array[0]=5;
n=10;

于是main里的arr改变而n不变。

猜你喜欢

转载自blog.csdn.net/cl723401/article/details/88654377
今日推荐