Rumah >Java >javaTutorial >Mengapa nilai hanya diluluskan di Jawa?
Adakah parameter Java melepasi nilai atau rujukan? Soalan ini sangat asas, tetapi ramai yang keliru sedikit
Mula-mula kita perlu memahami beberapa konsep tentang parameter
Parameter formal : Parameter yang digunakan semasa mentakrifkan fungsi digunakan untuk menerima parameter yang dihantar oleh fungsi Sebagai contoh, jika kita menulis fungsi, parameter dalam fungsi adalah parameter formal
public void test(String str) { //str为形式参数 System.out.println(str); }
<.>parameter sebenar: us Apabila memanggil fungsi, parameter dalam kurungan selepas nama fungsi dipanggil parameter sebenar dan mesti mempunyai nilai yang pasti Seperti yang ditunjukkan dalam contoh berikut
public static void main(String[] args) { A a = new A(); a.test("小 明"); //"小 明"则为实际参数 }ia boleh mendapati bahawa apabila fungsi berparameter dipanggil, Parameter sebenar dihantar ke parameter formal. Secara amnya terdapat dua situasi untuk parameter dalam proses hantaran jenis ini
Lulus nilai dan hantaran rujukan.
salin salinan parameter sebenar dan hantarkannya kepada Pengubahsuaian parameter di dalam fungsi tidak akan menjejaskan parameter sebenar, iaitu, mencipta salinan, yang tidak akan menjejaskan objek asli
tidak mencipta salinan, tetapi akan menjejaskan objek asli
.jenis data asas dan jenis data rujukan Kecuali 8 jenis data asas , ialah semua jenis data rujukan, masing-masing: byte,short,int,long,char,boolean,float,double
public class TestBasic { public static void main(String[] args) { int num1 = 10; int num2 = 20; change(num1, num2); System.out.println("=============="); System.out.println("num1 = " + num1); System.out.println("num2 = " + num2); } public static void change(int param1, int param2) { System.out.println("param1 = " + param1); System.out.println("param2 = " + param2); param1 = 333; param2 = 444; System.out.println("after change...."); System.out.println("param1 = " + param1); System.out.println("param2 = " + param2); } }Keputusan:
param1 = 10Kita dapati perubahan() Menetapkan semula pembolehubah dalam kaedah tidak mengubah nilai pembolehubah num1 dan num2param2 = 20
selepas perubahan....
param1 = 333
param2 = 444
==============
num1 = 10
num2 = 20
Apa yang berubah hanyalah salinan num1 dan num2 dalam kaedah change(). Kita perlu tahu bahawa jenis data asas hanya mempunyai satu ruang storan dalam ingatan, yang diperuntukkan dalam tindanan.
Jika jenis parameter Java ialah jenis data asas, ia adalahlaluan nilai.
Jenis parameter: jenis data rujukanpublic class TestQuote { public static void main(String[] args) { String str = "小明"; StringBuilder str2 = new StringBuilder("今天天气好"); change(str,str2); System.out.println("=============="); System.out.println("str = " + str); System.out.println("str2 = " + str2); } public static void change(String param1,StringBuilder param2) { System.out.println("param1 = " + param1); System.out.println("param2 = " + param2); param1= "小张"; param2.append(",我们去钓鱼"); System.out.println("after change...."); System.out.println("param1 = " + param1); System.out.println("param2 = " + param2); } }Hasil:
param1 = Xiao MingKami mendapati pembolehubah str tidak berubah, tetapi pembolehubah str2 telah berubah Adakah anda keliru: jika jenis parameter Java ialah a jenis data rujukan, ia ialahparam2 = Cuaca baik hari ini
selepas perubahan....
param1 = Xiao Zhang
param2 = Cuaca baik hari ini, mari kita pergi memancing
str = Xiao Ming
str2 = Hari ini Cuaca baik, mari kita pergi memancing
Nilai lulus atau lulus melalui rujukan ?
Malah, semua orang telah tertipu dengan sekumpulan istilah Pengarang melukis 2 gambar untuk membantu semua orang memahami: sebelum perubahan():<.> selepas perubahan():
Di Java, kecuali untuk jenis data asas, yang lain ialah jenis rujukan mempunyai dua ruang storan dalam memori (Satu sekeping di dalam timbunan dan sekeping di dalam timbunan).
Jika parameter ialah jenis rujukan, apa yang dihantar ialah salinan nilai alamat objek yang dirujuk oleh parameter sebenar pada tindanan Salinan yang dibuat di sini ialah salinan alamat. Kemudian seseorang mengatakannya, tetapi nilainya telah berubah Adakah ini jelas "melalui rujukan"?
Kita boleh memahaminya dari perspektif lain Jika kita menganggap alamat tindanan sebagai nilai, salinan alamat tindanan akan dibuat (salin bingkai tindanan tidak berubah pada akhirnya). tetapi nilai dalam memori timbunan berubah. Ia seperti alamat tindanan adalah kunci Jika kita menyalinnya, ia boleh membuka peti besi. Apa yang kami ambil berat ialah sama ada terdapat perubahan pada corak kunci berkenaan dengan jumlah wang selepas membuka peti besi, kami tidak perlu peduli.
Walaupun nilai pembolehubah str2 (data dalam timbunan) telah berubah selepas fungsi dipanggil, parameter adalah jenis rujukan, dan parameter sebenar yang diluluskan ialah nilai alamat dalam tindanan prihatin, dan timbunan disalin Nilai alamat dalam timbunan akhir tidak berubah. Oleh itu, salinan dibuat selaras dengan definisi
pemindahan nilaidan tidak akan menjejaskan objek asal. Seseorang mungkin bertanya lagi, mengapa nilai pembolehubah str tidak berubah? Sebenarnya, ini sepenuhnya disebabkan oleh sifat istimewa
Kami tahu bahawa ia tidak boleh diubah dan muktamad Pada masa ini, param1= "Xiao Zhang" dalam fungsi sebenarnya akan mencipta objek String baharu secara tersirat. pada masa yang sama, objek String baharu akan dibuka dalam memori timbunan baru, param1 menunjuk ke ruang memori yang baru dibuka ini. Tiada perubahan dalam data dalam ruang memori timbunan yang ditunjukkan oleh alamat asal str.Atas ialah kandungan terperinci Mengapa nilai hanya diluluskan di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!