Java只有值传递!!

看如下一个程序:

    public static void main(String[] args) {
       Map map = new HashMap(16);
        map.put("aaa","sss");
        nullTest(map);
        System.out.println(map);

    }
     static void nullTest(Map map){
        map = null;
    }

猜猜结果是否为null?
答案是否定的。

Java只有值传递!!_第1张图片
原因分析:
main 方法中的map引用持有一个地址引用,指向堆对象,姑且起名堆地址为地址m,里面有一个映射aaa->sss。
传入nullTest里面,也是这个地址,但是nulltest是一个方法,该方法的在创建的时候会创建一个栈,然后里面的map局部变量起初持有m地址,但是nulltest里面的map=null,只会发生如下改变:
map->m
map->null。
而main方法里面的map仍然指向m。
但是,在nulltest里面,对map进行put或者remove等,都是可以的,
因为这个是对这个引用地址里面的对象操作,因为这个nulltest里面的局部变量拿到了地址为m的map的地址。如下:

    static  void modifyTest(Map map){
        map.put("unique","unique");
    }

Java只有值传递!!_第2张图片
所以,还是值传递(除非是c++或者c语言,用&符号那么可以改变,是引用传递)

结论

java里面只有值传递,传地址的也是值传递,因为传的只是地址而已。

你可能感兴趣的:(Java)