String的不可變

String是被final修飾的類,所有看起來會修改String值的方法都是創建了一個新的String對象。
所以這裏要注意的是,String類型實例的傳遞永遠是值傳遞,而不是引用傳遞如下代碼

public class TestDemo{
     String string = "99";
     char[] c = {'a','b','f'};
     Nimaha nimaha = new Nimaha() ;
    public static void main(String[] args) {
        TestDemo testDemo = new TestDemo();

        testDemo.change(testDemo.string,testDemo.c,testDemo.nimaha);
        System.out.println(testDemo.string+" "+testDemo.c[0]+" "+testDemo.nimaha.a);

    }
    public void change(String string,char[] c,Nimaha nimaha){
        string = "ddd";
        c[0] = 'd';
        nimaha.a =2;
    }
    class Nimaha{
         int a =1;
    }
}
最終輸出的結果應該是"99 d 2"因爲傳入change的String是傳入了test.str的一個副本,char[] 和nimaha是真的傳入了實例對象。
如果想要讓str改變,應該在change中使用this關鍵字,具體情況如下
public void change(String string,char[] c,Nimaha nimaha){
    this.string = "ddd";
    c[0] = 'd';
    nimaha.a =2;
}

最後記錄下:
堆區:只存放類對象,線程共享;
方法區:又叫靜態存儲區,存放class文件和靜態數據,線程共享;
棧區:存放方法局部變量,基本類型變量區、執行環境上下文、操作指令區,線程不共享;
寫在最後,個人猜測所有放在常量池裏面的數據,到最後都是數值引用。而對象,比如對象數組,比如自己定義的class都算作對象引用,都是可以直接引用對象改變數值的,是不是存在棧上面的數據就是數值引用?如果有大神看到了可以說一下。

發佈了43 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章