为什么方法没返回,也能改变上级方法的值

如以下代码,为什么两个change方法,都是返回的void,但map的值却变了,string的值没变,这是为何?

public class Test {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("a", "123");
        change(map);
        System.out.println(map);
        String a = "aaa";
        change(a);
        System.out.println(a);
    }

    private static void change(String a) {
        a = "bbb";
    }

    private static void change(Map map) {
        map.put("b", "456");
    }
}
输出:
{b=456, a=123}
aaa

Java参数:不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,传值一般相对于传地址而言)

若参数类型是基本数据类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值

若参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址,如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new了一个,那么副本就指向了新的地址,此时传入的参数还是指向原来的地址,所以不会改变原来的值。

一般而言,当你传递的是八大基本数据类型,在方法里面怎么变化都不会影响到外部的值
但是引用类型就不一样,因为你传递进去的是地址,你在方法内部修改,外部也会随机变化

如有帮助,望采纳

对象引用