Metode Call By adalah istilah ilmu komputer standar. Panggilan metode dibagi menjadi panggilan nilai (panggilan dengan referensi) dan panggilan referensi (panggilan demi nilai) sesuai dengan situasi parameter yang lewat. Ada banyak definisi dari dua jenis panggilan di dunia ini. Pepatah yang paling umum adalah bahwa nilainya adalah panggilan nilai, dan alamatnya adalah panggilan referensi. Ini sebenarnya sangat tidak pantas. Pernyataan ini dapat dengan mudah mengingatkan kita bahwa lewat parameter objek Java adalah panggilan referensi. Bahkan, lewat parameter objek Java masih merupakan panggilan nilai.
Pertama -tama mari kita gunakan sepotong kode untuk mengonfirmasi mengapa lewat parameter objek Java adalah panggilan nilai.
Karyawan kelas publik {name public string = null; Pegawai publik (String n) {this.name = n; } // Swap Dua Objek Karyawan Statis Void Swap (Karyawan E1, Karyawan E2) {karyawan temp = e1; E1 = E2; e2 = temp; System.out.println (e1.name+""+e2.name); // Hasil Cetak: Li Si Zhang San} // Fungsi Utama Statis Public Static Main (String [] args) {Pekerja Karyawan = Karyawan Baru ("Zhang San"); Manajer Karyawan = Karyawan Baru ("Li Si"); swap (pekerja, manajer); System.out.println (worker.name+""+manager.name); // Hasil pencetakan masih: Zhang San Li Si}}Hasil di atas sangat mengecewakan. Meskipun isi objek parameter formal E1 dan E2 dipertukarkan, pekerja parameter aktual dan manajer tidak bertukar konten. Alasan terpenting di sini adalah bahwa parameter formal E1 dan E2 adalah salinan alamat dari parameter aktual pekerja dan manajer.
Seperti yang kita semua tahu, di Java, nama variabel objek sebenarnya mewakili alamat objek dalam heap (istilah profesional disebut referensi objek). Ketika metode Java dipanggil, parameter memberikan referensi ke objek. Yang penting, alamat memori yang ditempati oleh parameter formal dan parameter aktual tidak sama. Isi dalam parameter formal hanyalah salinan referensi objek yang disimpan dalam parameter aktual.
Jika Anda memiliki pemahaman tentang area variabel lokal dari tumpukan Java di JVM Memory Management (lihat "Arsitektur Mesin Virtual Java"), Anda akan memahami kalimat di atas dengan sangat baik. Ketika JVM menjalankan program di atas, menjalankan metode utama dan metode swap akan mendorong dua ruang memori yang disebut bingkai stack di tumpukan java. Ada sepotong memori yang disebut area variabel lokal di bingkai tumpukan utama untuk menyimpan referensi ke pekerja dan manajer objek parameter aktual. Area variabel lokal di swap stack frame menyimpan referensi ke objek parameter formal E1 dan E2. Meskipun nilai referensi E1 dan E2 sama dengan nilai pekerja dan manajer, mereka menempati ruang memori yang berbeda. Ketika referensi antara E1 dan E2 dipertukarkan, gambar di bawah ini jelas menunjukkan bahwa itu tidak akan mempengaruhi nilai referensi pekerja dan manajer sama sekali.
Parameter Objek Java masih merupakan panggilan nilai meskipun alamat (referensi) dilewati. Saatnya memberikan panggilan referensi dan nilai panggilan yang akurat.
Panggilan demi nilai: Selama proses passing parameter, parameter formal dan parameter aktual menempati dua ruang memori yang sama sekali berbeda. Konten yang disimpan oleh parameter formal adalah salinan konten yang disimpan oleh parameter aktual. Faktanya, lewat objek Java memenuhi definisi ini, kecuali bahwa konten yang disimpan oleh parameter formal dan parameter aktual bukanlah nilai variabel dalam pengertian konvensional, tetapi alamat variabel. Nah, pikirkan kembali: bukankah alamat variabel juga nilai?
Panggilan dengan referensi: Selama proses lewat parameter, parameter formal dan parameter aktual sepenuhnya ruang memori yang sama, dan keduanya tidak dibedakan satu sama lain. Bahkan, nama parameter formal dan nama parameter aktual hanyalah simbol yang berbeda dalam pemrograman. Selama operasi program, ruang yang disimpan dalam memori adalah hal yang paling penting. Nama variabel yang berbeda tidak menunjukkan ruang penyimpanan memori yang ditempati secara berbeda.
Secara umum, dasar -dasar dari kedua panggilan tersebut bukanlah apakah nilai atau alamat dilewati (setelah semua, alamat juga merupakan nilai), tetapi apakah parameter formal dan parameter aktual menempati ruang memori yang sama. Faktanya, parameter pointer yang lewat dalam C/C ++ juga merupakan panggilan nilai. Jika Anda tidak percaya, coba kode C berikut!
#include <stdio.h> void swap (int *a1, int *b1) {int *t = a1; A1 = B1; b1 = t; } int main () {int x1 = 100; int x2 = 200; int *a = & x1; int *b = & x2; printf (" %d %d/n",*a,*b); swap (a, b); printf (" %d %d/n",*a,*b); kembali 0; }Tetapi C/C ++ memiliki panggilan referensi, yang merupakan metode deklarasi variabel yang disebut referensi int a; int & ra = a; di mana ra adalah alias dari a. Tidak ada perbedaan antara keduanya dalam memori dan menempati ruang memori yang sama. Parameter yang lewat melalui referensi (alias) sejalan dengan karakteristik panggilan referensi. Anda dapat mencoba hasil berjalan dari void swap (int & a1, int & b1);
Melalui artikel ini, Anda harus tahu apakah parameter metode Java disebut referensi atau nilai.