1. Pengenalan
Dua cara yang paling lazim untuk menyampaikan argumen ke kaedah adalah "pass-by-value" dan "pass-by-referensi". Bahasa pengaturcaraan yang berbeza menggunakan konsep ini dengan cara yang berbeza. Sejauh Java, semuanya adalah Pass-by-Value .
Dalam tutorial ini, kita akan menggambarkan bagaimana Java menyampaikan argumen untuk pelbagai jenis.
2. Nilai Laluan vs Rujukan Lintas-oleh
Mari kita mulakan dengan beberapa mekanisme yang berbeza untuk meneruskan parameter ke fungsi:
- nilai
- rujukan
- hasil
- nilai-hasil
- nama
Dua mekanisme yang paling umum dalam bahasa pengaturcaraan moden adalah "Pass-by-Value" dan "Pass-by-Reference". Sebelum meneruskan, mari kita bincangkan perkara ini terlebih dahulu:
2.1. Nilai Laluan
Apabila parameter dilalui oleh nilai, kaedah pemanggil dan pemanggil beroperasi pada dua pemboleh ubah yang berbeza yang merupakan salinan antara satu sama lain. Sebarang perubahan pada satu pemboleh ubah tidak mengubah yang lain.
Ini bermaksud bahawa semasa memanggil kaedah, parameter yang diteruskan ke kaedah callee akan menjadi klon parameter asal. Sebarang pengubahsuaian yang dilakukan dalam kaedah callee tidak akan mempengaruhi parameter asal dalam kaedah pemanggil.
2.2. Lulus-oleh-Rujukan
Apabila parameter adalah rujukan lulus, pemanggil dan pemanggil beroperasi pada objek yang sama.
Ini bermaksud bahawa apabila pemboleh ubah dilewati-rujukan, pengenal unik objek dihantar ke kaedah. Segala perubahan pada anggota contoh parameter akan mengakibatkan perubahan tersebut dibuat pada nilai asalnya.
3. Parameter Lulus di Jawa
Konsep asas dalam mana-mana bahasa pengaturcaraan adalah "nilai" dan "rujukan". Di Jawa, pemboleh ubah primitif menyimpan nilai sebenarnya, sedangkan Non-Primitives menyimpan pemboleh ubah rujukan yang menunjuk ke alamat objek yang mereka rujuk. Kedua-dua nilai dan rujukan disimpan dalam memori timbunan.
Hujah di Jawa selalu dilalui oleh nilai. Semasa pemanggilan kaedah, salinan setiap argumen, sama ada nilai atau rujukannya, dibuat dalam memori timbunan yang kemudian diteruskan ke kaedah tersebut.
Sekiranya primitif, nilainya hanya disalin di dalam memori timbunan yang kemudian diteruskan ke kaedah callee; sekiranya bukan primitif, rujukan dalam memori timbunan menunjukkan data sebenar yang terdapat di timbunan. Ketika kita melewati objek, rujukan dalam memori tumpukan disalin dan rujukan baru diteruskan ke metode.
Mari kita lihat ini dalam tindakan dengan bantuan beberapa contoh kod.
3.1. Lulus Jenis Primitif
Bahasa Pengaturcaraan Java mempunyai lapan jenis data primitif. Pemboleh ubah primitif secara langsung disimpan dalam memori timbunan. Setiap kali pemboleh ubah jenis data primitif dilewatkan sebagai argumen, parameter sebenarnya disalin ke argumen formal dan argumen formal ini mengumpulkan ruang mereka sendiri dalam memori timbunan.
Jangka hayat parameter formal ini hanya bertahan selagi kaedah itu dijalankan, dan setelah kembali, argumen formal ini dibersihkan dari timbunan dan dibuang.
Mari cuba memahaminya dengan bantuan contoh kod:
public class PrimitivesUnitTest { @Test public void whenModifyingPrimitives_thenOriginalValuesNotModified() { int x = 1; int y = 2; // Before Modification assertEquals(x, 1); assertEquals(y, 2); modify(x, y); // After Modification assertEquals(x, 1); assertEquals(y, 2); } public static void modify(int x1, int y1) { x1 = 5; y1 = 10; } }
Mari cuba memahami penegasan dalam program di atas dengan menganalisis bagaimana nilai-nilai ini disimpan dalam memori:
- Pemboleh ubah " x" dan " y" dalam kaedah utama adalah jenis primitif dan nilainya langsung disimpan dalam memori timbunan
- Apabila kita memanggil kaedah mengubah () , salinan tepat untuk setiap pemboleh ubah ini dibuat dan disimpan di lokasi yang berbeza di memori timbunan
- Sebarang pengubahsuaian pada salinan ini hanya mempengaruhi mereka dan membiarkan pemboleh ubah asal tidak berubah

3.2. Melulus Rujukan Objek
Di Jawa, semua objek disimpan secara dinamis di ruang Heap di bawah tudung. Objek-objek ini dirujuk dari rujukan yang disebut pemboleh ubah rujukan.
Objek Java, berbeza dengan Primitives, disimpan dalam dua tahap. Pemboleh ubah rujukan disimpan dalam memori timbunan dan objek yang mereka rujuk, disimpan dalam memori Tumpukan.
Setiap kali objek dilewatkan sebagai argumen, salinan tepat dari pemboleh ubah rujukan dibuat yang menunjukkan lokasi objek yang sama dalam memori timbunan dengan pemboleh ubah rujukan asal.
Akibatnya, setiap kali kita membuat perubahan pada objek yang sama dalam metode tersebut, perubahan itu tercermin pada objek asalnya. Namun, jika kita mengalokasikan objek baru ke variabel rujukan yang dilalui, maka itu tidak akan tercermin dalam objek asalnya.
Mari cuba memahaminya dengan bantuan contoh kod:
public class NonPrimitivesUnitTest { @Test public void whenModifyingObjects_thenOriginalObjectChanged() { Foo a = new Foo(1); Foo b = new Foo(1); // Before Modification assertEquals(a.num, 1); assertEquals(b.num, 1); modify(a, b); // After Modification assertEquals(a.num, 2); assertEquals(b.num, 1); } public static void modify(Foo a1, Foo b1) { a1.num++; b1 = new Foo(1); b1.num++; } } class Foo { public int num; public Foo(int num) { this.num = num; } }
Mari kita analisis penegasan dalam program di atas. Kami telah melewati objek a dan b dalam kaedah modify () yang mempunyai nilai yang sama 1 . Pada mulanya, rujukan objek ini menunjuk ke dua lokasi objek yang berbeza di ruang timbunan:
Apabila rujukan ini a dan b diteruskan dalam kaedah modify () , ia membuat salinan cermin rujukan a1 dan b1 yang menunjuk ke objek lama yang sama:

Dalam kaedah modify () , ketika kita mengubah rujukan a1 , ia mengubah objek asal. Namun, untuk rujukan b1, kami telah menetapkan objek baru. Jadi sekarang menunjuk ke objek baru dalam memori timbunan.
Sebarang perubahan yang dibuat pada b1 tidak akan menggambarkan apa-apa dalam objek asal:

4. Kesimpulan
Dalam artikel ini, kami melihat bagaimana parameter melewati ditangani dalam hal Primitives dan Non-Primitives.
Kami mengetahui bahawa parameter yang dilalui di Java selalu Pass-by-Value. Walau bagaimanapun, konteksnya berubah bergantung pada sama ada kita berurusan dengan Objektif atau Objektif:
- Untuk jenis Primitif, parameter adalah nilai lulus
- Untuk jenis Objek, rujukan objek adalah nilai lulus
Coretan kod yang digunakan dalam artikel ini terdapat di GitHub.