ホームページ  >  記事  >  参照によって渡された文字列の値が変更されないのはなぜですか?

参照によって渡された文字列の値が変更されないのはなぜですか?

WBOY
WBOY転載
2024-02-09 16:00:10834ブラウズ

PHP では、文字列は不変です。これは、文字列が作成されると、その値を変更できないことを意味します。文字列を参照渡しするとき、実際には元の文字列そのものではなく、文字列のコピーを渡します。したがって、コピーを変更しても、元の文字列の値には影響しません。これは、文字列の不変性とデータのセキュリティを確保するために PHP によって設計された保護メカニズムです。したがって、文字列の値を参照によって変更しようとしても、実際には新しい文字列を作成して参照変数に割り当てていることになりますが、元の文字列の値は変更されません。

質問内容

次のコードは配列 t の値のみを変更し、文字列 s の値を変更しないのはなぜですか?オブジェクトのプロパティによって文字列も変化するだろうと予想していました。

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 の定義では、is、および t がメソッド m()## にあります。 # ローカル変数。これは、これらの変数を変更しても、呼び出し元のコードの元の値に影響を与えないことを意味します。

メインメソッドでインスタンスメソッド

a.m(); を呼び出す場合: リーリー

Java の配列はオブジェクトであり、要素への変更はメソッドの外部に反映されるため、

t[0] の値が変更されていることがわかります。ただし、is の値は、プリミティブ型または不変オブジェクト (string など) であるため変更されず、メソッド内で変更されます。行われた変更はローカルであり、元の値には影響しません。

以上が参照によって渡された文字列の値が変更されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。