java 值传递和引用传递

一.首先要了解的是基本数据类型和引用数据类型
对于基本数据类型,进行数值的赋值的时候,是将这个值直接存放到这个变量当中
而对于引用数据类型,进行数值的赋值的时候,是将这个变量引用的地址所对应的值改变

再调用方法的时候,实际上就是赋值的操作
这里有个例子

 public static void main(String[] args) {
        int num=1;
        String str="abc";
        char[] ch={'a','b','c'};
        change(num,str,ch);
        System.out.println(num);
        System.out.println(str);
        System.out.println(ch);
        foo(ch);
        System.out.println(ch);

    }
    public static void change(int n,String s,char[] c)
    {
        char[] b={'1','2','3'};
        n=2;
        s="bcd";
        c=b;
    }
    public static void foo(char[] c)
    {
        c[0]='g';
    }

输出结果如下:
java 值传递和引用传递
对于num来说这就是最经典的值传递
将num的值传递给change方法里的n,在这个方法中实际上是对于n的值的改变,而没有对num的值改变

对于str来说虽然是引用类型,但是!在change方法里它的值发生了改变,它就会在堆里面重新开辟一个新的空间,也就是说在change方法里面,s变量实际上是String s= new String(“bcd”);
java 值传递和引用传递
对于字符数组char[] ch在change方法里跟str相同,都是对于原先的数组长度发生了改变,从而在堆里面重新开辟一个新空间。
而在foo方法里,ch是将它的引用传递给c,然后c在foo方法直接将索引对应的值改变,并没有将原有的数组改变,所以它们就是共用一个堆空间,ch因此改变了它的ch[0]的值。

java 值传递和引用传递
总结:
值传递:实际上是在方法里创建了一个副本用来存放值,并没有与实际参数有任何关系
引用传递:实际上是在方法里将实参的地址传递给形参,它们就共用一个地址(在没有改变长度的情况下,改变长度就会new一个堆空间),形参修改值就会将实参的值一起改变。

上一篇:杭电OJ2022


下一篇:Java到底是引用传递还是值传递?