Pemahaman transfer nilai Java:
Kode 1:
Tes kelas publik { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); SChange(buffer); public static void SChange (StringBuffer str) { str= new StringBuffer("huang");Kode 2:
Tes kelas publik { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); SChange(buffer); public static void SChange (StringBuffer str) { //str= new StringBuffer("huang"); str.append(" huang" } }Mari kita gunakan dua gambar untuk menjelaskan masing-masing kode 1 dan kode 2 di atas:
keadaan asli
Diagram kode 1:
Pengertian kode 2:
Dalam kode 1, referensi salinan menunjuk ke objek baru. Namun objek aslinya tetap tidak berubah.
Dalam kode 2, referensi salinan mengubah objek aslinya.
Ini adalah nilai passing by Java.
Perbedaan antara dua jenis transfer di C++:
Untuk metode penerusan nilai, penerusan referensi, dan penunjuk C++, gunakan kode berikut untuk memahami dan menjalankan pengujian sendiri
#include <stdio.h> #include <iostream> #include <typeinfo> void ByValue(int a) { a = a + 1; } void ByRef(int& a) { a = a + 1; a) { *a = *a + 1; } int utama(int argv, char** args) { int v = 1; ByRef(v); // Lewati Referensi ByPointer(&v); // Lewati Nilai int* vp = &v; cout << typeid(vp).nama() << std::endl; // std::cout << typeid(&vp).nama() << std::endl; std::cout << "akhir" << std::endl;Yang pertama diteruskan berdasarkan nilai, dan fungsi kedua diteruskan berdasarkan referensi, tetapi untuk dua fungsi terakhir, fungsi yang sama dipanggil sekali oleh Panggilan dengan referensi dan sekali oleh Panggilan berdasarkan nilai.
Karena:
ByPointer(vp); Jika vp tidak diubah, maka tidak dapat diubah. Lewati nilai
ByPointer(&v); Lulus dengan referensi (Anda mungkin mengatakan bahwa apa yang diteruskan sebenarnya adalah alamat v, dan ByPointer tidak dapat mengubah alamat v, jadi ini adalah Panggilan berdasarkan nilai. Ini kedengarannya cukup jelas, tetapi alamat v adalah data murni. Kapan panggilan tidak ada dalam kode persegi. Untuk pemanggil, hanya ada v, dan v memang diubah oleh fungsi ByPointer Perilaku yang menjadi acuan Mengingat perilaku adalah maksud awal dari strategi evaluasi. Jika semuanya diabstraksikan menjadi nilai-nilai dan permasalahan dilihat dari sudut pandang data, maka tidak perlu memperkenalkan konsep strategi evaluasi untuk membingungkan penonton. )
nob: Pemahaman di atas diakui. Metode penunjuk tambahan dapat digunakan dalam dua cara. Pengoperan nilai: meneruskan penunjuk; meneruskan alamat atau referensi suatu variabel; lihat &v dan vp, Anda akan menemukan bahwa keduanya bertipe Point, jadi dua pertunjukan, hasil yang sama. Anda mungkin menganggap saya seperti ini
BerdasarkanNilai(&v); //kesalahan
, sedangkan meneruskan parameter dari tipe yang berbeda di C++ tidak akan meneruskan kompilasi secara langsung.
Meringkaskan:
Jadi menurut saya jika Anda meneruskan nilai atau referensi, Anda hanya perlu melihat bagaimana hasilnya di memori.
Berbagi memori berarti meneruskan referensi, dan menyalin memori berarti meneruskan nilai (mengesampingkan beberapa kasus khusus terlebih dahulu)
Dalam hal ini:
C/C++: Meneruskan nilai secara default, meneruskan dengan referensi, dan pointer dipahami secara terpisah (pointer dapat dipahami sebagai meneruskan nilai atau dengan referensi, dan hasilnya sama)
JAVA: Tipe data dasar diteruskan berdasarkan nilai, dan objek juga diteruskan berdasarkan nilai (salin referensi objek ini)
C#: Meneruskan nilai berdasarkan jenis nilai, meneruskan referensi berdasarkan jenis referensi, pemahaman khusus tentang ref/out
String di JAVA dan C# memerlukan pemahaman khusus. Tampilannya adalah untuk meneruskan nilai, tetapi implementasi sebenarnya bergantung pada mesin virtual.