Java值传递

2019-01-30  本文已影响0人  HUJC超

首先要明确Java都是按照值传递的。

    public static void main(String[] args) {
        String x = new String("aaa");
        change1(x);
        System.out.println(x);
        System.out.println("--------------------------");
        
    }
    private static void change1(String x) {
        x ="bbb";
    }

输出的结果是:aaa
原因:当将x传递给change()方法时,将传递x值的复制品(引用)。
这时候change()方法里的x只是原来String x = new String("aaa");中x的副本。然后x="bbb",相当于x副本重新引用了一个"bbb",这与原来的x无关。


image.png

String和其他对象的不同:

public static void main(String[] args) {    
        StringBuilder str = new StringBuilder("aaa"); 
        change2(str);
        System.out.println(str);
        System.out.println("--------------------------");
        
        StringBuilder str2 = new StringBuilder("aaa");
        change2_1(str2);
        System.out.println(str2);
        System.out.println("--------------------------");
        
        List<String>  ls = new ArrayList<>();
        ls.add("aaa");
        change3(ls);
        System.out.println(ls);
    }
    private static void change2(StringBuilder str) {
        str = new StringBuilder("ccc");
    }
    
    private static void change2_1(StringBuilder str2) {
        str2.append("bbb");
    }
    
    private static void change3(List<String> ls) {
        ls.add("ccc");
    }   

输出结果:


result.png

结论:Java在值传递的时候都会copy一个副本,关键是副本变量存储引用,而不是引用本身!!!如果我们真的需要改变对象的值。首先,对象应该是可变的,例如StringBuilder,List,各种自定义的entity等。。。其次,我们需要确保没有创建新对象并将其分配给参数变量,因为Java只传递值。

上一篇 下一篇

猜你喜欢

热点阅读