首頁  >  文章  >  為什麼透過引用傳遞的 String 不會改變它的值?

為什麼透過引用傳遞的 String 不會改變它的值?

WBOY
WBOY轉載
2024-02-09 16:00:10799瀏覽

在PHP中,字串是不可變的。這意味著一旦字串被創建,它的值就不能被改變。當我們透過引用傳遞一個字串時,實際上是傳遞了字串的副本而不是原始字串本身。因此,對副本的任何修改都不會影響原始字串的值。這是PHP設計的一種保護機制,以確保字串的不可變性和資料的安全性。因此,無論我們如何嘗試透過引用來修改字串的值,實際上是在創建一個新的字串並將其賦值給引用變量,而原始字串的值保持不變。

問題內容

為什麼下面的程式碼只修改數組 t 中的值,並且不更改字串 s 的值?我預計 string 也會因其物件屬性而發生更改。

class A {
    private int i = 0;
    private String s = "";
    private int[] t = new int[1];

    void m() {
        B.m(i, s, t);
    }

    @Override
    public String toString() {
        return "i=" + i + ", s=" + s + ", t[0]=" + t[0];
    }
}

class B{
   public static void m(int i, String s, int[] t){
      i += 1;
      s += "1";
      t[0] += 1;
   }  
}

public class Zad {

   public static void main( String [ ] args ){
      A a = new A() ;
      System.out.println(a);
      a.m();
      System.out.println(a);
   } 
}

解決方法

這就是程式碼中發生的情況:在java 中,當您將基本類型(如int)傳遞給方法時,您傳遞的是值本身。方法內對參數所做的任何修改都不會影響方法外的原始值。這稱為“按值傳遞”。這你可能已經知道了。

在類別b 的定義中,ist 是方法m() 中的局部變數。這意味著,對這些變數所做的更改不會影響呼叫程式碼中的原始值。

當你在主方法中呼叫實例方法 a.m(); 時:

A a = new A();
System.out.println(a);  // Output: i=0, s=, t[0]=0
a.m();
System.out.println(a);  // Output: i=0, s=, t[0]=1

您將看到 t[0] 的值已更改,因為 java 中的陣列是對象,對其元素的修改會反映在方法外部。但是,is 的值保持不變,因為它們是原始類型或不可變物件(如string),並且在方法內對它們所做的任何更改都是本地的,不會影響原始值。

以上是為什麼透過引用傳遞的 String 不會改變它的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除