Perbezaan: 1. Pemindahan nilai akan mencipta salinan, manakala pemindahan rujukan tidak mencipta salinan 2. Dalam pemindahan nilai, objek asal tidak boleh diubah dalam fungsi, tetapi dalam pemindahan rujukan, objek asal boleh diubah dalam fungsi. Melepasi nilai bermakna salinan parameter sebenar dihantar ke fungsi apabila memanggil fungsi, supaya jika parameter diubah suai dalam fungsi, parameter sebenar tidak akan terjejas melalui rujukan bermakna parameter sebenar disalin apabila memanggil fungsi Alamat dihantar terus ke fungsi, jadi pengubahsuaian pada parameter dalam fungsi akan mempengaruhi parameter sebenar.
Persekitaran pengendalian tutorial ini: sistem Windows 7, versi Java 8, komputer DELL G3.
Kita semua tahu bahawa parameter boleh ditakrifkan semasa mentakrifkan kaedah dalam Java. Sebagai contoh, kaedah utama dalam Java, public static void main(String[ ] args), args di sini ialah parameter. Parameter dibahagikan kepada parameter formal dan parameter sebenar dalam bahasa pengaturcaraan.
Parameter formal : ialah parameter yang digunakan semasa mentakrifkan nama fungsi dan badan fungsi Tujuannya adalah untuk menerima parameter yang dihantar semasa memanggil fungsi.
Parameter sebenar: Apabila memanggil fungsi berparameter, terdapat perhubungan pemindahan data antara fungsi panggilan dan fungsi yang dipanggil. Apabila memanggil fungsi dalam fungsi panggilan, parameter dalam kurungan selepas nama fungsi dipanggil "parameter sebenar"
Contoh mudah:
public static void main( String[ ] args) { ParamTest pt = new ParamTest(); pt.sout( "Hollis");//实际参数为Hollis } public void sout( String name) {/!形式参数为name system.out.println(name); }
Parameter sebenar adakah kandungan sebenarnya diluluskan apabila memanggil kaedah berparameter, manakala parameter formal ialah parameter yang digunakan untuk menerima kandungan parameter sebenar.
Seperti yang dinyatakan di atas, apabila kita memanggil fungsi berparameter, parameter sebenar akan dihantar kepada parameter formal. Walau bagaimanapun, dalam bahasa pengaturcaraan, terdapat dua kes pemindahan dalam proses pemindahan ini, iaitu pemindahan mengikut nilai dan pemindahan melalui rujukan. Mari kita lihat bagaimana lulus mengikut nilai dan lulus melalui rujukan ditakrifkan dan dibezakan dalam bahasa pengaturcaraan.
Lulus nilai bermaksud menyalin parameter sebenar dan menghantarnya ke fungsi apabila memanggil fungsi, supaya jika parameter diubah dalam fungsi, parameter sebenar tidak akan terjejas.
Melalui rujukan merujuk kepada menghantar alamat parameter sebenar terus ke fungsi apabila memanggil fungsi Kemudian pengubahsuaian parameter dalam fungsi akan menjejaskan parameter sebenar.
Dengan konsep di atas, anda boleh menulis kod dan mempraktikkannya. Mari kita lihat sama ada ia lulus mengikut nilai atau lulus melalui rujukan dalam Java Jadi, sekeping kod yang paling mudah keluar:
public static void main( String[] args) { ParamTest pt = new ParamTest(); int i = 10; pt.pass(i); System.out.println( "print in main , i is " +i); } public void pass(int j){ j = 20; system.out.println( "print in pass , j is " + j); }
Dalam kod di atas, kami mengubah suai nilai parameter j dalam kaedah pas, dan kemudian mencetak nilai parameter dalam kaedah lulus dan kaedah utama masing-masing. Hasil keluaran adalah seperti berikut:
print in pass , j is 20 print in main , i is 10
Dapat dilihat bahawa pengubahsuaian nilai i di dalam kaedah pas tidak mengubah nilai parameter sebenar i. Jadi, mengikut definisi di atas, seseorang membuat kesimpulan: Lulus kaedah Java adalah lulus nilai.
Walau bagaimanapun, beberapa orang tidak lama kemudian menimbulkan soalan (haha, jadi jangan cepat membuat kesimpulan.). Kemudian, mereka akan mengalih keluar kod berikut:
public static void main(String[ ] args) { ParamTest pt = new ParamTest(); User hollis = new User(); hollis.setName( "Hollis"); hollis.setGender("Male"); pt.pass(hollis); system.out.println( "print in main , user is " + hollis);}public void pass(User user) { user.setName( "hollischuang"); System.out.println( "print in pass , user is " + user);}
Ia juga merupakan kaedah lulus dan nilai parameter juga diubah suai dalam kaedah pas. Hasil keluaran adalah seperti berikut:
print in pass , user is User{name='hollischuang', gender='Male '} print in main , user is User{name='hollischuang' , gender='Male '}
Selepas kaedah pas dilaksanakan, nilai parameter sebenar ditukar Mengikut definisi rujukan melalui di atas, nilai parameter sebenar diubah . Bukankah ini dipanggil rujukan? Oleh itu, berdasarkan dua keping kod di atas, seseorang membuat kesimpulan baru: dalam kaedah Java, apabila lulus jenis biasa, ia diluluskan oleh nilai, dan apabila lulus jenis objek, ia diluluskan melalui rujukan.
Walau bagaimanapun, kenyataan ini masih salah. Jika anda tidak percaya saya, lihat pemindahan parameter berikut di mana jenis parameter ialah objek:
public static void main( string[] args) { ParamTest pt = new ParamTest(); string name = "Hollis"; pt.pass(name ) ; System.out.println( "print in main , name is " + name); } public void pass(string name) { name = "hollischuang"; system.out.println( "print in pass , name is " + name); }
Hasil output kod di atas ialah
print in pass , name is hollischuangprint in main , name is Hollis
Apakah penjelasan untuk ini? Objek juga diluluskan, Tetapi nilai parameter asal tidak diubah suai. Mungkinkah objek yang diluluskan telah menjadi nilai semula?
Di atas, kami memetik tiga Hasilnya berbeza, itulah sebabnya ramai pemula dan juga pengaturcara lanjutan keliru tentang jenis pemindahan Java. Sebenarnya, apa yang saya ingin beritahu anda adalah bahawa konsep di atas tidak salah, tetapi terdapat masalah dengan contoh kod. Ayuh, izinkan saya menggariskan perkara utama konsep untuk anda, dan kemudian memberi anda beberapa contoh yang benar-benar sesuai.
Lulus nilai bermaksud menyalin parameter sebenar dan menghantarnya ke fungsi apabila memanggil fungsi, supaya jika parameter diubah dalam fungsi, parameter sebenar tidak akan terjejas.
Melalui rujukan bermakna apabila memanggil fungsi, alamat parameter sebenar dihantar terus ke fungsi Kemudian pengubahsuaian parameter dalam fungsi akan mempengaruhi parameter sebenar.
Jadi, izinkan saya meringkaskan untuk anda perkara utama perbezaan antara lulus nilai dan lulus rujukan.
| Pass by value | Pass by reference | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Perbezaan asas | Akan membuat salinan | Tidak mencipta salinan | |||||||||
Semua | Objek asal tidak boleh ditukar dalam fungsi | Objek asal boleh ditukar dalam fungsi< /td> |