引用傳遞與值傳遞

值傳遞:傳值,把原來的數據直接拷貝一份傳給新的變量
引用傳遞:傳地址,使原來的引用變量指向新的地址中的內容app

奇怪的事情函數

String str = "aaa";
    change(str);
    System.out.println(str);
public void change(String str){
        str += "aaa";
    }

輸出結果依然是aaa , 而不是aaaaaaui

出現這種狀況是,在主函數中的str與調用函數中定義的str是兩個不一樣的引用,而且他們確實是指向了同一個地址,可是由於String是不可變的,因此在執行語句str+="aaa"的時候實際是建立了一個新的對象,使的調用函數中的引用指向了新的對象,因此主函數中的str不會有任何的影響。
若是調用函數中的變量類型不是String,而是可變的StringBuilder類型,那麼實際狀況分爲兩種,若是是str.append("aaa");那麼主函數中的str是會改變的,若是是str = new StringBuilder("ccc");那麼主函數中的值依然不會受到影響。
主要的緣由是在與賦值操做「=」。若是是複製操做,則標識把調用函數中的str指向一個新的內存空間,那麼與原來的引用失去關聯,原來的很明顯不會受到印象,若是是append操做,只是在原來的內存地址上改變內存中的內容,可是此時無論是主函數中的str仍是調用函數中的str,指向的都是被改變後的內存,很天然的值會受到影響。
**********************************************************************************************************
實際的參數傳遞中會遇到4中狀況:code

  • 基本類型對象

    毫無疑問的傳值操做,調用函數與主函數中的變量不存在任何的聯繫內存

    int a =10;
        change(a);
        System.out.println(a);
        public void change(int a){
            
           a++;
        }

    輸出結果爲10get

  • 不提供改變自身方法的引用類型io

    是傳遞的是引用,可是沒法對共同指向的對象進行改變操做,只能建立一個新的對象,調用函數中的引用指向他,不影響主函數中的值class

    String a = "aaa";
     change(a);
     System.out.println(a);
     public void change(String a){
          a += "aaa";
     }

    輸出的結果是aaa變量

  • 提供改變自身方法的引用類型,而且使用該方法

    StringBuilder a = new StringBuilder("aaa");
    change(a);
    System.out.println(a);
    public void change(StringBuilder a){
         a.appned("aaa");    
    }

    輸出結果爲aaaaaa

  • 提供改變自身方法的引用類型,可是不使用該方法,而是使用賦值操做

    StringBuilder a = new StringBuilder("aaa");
    change(a);
    System.out.println(a);
    public void  change(StringBuilder a){
        a = new StringBuilder("bbb");
    }

    輸出結果爲aaa

參考材料:[知乎:引用傳遞仍是值傳遞][知乎]
[知乎]: https://www.zhihu.com/question/31203609 "引用傳遞與值傳遞"

相關文章
相關標籤/搜索