Java值传递

首先要明确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只传递值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容