String作為引用類型,為什么在主方法內調用子方法,子方法修改不了String的值

String作為引用類型,為什么在主方法內調用子方法,子方法修改不了String的值

有趣的小例子

public class StringTest {

   public static void main(String[] args) {
       String str = new String("0");
       System.out.println("+主方法調用子方法前 str = :" + str);
       resetString(str);
       //該處直接上,是不是應該輸出 change
       System.out.println("+主方法調用子方法后 str = :" + str);

    }

    private static void resetString(String str) {
       System.out.println("    -子方法中改變前 str = :" + str);
       str = "change";
       System.out.println("    -子方法中改變后 str = :" + str);
    }
}

真實的輸出結果

+主方法調用子方法前 str = :0
-子方法中改變前 str = :0
-子方法中改變后 str = :change
+主方法調用子方法后 str = :0

子方法沒有起到重置str的作用

因為 String 為 final 修飾的類,所以創(chuàng)建的對象不能改變;str引用變量重新賦值,其實是在堆中是重新創(chuàng)建了一個實例對象,子方法中str引用變量指向了新的實例對象;

public class StringTest {

   public static void main(String[] args) {
       //1 主方法棧幀 中創(chuàng)建 str 引用變量;堆中創(chuàng)建 Stirng 為 0 的對象
       String str = new String("0");
       System.out.println("+主方法調用子方法前 str = :" + str);
       //2 調用子方法
       resetString(str);
       //由 1 2 執(zhí)行步驟,可以看出 主方法棧幀中的 str引用對象指向的 0 對象沒有發(fā)生改變
       System.out.println("+主方法調用子方法后 str = :" + str);

    }

    //2.1 主方法棧幀中 壓人 子方法棧幀
    private static void resetString(String str) {
       System.out.println("    -子方法中改變前 str = :" + str);
       //2.2 堆中創(chuàng)建 change 對象;子方法棧幀中 str引用變量 執(zhí)行堆中新創(chuàng)建的 change對象
       str = "change";
       System.out.println("    -子方法中改變后 str = :" + str);
    }
}

圖示如下:

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容