string是被final修飾的類,所有看起來會修改string值的方法都是建立了乙個新的string物件。
所以這裡要注意的是,string型別例項的傳遞永遠是值傳遞,而不是引用傳遞如下**
public
class testdemo;
nimaha nimaha = new nimaha() ;
public
static
void
main(string args)
public
void
change(string string,char c,nimaha nimaha)
class nimaha
}
最終輸出的結果應該是"99 d 2"因為傳入change的string是傳入了test.str的乙個副本,char 和nimaha是真的傳入了例項物件。
如果想要讓str改變,應該在change中使用this關鍵字,具體情況如下
public void change(string string,char c,nimaha nimaha)
最後記錄下:
堆區:只存放類物件,執行緒共享;
方法區:又叫靜態儲存區,存放class檔案和靜態資料,執行緒共享;
棧區:存放方法區域性變數,基本型別變數區、執行環境上下文、操作指令區,執行緒不共享;
寫在最後,個人猜測所有放在常量池裡面的資料,到最後都是數值引用。而物件,比如物件陣列,比如自己定義的class都算作物件引用,都是可以直接引用物件改變量值的,是不是存在棧上面的資料就是數值引用?如果有大神看到了可以說一下。
String物件不可變
string s hello s s world 這兩行 執行後,原始的string物件中的內容是否改變?不會改變。因為string類為final型別,它的所有物件都是不可變物件。在這段 中,s原先指向乙個string物件,內容是 hello 它在字串常量池中。然後我們對s進行了 操作,這時s不再指...
為什麼說String是不可變的
簡單的例子 string s1 abc string s1 s1 s1 def 此時s1變化了嗎?變了!s1的位址從指向 abc 變成指向 def 重要的不在這裡,記憶體上的 abc 本身並沒有被改變!指向 abc 的s2也沒有被改變 兩個final 乙個在string的類修飾符,乙個是string...
String 為什麼要設計成不可變的
string不可變 string值儲存在常量池中。乙個已有字串 abcd 如果改變值成 abcedl 不是在原記憶體位址上修改資料,而是在常量池中查詢或生成這個新值,再把引用指向新值的位址,如圖 string 類本身是final的,不可以被繼承 string類內部通過private final ch...