Java的值传递

  对值传递、引用传递有些疑问,综合其他人的解释,加上自己的理解,在这里分享一下,如有不当之处,恳请指出。

1、概念

  值传递、引用传递,是计算机领域的专有名词。
  值传递和引用传递,属于函数调用时参数的求值策略(Evaluation Strategy),这是对调用函数时,求值和传值的方式的描述,而非传递的内容的类型(内容指:是值类型还是引用类型,是值还是指针)。(参考:链接:https://www.zhihu.com/question/31203609/answer/112157038作者:Yolanda。著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。)
  值传递和引用传递,和Java概念里的值类型(基本数据类型)、引用类型(String、数组等)没有任何联系,这一点比较容易混淆。值类型/引用类型,是用于区分两种内存分配方式,值类型在调用栈上分配,引用类型在堆上分配。一个描述内存分配方式,一个描述参数求值策略,两者之间无任何依赖或约束关系。

2、为什么Java中的是值传递

image.png

2.1例一(参数为基本数据类型)

  public static void main(String[] args) {
         int i = 0;
        //传一个值类型(基本数据类型)
        test1(i);
        System.out.println("i="+i);
        //结果:i=0
    }
    /**
     * 函数一
     * @param param
     */
    public static void test1(int param) {
        //  摔了一跤
        param = 1;
    }

  例一中,param存储的是拷贝传入变量的值,而不是地址。打个比方,我(变量i)有一杯水(i=0),你(test1函数)也想要喝,但是不能直接把我的喝掉,不然我就没得喝了,于是乎,你拿出双鱼玉佩(参数param)复制了一杯一模一样的水。现在,我们都有了一杯水。然后,你一不小心,摔了一跤,把那杯水倒在地上了( test1中param = 1;),你的水没了,但是对我没有什么影响。所以,结果:i=0

2.1例二(参数为引用数据类型:String)

  public static void main(String[] args) {
        String s="s1";
        //传一个引用类型(引用数据类型:String)
        test2(s);
        System.out.println("s="+s);
        //结果:s=s1
    }
    /**
     * 函数二
     * @param param
     */
    public static void test2(String param) {
        //  吃的开心,去唱歌
        param = "s2";
    }

  例二中,param存储的是拷贝传入变量的地址。打个比方,我(s)在沙县国际大饭店定了个包间“芙蓉厅”,服务员给了我一张房卡(s="s1";),同时我邀请你(test2函数)也来,找服务员给了你一张“芙蓉厅”的房卡(param="s1"),吃了一半,你吃饱了,想去唱歌,你把“芙蓉厅”的房卡(param="s1")扔了,换了“真难听”ktv包间的房卡(param = "s2";)。此时,我手里的仍然是“芙蓉厅”的房卡(param="s1"),你的换的是自己手里的卡,并没有把“芙蓉厅”拆了,重新装修成“真难听”ktv包间。所以,结果:s=s1

2.1例三(参数为引用数据类型:数组)

  public static void main(String[] args) {
        int[] arr=new int[1];
        arr[0]=1;
        //传一个引用类型(引用数据类型:数组)
        test3(arr);
        System.out.println("arr[0]="+arr[0]);
        //结果:arr[0]=99
    }
    /**
     * 函数三
     * @param arrParam 复制房卡arr
     */
    public static void test3(int[] arrParam) {
        //喝多了,砸场子
        arrParam[0] = 99;
    }

  例三中,param存储的是拷贝传入变量的地址。打个比方,我在沙县国际大饭店定了个包间“芙蓉厅”,服务员给了我一张房卡(arr),我点了一桌子菜(arr[0]=1;),同时我邀请你(test3函数)也来,找服务员也给了你一张“芙蓉厅”的房卡(arrParam=arr,复制arr的地址),吃了一半,你喝多了,发酒疯,把桌子砸了(arrParam[0] = 99;)。我从去了趟厕所,回来一看,一片狼藉,还以为走错了,拿出卡一看,还是arr呀,没错呀,但是一桌子菜砸成渣了(arr[0] = 99;)。所以,结果:arr[0] = 99;

3、总结

  首先,在Java中是值传递。值传递、引用传递中的“值”、“引用”和Java中的数据类型(基本数据类型、引用数据类型)没有关系,不用把这一点搞混淆。
  其次,在Java中,变量传给某个函数后,变量本身的值、地址没有影响。例三中,虽然arr[0] = 99;但是arr数组本身指向的地址却没有改变,改变的是数组元素中的地址。
  最后,以上是个人对Java值传递的理解,欢迎和大家一起沟通交流。
  著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(Java的值传递)