Java int [] arr数组以“引用”方式被传递

最近遇到了一个有趣的问题?java方法参数的传递是不是总是按值传递(pass-by-value)?

1.看案例

class TestDemo
{

    public static void main(String[] args) 
    {
        int [] arr1=new int[]{1,3,6,2,9};
        printArrays(arr1);//输出的结果:13629
        reverseArray(arr1);//输出的结果:92631
        printArrays(arr1);//输出的结果:13629
    }

    /**求逆向数组*/
    public static void reverseArray(int [] arr){
        int [] arr_new=new int[arr.length];
        for(int i=0;i<arr.length;i++){
            arr_new[arr.length-1-i]=arr[i];
        }
        arr=arr_new;//这里到底有没有改变原本arr1的引用?
        printArrays(arr);
    }

    /**打印数组*/
    public static void printArrays(int [] arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]);
        }
        System.out.println("");
    }

}

2.案例分析

  • 运行上面的main方法输出的结果是:

    printArrays(arr1);//输出的结果:13629
    reverseArray(arr1);//输出的结果:92631
    printArrays(arr1);//输出的结果:13629
    
  • 为什么运行main方法输出的结果不是:

    printArrays(arr1);//输出的结果:13629
    reverseArray(arr1);//输出的结果:92631
    printArrays(arr1);//输出的结果:92631
    
  • 求逆向数组那个方法传递的不是数组的引用么?:

    其实在java中,方法参数的传递总是按值传递的(pass-by-value),上面的这个reverseArray方法固然也是值传递,只不过接收的参数是一个引用,而不是基本数据类型。既然是reverseArray方法是值传递,那么arr=arr_new;这行代码是不会改变arr1的引用,因为reverseArray方法是值传递嘛。reverseArray方法里接收的那个参数明明是引用呀?是,该参数的值是一个引用。

  • java方法参数的传递总是按值传递:

    java中的方法的参数总是按值传递的,但是接收的参数可能会是一个引用,也有可能会是一个基本的数据类型。如果是一个引用,那么我们就可以拿到该引用去操作该引用指向的内存的数据。例如上面的例子:

    参数接收的是一个数组引用,通过该引用可以去操作数组:arr.length 、 arr[i] 都是通过参进来的引用去操作数组。

  • 上面的TestDemo如何修改才能实现修改arr1的引用?:

    只修改reverseArray方法,该方法只要返回一个int [] 引用,并重新赋值给arr1即可改变arr1的引用。

class TestDemo
{

    public static void main(String[] args) 
    {
        int [] arr1=new int[]{1,3,6,2,9};
        printArrays(arr1);//输出的结果:13629
        arr1=reverseArray(arr1);//输出的结果:92631
        printArrays(arr1);//输出的结果:13629
    }

    /**求逆向数组*/
    public static int [] reverseArray(int [] arr){
        int [] arr_new=new int[arr.length];
        for(int i=0;i<arr.length;i++){
            arr_new[arr.length-1-i]=arr[i];
        }
        arr=arr_new;//这里到底有没有改变原本arr1的引用?
        printArrays(arr);
        return arr;
    }

    /**打印数组*/
    public static void printArrays(int [] arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]);
        }
        System.out.println("");
    }

}

  • 修改后运行上面的main方法输出的结果是:

    printArrays(arr1);//输出的结果:13629
    arr1=reverseArray(arr1);//输出的结果:92631
    printArrays(arr1);//输出的结果:92631
    
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值