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";
    }

輸出的結(jié)果是:aaa
原因:當將x傳遞給change()方法時,將傳遞x值的復(fù)制品(引用)。
這時候change()方法里的x只是原來String x = new String("aaa");中x的副本。然后x="bbb",相當于x副本重新引用了一個"bbb",這與原來的x無關(guān)。


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");
    }   

輸出結(jié)果:


result.png

結(jié)論:Java在值傳遞的時候都會copy一個副本,關(guān)鍵是副本變量存儲引用,而不是引用本身!?。∪绻覀冋娴男枰淖儗ο蟮闹?。首先,對象應(yīng)該是可變的,例如StringBuilder,List,各種自定義的entity等。。。其次,我們需要確保沒有創(chuàng)建新對象并將其分配給參數(shù)變量,因為Java只傳遞值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容