Artikel ini membawa anda pengetahuan yang berkaitan tentang java, yang terutamanya memperkenalkan isu yang berkaitan dengan penghantaran parameter rentetan dan tatasusunan java Mari kita lihat mengapa java hanya Melepasi nilai, harap ia membantu semua orang.
Kajian yang disyorkan: "Tutorial pembelajaran java"
Perkara pertama yang perlu dijelaskan ialah hanya terdapat nilai lulus dalam java ! Hanya nilai yang diluluskan! Asas teori berasal dari "think in java". Langkah seterusnya adalah untuk menerangkan secara terperinci mengapa java hanya melalui nilai.
Oleh kerana terdapat dua jenis data dalam Java: jenis asas dan jenis rujukan, ditambah dengan String jenis khas, ia boleh dijelaskan terutamanya dari tiga aspek.
Lihat kod dahulu
public class Demo01 { public void change(int a) { System.out.println("副本a 的初始值" + a); a = 20; System.out.println("副本a 的新值值" + a); } public static void main(String[] args) { int a = 10; Demo01 d = new Demo01(); d.change(a); System.out.println("change方法执行后的值" + a); } }
Analisis:
Dalam java, jenis data asas mengikuti pemindahan nilai, jadi objek d Apabila memanggil kaedah change(), hanya salinan data asal a dihantar ke parameter dalam kaedah Pada kali pertama, nilai asal dan salinan a ialah 10. Selepas dilaksanakan a=20, nilai salinan a menjadi 20.
Jadi keputusan larian ialah:
Untuk prinsipnya, sila rujuk rajah di bawah
Lihat kod dahulu
public class Demo02 { char[] ch = {'a', 'b', 'c'}; public void change(char ch[]) { System.out.println("方法中ch[0]的初始值:" + ch[0]); ch[0] = 'g'; System.out.println("方法中ch[0]执行后的新值:" + ch[0]); } public static void main(String[] args) { Demo02 d = new Demo02(); System.out.println("对象d中数组的初始值是:"+d.ch); d.change(d.ch); System.out.println("对象d中数组的最终值是:"+d.ch); } }
Analisis:
Apabila jenis rujukan diluluskan sebagai parameter, ia juga merupakan nilai pemindahan Pada masa ini, salinan nilai alamat dihantar, tetapi Kedua-dua alamat menghala ke tempat yang sama. Apabila alamat salinan tidak ditukar, operasi pada data yang ditunjukkan oleh alamat salinan akan menjejaskan nilai data asal. Tatasusunan ch[] dalam kaedah dan tatasusunan ch[] asal menghala ke data yang sama, jadi pada peringkat awal ch[0] menunjuk kepada 'a' kemudian nilai baharu diberikan kepada ch[0] dalam salinan menjadi 'g'.
Jadi hasil larian ialah:
Untuk prinsipnya, sila rujuk rajah di bawah
Lihat kod dahulu
public class Demo03 { public void change(String str2) { System.out.println("方法中str2初始值" + str2); System.out.println("方法中str2初始hashcode值" + str2.hashCode()); str2 = "bbb"; System.out.println("方法中str2赋值后:" + str2); System.out.println("方法中str2赋值后hashcode值:" + str2.hashCode()); } public static void main(String[] args) { String str1 = new String("aaa"); System.out.println("原始字符串str1的hashcode值:" + str1.hashCode()); Demo03 d = new Demo03(); d.change(str1); System.out.println("方法调用后str1的值" + str1); } }
Analisis:
Rentetan ialah jenis data khas Lapisan bawahnya ialah tatasusunan char[] terakhir, yang tidak boleh diubah , jadi apabila rentetan diluluskan sebagai parameter, ia boleh dikendalikan sebagai tatasusunan khas Begitu juga, ia juga menyalin salinan rujukan objek asal pada salinan itu objek dan rujukan objek asal kedua-duanya menunjuk kepada aksara asal Kedudukan rentetan, iaitu, alamat yang ditunjuk oleh str2 apabila ia mula-mula dimulakan adalah konsisten dengan kedudukan yang ditunjukkan oleh objek asal str1, iaitu, nilai kod cincang awal str2 adalah sama dengan nilai kod cincang objek asal str1 Selepas operasi str2 = "bbb", Disebabkan oleh kebolehubahan rentetan, str2 akan menunjuk ke rujukan objek baharu pada masa ini, iaitu. , str2 akan menunjuk ke lokasi "bbb" pada masa ini. Nilai kod cincang str2 akan berubah, tetapi rujukan objek asal str1 tidak berubah, dan "aaa" tidak berubah, jadi str1 masih menunjuk kepada "aaa". Keputusan yang dijalankan adalah seperti berikut:
Mari kita lihat contoh rentetan yang lebih spesifik:
public class Demo04 { public static void main(String[] args) { StringBuffer s = new StringBuffer("hello"); StringBuffer s2 = new StringBuffer("hi"); test(s, s2); System.out.println("方法調用后s的值:" + s); System.out.println("方法調用后s2的值:" + s2); } static void test(StringBuffer s3, StringBuffer s4) { System.out.println("方法初始化時s3的值" + s3); System.out.println("方法初始化時s4的值" + s4); s4 = s3; s3 = new StringBuffer("new"); System.out.println("第一步变化后s3的值" + s3); System.out.println("第一步变化后s4的值" + s4); s3.append("boy"); s4.append("gril"); System.out.println("第二步变化后s3的值" + s3); System.out.println("第二步变化后s4的值" + s4); } }
Kali ini mari kita lihat hasilnya pertama:
Kemudian analisis:
Sebelum kaedah dilaksanakan, lokasi yang ditunjukkan oleh rentetan s1 dan s2 masing-masing ialah "hello" dan "hai". tanpa keraguan,
(1) Kemudian masukkan kaedah Parameter s3 dan s4 dalam kaedah dimulakan sama seperti contoh di atas Pada masa ini, ia menunjukkan kedudukan yang sama seperti yang diberikan oleh s1s2 salinan rujukan objek kepada s3s4 Pada masa ini, s3s4 Nilai-nilainya ialah "hello" dan "hi"
(2) Kemudian laksanakan s4=s3 s3 hingga s4. Pada masa ini, s4 ialah "hello"; s3=new StringBuffer ( "baru"); ", jadi pada masa ini s3 = "baru", s4 = "hello"
(3) Kemudian s3.append("boy");s4.append("gril"); Sila ambil perhatian bahawa lampiran kaedah dalam StringBuffer tidak menunjuk kepada rujukan objek baharu untuk s3s4 Operasi berdasarkan asal, jadi selepas operasi, s3 = "newboy", s4 = "hellogril"
(4) Pada ketika ini, panggilan kaedah telah selesai Mari kita kembali dan semak kesan s3s4 pada s1s2 dalam proses.
——- A. Mula-mula, s3 mula menunjuk kepada "hello" seperti s1, dan kemudian mencipta rujukan objek baharu "baru" untuk s3 Pada masa ini, s3 dan s1 tidak lagi mempunyai hubungan setengah sen. dan s3 melakukan append ( boy), s3 = "newboy";
——– B. s4 dan s2 kedua-duanya menunjuk kepada "hai" pada permulaan, dan kemudian s3 memberikan nilai awalnya (iaitu, salinan s1 ) ke s4, pada masa itu s4 menunjuk kepada "hello" (ini akan mewujudkan hubungan antara s4 dan s1), s4 melakukan operasi tambah (grill), kerana ia dan s1 menghala ke lokasi yang sama, jadi objek yang mereka tunjuk secara bersama kepada akan berubah, s4=s1="hellogrill".
——- C. Kemudian menjadi jelas bahawa objek "hi" yang ditunjuk oleh s2 tidak berubah, dan "hello" yang ditunjuk oleh s1 telah menjadi "hellogril" di bawah operasi append ("grill").
Apabila menggunakan jenis data asas sebagai parameter formal kaedah, pengubahsuaian kepada parameter formal dalam badan kaedah tidak akan menjejaskan nilai parameter sebenar
Apabila menggunakan jenis data rujukan sebagai parameter formal kaedah, jika kandungan data yang ditunjukkan oleh parameter formal diubah suai dalam badan kaedah, ia akan menjejaskan nilai pembolehubah parameter sebenar, kerana parameter formal Pembolehubah dan pembolehubah parameter sebenar berkongsi kawasan timbunan yang sama
Apabila menggunakan jenis data rujukan sebagai parameter formal kaedah, jika; penunjuk pembolehubah parameter formal diubah dalam badan kaedah, maka Ia tidak akan menjejaskan nilai pembolehubah parameter sebenar, jadi pembolehubah parameter formal dan pembolehubah parameter sebenar masing-masing menunjukkan kawasan timbunan yang berbeza; penerangan yang jelas.
Mengenai parameter rentetan, ia juga bergantung pada sama ada penunjuk pembolehubah parameternya telah berubah, kerana lapisan bawah Rentetan ialah jenis akhir char[], apabila anda menggunakan String s = " aaa" atau String s = new String("aaa"), rujukan objek baharu akan dibuat untuk s. Walau bagaimanapun, apabila kaedah append() dipanggil, ia tidak akan menunjuk ke objek baharu, tetapi akan menukar objek runcing asal dan rujukan objek yang dikongsi dengannya juga akan berubah.
Perkara terakhir yang diulang ialah tiada pemindahan rujukan dalam Java, hanya pemindahan nilai Jenis rujukan ialah pemindahan nilai khas (salinan alamatnya diberikan kepada parameter. tetapi ia berbeza daripada jenis data asas, jika objek yang ditunjukkan oleh alamat berubah, objek asal juga akan berubah kerana sebab perkongsian).
Kajian yang disyorkan: "tutorial java"
Atas ialah kandungan terperinci Mari kita bincangkan tentang penghantaran parameter rentetan dan tatasusunan dalam JAVA. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!