Rumah >Java >javaTutorial >Mengapa nilai hanya diluluskan di Jawa?

Mengapa nilai hanya diluluskan di Jawa?

王林
王林ke hadapan
2023-04-18 11:28:02929semak imbas

Soalan klasik

Adakah parameter Java melepasi nilai atau rujukan? Soalan ini sangat asas, tetapi ramai yang keliru sedikit

Parameter formal & parameter sebenar

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.

  • Lulus nilai: Apabila memanggil fungsi,

    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

  • Lulus melalui rujukan: kaedah menerima alamat dirujuk oleh parameter sebenar, dan tidak mencipta salinan Pengubahsuaian parameter akan mempengaruhi parameter sebenar, iaitu,

    tidak mencipta salinan, tetapi akan menjejaskan objek asli

    .
Kita juga perlu tahu: terdapat 2 jenis data dalam Java, Antaranya, terdapat terutamanya

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

Adakah Java diluluskan mengikut nilai atau rujukan?

Untuk soalan ini, mari kita lihat pada beberapa contoh dan terangkannya perlahan-lahan:

Jenis lulus parameter: jenis data asas

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 = 10

param2 = 20
selepas perubahan....
param1 = 333

param2 = 444

==============

num1 = 10
num2 = 20

Kita dapati perubahan() Menetapkan semula pembolehubah dalam kaedah tidak mengubah nilai pembolehubah num1 dan num2

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 adalah

laluan nilai.

Mengapa nilai hanya diluluskan di Jawa?

Jenis parameter: jenis data rujukan

public 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 Ming

param2 = 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

Kami mendapati pembolehubah str tidak berubah, tetapi pembolehubah str2 telah berubah Adakah anda keliru: jika jenis parameter Java ialah a jenis data rujukan, ia ialah

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():

<.> Mengapa nilai hanya diluluskan di Jawa?selepas perubahan():

Mengapa nilai hanya diluluskan di Jawa?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 nilai

dan 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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam