学习过程中遇到一个特性,java数组在其他函数中赋值,可以直接改变数组的值,但是如果使用new String[]的方式就不行

public class code
{
    public static void main(String[] args) 
    {
        String[] name = new String[4];
        add(name);
        out(name);
    }
    public static void add(String[] a)
    {
        a[0] = "a";
        a[1] = "b";
        a[2] = "c";
        a[3] = "d";
    }
    public static void out(String[] a)
    {
        for (int i = 0; i < a.length; i++) 
        {
            System.out.println(a[i]);
        }
    }
}

结果是abcd

public class code
{
    public static void main(String[] args) 
    {
        String[] name = new String[4];
        add(name);
        out(name);
    }
    public static void add(String[] a)
    {
        a = new String[] {"a","b","c","d"};
    }
    public static void out(String[] a)
    {
        for (int i = 0; i < a.length; i++) 
        {
            System.out.println(a[i]);
        }
    }
}

结果是 4个null

调用函数时,参数如果是引用类型,传到函数内的是内存地址,如果使用对应下标的方式赋值,可以直接修改掉原堆内存的值,但是如果用new String[]方式定义数组,那么会开辟一块新的内存存储这个数组,变量存储的内存地址就会修改成新的数组的内存地址,打印的结果就是4个null