一個關於String字符串的疑惑

代碼以下:app

 public static void changeStr(String str,String append)spa

{對象

    str=str+append;生命週期

}內存

public static void main(String[] args)字符串

{it

    String str="Allen";class

    changeStr(str,",hi");變量

     System.out.println(str);  object

}

**********運行結果**********

Allen

    對於此結果,也許會有部分朋友會感到驚訝?如String不是一個object嘛,那麼做爲一個方法的參數時傳進去的也應該是引用纔對啊?

    對此,咱們須要注意的是,String是不可變的,任何試圖改變String的值作法的最終結果將是建立一個新的String對象,返回的也是這個新的String對象的引用(亦即地址)。在上面代碼中,調用changeStr方法時,咱們傳進去的確實是str的引用,但同時咱們必須知道,這個引用就是常量字符串在"Allen"在內存中的地址的一個copy,而str也是通樣的地址,當咱們在方法體中對字符串鏈接操做(即改變了字符串的值)時,建立了一個全新的String對象,而後經過"="把這個新的String對象的地址賦予了方法中的str(注意此str非main中的str),方法中的str就是一個局部變量,它的改變對於方法外的str(即main中的str)毫無影響,順便說一句,方法中str在方法結束時其生命週期也就結束了。那麼,既然main中的str所指向的地址未變,那麼最後輸出"Allen"也就不足爲奇了。

注:文中可能部分詞語失當,望各位多多指正。

相關文章
相關標籤/搜索