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

Mengapakah String yang diluluskan melalui rujukan tidak mengubah nilainya?

WBOY
Lepaskan: 2024-02-09 16:00:10
ke hadapan
858 orang telah melayarinya

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);
   } 
}
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan