Rumah >Java >Mengapakah String yang diluluskan melalui rujukan tidak mengubah nilainya?

Mengapakah String yang diluluskan melalui rujukan tidak mengubah nilainya?

WBOY
WBOYke hadapan
2024-02-09 16:00:10854semak imbas

Dalam PHP, rentetan tidak boleh diubah. Ini bermakna apabila rentetan dibuat, nilainya tidak boleh diubah. Apabila kita menghantar rentetan melalui rujukan, kita sebenarnya menghantar salinan rentetan dan bukannya rentetan asal itu sendiri. Oleh itu, sebarang pengubahsuaian pada salinan tidak akan menjejaskan nilai rentetan asal. Ini ialah mekanisme perlindungan yang direka oleh PHP untuk memastikan kebolehubahan rentetan dan keselamatan data. Jadi tidak kira bagaimana kita cuba mengubah suai nilai rentetan dengan rujukan, kita sebenarnya mencipta rentetan baharu dan memberikannya kepada pembolehubah rujukan, manakala nilai rentetan asal kekal tidak berubah.

Kandungan soalan

Mengapa kod berikut hanya mengubah suai nilai tatasusunan t 中的值,并且不更改字符串 s? Saya menjangkakan bahawa rentetan itu juga akan berubah kerana sifat objeknya.

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);
   } 
}

Penyelesaian

Inilah yang berlaku dalam kod anda: Dalam java, apabila anda menghantar jenis primitif (seperti int) kepada kaedah, anda menghantar nilai itu sendiri. Sebarang pengubahsuaian yang dibuat pada parameter dalam kaedah tidak akan menjejaskan nilai asal di luar kaedah. Ini dipanggil "melalui nilai". Anda mungkin sudah tahu ini.

Pembolehubah setempat dalam kelas b 的定义中,ist 是方法 m(). Ini bermakna bahawa perubahan kepada pembolehubah ini tidak menjejaskan nilai asal dalam kod panggilan.

Apabila anda memanggil kaedah contoh a.m(); dalam kaedah utama:

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

Anda akan melihat t[0] 的值已更改,因为 java 中的数组是对象,对其元素的修改会反映在方法外部。但是,is 的值保持不变,因为它们是原始类型或不可变对象(如 string) dan sebarang perubahan yang dibuat kepada mereka dalam kaedah adalah setempat dan tidak akan menjejaskan nilai asal.

Atas ialah kandungan terperinci Mengapakah String yang diluluskan melalui rujukan tidak mengubah nilainya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam