国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Jadual Kandungan
Harus nilai dan hantaran rujukan" >Harus nilai dan hantaran rujukan
Melalui nilai dalam Java" >Melalui nilai dalam Java
Rumah Java Javabermula Apakah perbezaan antara lulus dengan nilai dan lulus dengan rujukan dalam java

Apakah perbezaan antara lulus dengan nilai dan lulus dengan rujukan dalam java

Jan 04, 2023 am 11:50 AM
java

Perbezaan: 1. Pemindahan nilai akan mencipta salinan, manakala pemindahan rujukan tidak mencipta salinan 2. Dalam pemindahan nilai, objek asal tidak boleh diubah dalam fungsi, tetapi dalam pemindahan rujukan, objek asal boleh diubah dalam fungsi. Melepasi nilai bermakna salinan parameter sebenar dihantar ke fungsi apabila memanggil fungsi, supaya jika parameter diubah suai dalam fungsi, parameter sebenar tidak akan terjejas melalui rujukan bermakna parameter sebenar disalin apabila memanggil fungsi Alamat dihantar terus ke fungsi, jadi pengubahsuaian pada parameter dalam fungsi akan mempengaruhi parameter sebenar.

Apakah perbezaan antara lulus dengan nilai dan lulus dengan rujukan dalam java

Persekitaran pengendalian tutorial ini: sistem Windows 7, versi Java 8, komputer DELL G3.

Parameter sebenar dan formal

Kita semua tahu bahawa parameter boleh ditakrifkan semasa mentakrifkan kaedah dalam Java. Sebagai contoh, kaedah utama dalam Java, public static void main(String[ ] args), args di sini ialah parameter. Parameter dibahagikan kepada parameter formal dan parameter sebenar dalam bahasa pengaturcaraan.

  • Parameter formal : ialah parameter yang digunakan semasa mentakrifkan nama fungsi dan badan fungsi Tujuannya adalah untuk menerima parameter yang dihantar semasa memanggil fungsi.

  • Parameter sebenar: Apabila memanggil fungsi berparameter, terdapat perhubungan pemindahan data antara fungsi panggilan dan fungsi yang dipanggil. Apabila memanggil fungsi dalam fungsi panggilan, parameter dalam kurungan selepas nama fungsi dipanggil "parameter sebenar"

Contoh mudah:

public static void main( String[ ] args) {
ParamTest pt = new ParamTest();
pt.sout( "Hollis");//實際參數(shù)為Hollis
}
public void sout( String name) {/!形式參數(shù)為name
system.out.println(name);
}

Parameter sebenar adakah kandungan sebenarnya diluluskan apabila memanggil kaedah berparameter, manakala parameter formal ialah parameter yang digunakan untuk menerima kandungan parameter sebenar.

Harus nilai dan hantaran rujukan

Seperti yang dinyatakan di atas, apabila kita memanggil fungsi berparameter, parameter sebenar akan dihantar kepada parameter formal. Walau bagaimanapun, dalam bahasa pengaturcaraan, terdapat dua kes pemindahan dalam proses pemindahan ini, iaitu pemindahan mengikut nilai dan pemindahan melalui rujukan. Mari kita lihat bagaimana lulus mengikut nilai dan lulus melalui rujukan ditakrifkan dan dibezakan dalam bahasa pengaturcaraan.

Lulus nilai bermaksud menyalin parameter sebenar dan menghantarnya ke fungsi apabila memanggil fungsi, supaya jika parameter diubah dalam fungsi, parameter sebenar tidak akan terjejas.
Melalui rujukan merujuk kepada menghantar alamat parameter sebenar terus ke fungsi apabila memanggil fungsi Kemudian pengubahsuaian parameter dalam fungsi akan menjejaskan parameter sebenar.

Dengan konsep di atas, anda boleh menulis kod dan mempraktikkannya. Mari kita lihat sama ada ia lulus mengikut nilai atau lulus melalui rujukan dalam Java Jadi, sekeping kod yang paling mudah keluar:

public static void main( String[] args) {
     ParamTest pt = new ParamTest();
    int i = 10;
    pt.pass(i);
    System.out.println( "print in main , i is " +i);
}
public void pass(int j){
    j = 20;
    system.out.println( "print in pass , j is " + j);
}

Dalam kod di atas, kami mengubah suai nilai parameter j dalam kaedah pas, dan kemudian mencetak nilai parameter dalam kaedah lulus dan kaedah utama masing-masing. Hasil keluaran adalah seperti berikut:

print in pass , j is 20
print in main , i is 10

Dapat dilihat bahawa pengubahsuaian nilai i di dalam kaedah pas tidak mengubah nilai parameter sebenar i. Jadi, mengikut definisi di atas, seseorang membuat kesimpulan: Lulus kaedah Java adalah lulus nilai.
Walau bagaimanapun, beberapa orang tidak lama kemudian menimbulkan soalan (haha, jadi jangan cepat membuat kesimpulan.). Kemudian, mereka akan mengalih keluar kod berikut:

public static void main(String[ ] args) {
    ParamTest pt = new ParamTest();
    User hollis = new User();
    hollis.setName( "Hollis");
    hollis.setGender("Male");
    pt.pass(hollis);
    system.out.println( "print in main , user is " + hollis);}public void pass(User user) {
    user.setName( "hollischuang");
    System.out.println( "print in pass , user is " + user);}

Ia juga merupakan kaedah lulus dan nilai parameter juga diubah suai dalam kaedah pas. Hasil keluaran adalah seperti berikut:

print in pass , user is User{name='hollischuang', gender='Male '}
print in main , user is User{name='hollischuang' , gender='Male '}

Selepas kaedah pas dilaksanakan, nilai parameter sebenar ditukar Mengikut definisi rujukan melalui di atas, nilai parameter sebenar diubah . Bukankah ini dipanggil rujukan? Oleh itu, berdasarkan dua keping kod di atas, seseorang membuat kesimpulan baru: dalam kaedah Java, apabila lulus jenis biasa, ia diluluskan oleh nilai, dan apabila lulus jenis objek, ia diluluskan melalui rujukan.
Walau bagaimanapun, kenyataan ini masih salah. Jika anda tidak percaya saya, lihat pemindahan parameter berikut di mana jenis parameter ialah objek:

public static void main( string[] args) {
    ParamTest pt = new ParamTest();
    string name = "Hollis";
    pt.pass(name ) ;
    System.out.println( "print in main , name is " + name);
}
public void pass(string name) {
    name = "hollischuang";
    system.out.println( "print in pass , name is " + name);
}

Hasil output kod di atas ialah

print in pass , name is hollischuangprint in main , name is Hollis

Apakah penjelasan untuk ini? Objek juga diluluskan, Tetapi nilai parameter asal tidak diubah suai. Mungkinkah objek yang diluluskan telah menjadi nilai semula?

Melalui nilai dalam Java

Di atas, kami memetik tiga Hasilnya berbeza, itulah sebabnya ramai pemula dan juga pengaturcara lanjutan keliru tentang jenis pemindahan Java. Sebenarnya, apa yang saya ingin beritahu anda adalah bahawa konsep di atas tidak salah, tetapi terdapat masalah dengan contoh kod. Ayuh, izinkan saya menggariskan perkara utama konsep untuk anda, dan kemudian memberi anda beberapa contoh yang benar-benar sesuai.

Lulus nilai bermaksud menyalin parameter sebenar dan menghantarnya ke fungsi apabila memanggil fungsi, supaya jika parameter diubah dalam fungsi, parameter sebenar tidak akan terjejas.
Melalui rujukan bermakna apabila memanggil fungsi, alamat parameter sebenar dihantar terus ke fungsi Kemudian pengubahsuaian parameter dalam fungsi akan mempengaruhi parameter sebenar.

Jadi, izinkan saya meringkaskan untuk anda perkara utama perbezaan antara lulus nilai dan lulus rujukan.

< /thead>< /table>

我們上面看過的幾個pass的例子中,都只關(guān)注了實際參數(shù)內(nèi)容是否有改變。如傳遞的是User對象,我們試著改變他的name屬性的值,然后檢查是否有改變。其實,在實驗方法上就錯了,當(dāng)然得到的結(jié)論也就有問題了。

為什么說實驗方法錯了呢?這里我們來舉一個形象的例子。再來深入理解一下值傳遞和引用傳遞,然后你就知道為啥錯了。

你有一把鑰匙,當(dāng)你的朋友想要去你家的時候,如果你直接把你的鑰匙給他了,這就是引用傳遞。這種情況下,如果他對這把鑰匙做了什么事情,比如他在鑰匙上刻下了自己名字,那么這把鑰匙還給你的時候,你自己的鑰匙上也會多出他刻的名字。

你有一把鑰匙,當(dāng)你的朋友想要去你家的時候,你復(fù)刻了一把新鑰匙給他,自己的還在自己手里,這就是值傳遞。這種情況下,他對這把鑰匙做什么都不會影響你手里的這把鑰匙。

但是,不管上面那種情況,你的朋友拿著你給他的鑰匙,進到你的家里,把你家的電視砸了。那你說你會不會受到影響?而我們在pass方法中,改變user對象的name屬性的值的時候,不就是在“砸電視”么。

還拿上面的一個例子來舉例,我們真正的改變參數(shù),看看會發(fā)生什么?

public static void main(String[ ] args){
    ParamTest pt = new ParamTest();
    User hollis = new User();
    hollis.setName( "Hollis");
    hollis.setGender("Male" );
    pt.pass(hollis);
    system.out.println("print in main , user is " + hollis);
    public void pass(User user) {
        user = new User();
        user.setName( "hollischuang");
        user.setGender( "Male");
        system.out.println( "print in pass , user is " + user);

上面的代碼中,我們在pass方法中,改變了user對象,輸出結(jié)果如下:

print in pass , user is User{name=&#39;hollischuang &#39; , gender=&#39;Male &#39;}
print in main , user is User{name=&#39;Hollis&#39;, gender= &#39;Male &#39;}

我們來畫一張圖,看一下整個過程中發(fā)生了什么,然后我再告訴你,為啥Java中只有值傳遞。

Apakah perbezaan antara lulus dengan nilai dan lulus dengan rujukan dalam java

稍微解釋下這張圖,當(dāng)我們在main中創(chuàng)建一個User對象的時候,在堆中開辟一塊內(nèi)存,其中保存了name和gender等數(shù)據(jù)。然后hollis持有該內(nèi)存的地址ex123456(圖1)。當(dāng)嘗試調(diào)用pass方法,并且hollis作為實際參數(shù)傳遞給形式參數(shù)user的時候,會把這個地址ex123456交給user,這時,user也指向了這個地址(圖2)。然后在pass方法內(nèi)對參數(shù)進行修改的時候,即user = newUser();,會重新開辟一塊 eX456789的內(nèi)存,賦值給user。后面對user的任何修改都不會改變內(nèi)存eX123456的內(nèi)容(圖3)。

上面這種傳遞是什么傳遞?肯定不是引用傳遞,如果是引用傳遞的話,在user=new User()的時候,實際參數(shù)的引用也應(yīng)該改為指向eX456789,但是實際上并沒有。

通過概念我們也能知道,這里是把實際參數(shù)的引用的地址復(fù)制了一份,傳遞給了形式參數(shù)。所以,上面的參數(shù)其實是值傳遞,把實參對象引用的地址當(dāng)做值傳遞給了形式參數(shù)。

我們再來回顧下之前的那個“砸電視”的例子,看那個例子中的傳遞過程發(fā)生了什么。

Apakah perbezaan antara lulus dengan nilai dan lulus dengan rujukan dalam java

同樣的,在參數(shù)傳遞的過程中,實際參數(shù)的地址eX1213456被拷貝給了形參,只是,在這個方法中,并沒有對形參本身進行修改,而是修改的形參持有的地址中存儲的內(nèi)容。

所以,值傳遞和引用傳遞的區(qū)別并不是傳遞的內(nèi)容。而是實參到底有沒有被復(fù)制一份給形參。在判斷實參內(nèi)容有沒有受影響的時候,要看傳的的是什么,如果你傳遞的是個地址,那么就看這個地址的變化會不會有影響,而不是看地址指向的對象的變化。就像鑰匙和房子的關(guān)系。

那么,既然這樣,為啥上面同樣是傳遞對象,傳遞的String對象和User對象的表現(xiàn)結(jié)果不一樣呢?我們在pass方法中使用name = “hollischuang”;試著去更改name的值,陰差陽錯的直接改變了name的引用的地址。因為這段代碼,會new一個String,在把引用交給name,即等價于name =new String(“hollischuang”);。而原來的那個”Hollis”字符串還是由實參持有著的,所以,并沒有修改到實際參數(shù)的值。

Apakah perbezaan antara lulus dengan nilai dan lulus dengan rujukan dalam java

所以說,Java中其實還是值傳遞的,只不過對于對象參數(shù),值的內(nèi)容是對象的引用。

總結(jié)

無論是值傳遞還是引用傳遞,其實都是一種求值策略(Evaluation strategy)。在求值策略中,還有一種叫做按共享傳遞。其實Java中的參數(shù)傳遞嚴(yán)格意義上說應(yīng)該是按共享傳遞。

Melewati melalui perkongsian bermakna apabila fungsi dipanggil, salinan alamat parameter sebenar dihantar ke fungsi (jika parameter sebenar berada pada timbunan, nilai disalin terus). Apabila mengendalikan parameter di dalam fungsi, anda perlu menyalin alamat untuk mencari nilai tertentu sebelum beroperasi. Jika nilai berada pada timbunan, maka kerana ia adalah salinan langsung nilai, operasi pada parameter dalam fungsi tidak akan menjejaskan pembolehubah luaran. Jika salinan asal ialah alamat nilai asal dalam timbunan, maka anda perlu mencari lokasi yang sepadan dalam timbunan berdasarkan alamat sebelum melakukan operasi. Oleh kerana salinan alamat dihantar, operasi pada nilai dalam fungsi dapat dilihat oleh pembolehubah luaran.

Ringkasnya, pemindahan dalam Java adalah mengikut nilai, dan nilai ini sebenarnya merujuk kepada objek.
Lulus melalui perkongsian sebenarnya hanyalah kes khas lulus dengan nilai. Oleh itu, kita boleh mengatakan bahawa lulus dalam Java adalah lulus dengan perkongsian, atau lulus dalam Java adalah lulus dengan nilai.

Jadi parameter pengendalian di dalam fungsi tidak akan menjejaskan pembolehubah luaran. Jika salinan asal ialah alamat nilai asal dalam timbunan, maka anda perlu mencari lokasi yang sepadan dalam timbunan berdasarkan alamat sebelum melakukan operasi. Oleh kerana salinan alamat dihantar, operasi pada nilai dalam fungsi dapat dilihat oleh pembolehubah luaran.

Ringkasnya, pemindahan dalam Java adalah mengikut nilai, dan nilai ini sebenarnya merujuk kepada objek.

Melalui perkongsian sebenarnya hanyalah kes khas untuk lulus mengikut nilai. Oleh itu, kita boleh mengatakan bahawa lulus dalam Java adalah lulus dengan perkongsian, atau lulus dalam Java adalah lulus dengan nilai.

Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Pengajaran Pengaturcaraan! !

Atas ialah kandungan terperinci Apakah perbezaan antara lulus dengan nilai dan lulus dengan rujukan dalam java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1502
276
Bagaimana menangani transaksi di Java dengan JDBC? Bagaimana menangani transaksi di Java dengan JDBC? Aug 02, 2025 pm 12:29 PM

Untuk mengendalikan transaksi JDBC dengan betul, anda mesti terlebih dahulu mematikan mod komit automatik, kemudian melakukan pelbagai operasi, dan akhirnya melakukan atau mengembalikan semula hasilnya; 1. Panggil Conn.SetAutOcommit (palsu) untuk memulakan transaksi; 2. Melaksanakan pelbagai operasi SQL, seperti memasukkan dan mengemaskini; 3. Panggil Conn.Commit () jika semua operasi berjaya, dan hubungi conn.rollback () jika pengecualian berlaku untuk memastikan konsistensi data; Pada masa yang sama, cuba-dengan-sumber harus digunakan untuk menguruskan sumber, mengendalikan pengecualian dengan betul dan menutup sambungan untuk mengelakkan kebocoran sambungan; Di samping itu, adalah disyorkan untuk menggunakan kolam sambungan dan menetapkan mata simpan untuk mencapai rollback separa, dan menyimpan urus niaga sesingkat mungkin untuk meningkatkan prestasi.

Memahami dalaman Mesin Maya Java (JVM) Memahami dalaman Mesin Maya Java (JVM) Aug 01, 2025 am 06:31 AM

THEJVMenableSjava's "Writeonce, Runanywhere" keupayaanByExecutingByteCodeThroughFourMaincomponents: 1.TheClassloadersubsystemloads, pautan, danInitializes.ClassFilesusingBootstrap, Extension, andapplicationClassloaders, EnsuringseCureAndlazyCon

Bagaimana untuk bekerja dengan kalendar di Jawa? Bagaimana untuk bekerja dengan kalendar di Jawa? Aug 02, 2025 am 02:38 AM

Gunakan kelas dalam pakej Java.Time untuk menggantikan kelas lama dan kelas kalendar; 2. Dapatkan tarikh dan masa semasa melalui LocalDate, LocalDateTime dan Tempatan Tempatan; 3. Buat tarikh dan masa tertentu menggunakan kaedah (); 4. Gunakan kaedah tambah/tolak untuk meningkatkan dan mengurangkan masa; 5. Gunakan zoneddatetime dan zonid untuk memproses zon waktu; 6. Format dan parse date string melalui DateTimeFormatter; 7. Gunakan segera untuk bersesuaian dengan jenis tarikh lama apabila perlu; pemprosesan tarikh di java moden harus memberi keutamaan untuk menggunakan java.timeapi, yang memberikan jelas, tidak berubah dan linear

Membandingkan kerangka Java: Spring Boot vs Quarkus vs Micronaut Membandingkan kerangka Java: Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pra-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless scenarios.tyvelopecosyste,

Memahami Pelabuhan Rangkaian dan Firewall Memahami Pelabuhan Rangkaian dan Firewall Aug 01, 2025 am 06:40 AM

NetworkPortsandFireWallSworkTogethertoenableCommunicationWileensuringsecurity.1.networkportsarevirtualendpointsNumbered0-655 35, Withwell-KnownportsLike80 (http), 443 (https), 22 (ssh), dan25 (smtp) identitispecificservices.2.portsoperateovertcp (boleh dipercayai, c

Bagaimana pengumpulan sampah berfungsi di java? Bagaimana pengumpulan sampah berfungsi di java? Aug 02, 2025 pm 01:55 PM

Koleksi Sampah Java (GC) adalah mekanisme yang secara automatik menguruskan ingatan, yang mengurangkan risiko kebocoran ingatan dengan menuntut semula objek yang tidak dapat dicapai. 1.GC menghakimi kebolehcapaian objek dari objek akar (seperti pembolehubah stack, benang aktif, medan statik, dan lain -lain), dan objek yang tidak dapat dicapai ditandakan sebagai sampah. 2. Berdasarkan algoritma penandaan tanda, tandakan semua objek yang dapat dicapai dan objek yang tidak ditandai. 3. Mengamalkan strategi pengumpulan generasi: Generasi Baru (Eden, S0, S1) sering melaksanakan MinorGC; Orang tua melakukan kurang tetapi mengambil masa lebih lama untuk melakukan MajorGC; Metaspace Stores Metadata kelas. 4. JVM menyediakan pelbagai peranti GC: SerialGC sesuai untuk aplikasi kecil; ParallelGC meningkatkan throughput; CMS mengurangkan

Membandingkan Java Build Tools: Maven vs Gradle Membandingkan Java Build Tools: Maven vs Gradle Aug 03, 2025 pm 01:36 PM

GradleisthebetterChoiceFormostNewProjectSduetoitSsuperiorflexibility, Prestasi, danModernToolingSupport.1.Gradle'sGroovy/KOT lindslismoreconciseandexpressivethanmaven'sverbosexml.2.GradleOutPerformsMaveninBuildSpeedWithIncrementalcompilation, BuildCac

Pergi dengan contoh penangguhan yang dijelaskan Pergi dengan contoh penangguhan yang dijelaskan Aug 02, 2025 am 06:26 AM

Defer digunakan untuk melaksanakan operasi tertentu sebelum fungsi pulangan, seperti sumber pembersihan; Parameter dinilai dengan serta-merta apabila menangguhkan, dan fungsi-fungsi dilaksanakan mengikut urutan terakhir (LIFO); 1. Pelbagai penahanan dilaksanakan dalam urutan terbalik pengisytiharan; 2. Biasanya digunakan untuk pembersihan yang selamat seperti penutupan fail; 3. Nilai pulangan yang dinamakan boleh diubah suai; 4. Ia akan dilaksanakan walaupun panik berlaku, sesuai untuk pemulihan; 5. Elakkan penyalahgunaan menangguhkan gelung untuk mengelakkan kebocoran sumber; Penggunaan yang betul boleh meningkatkan keselamatan kod dan kebolehbacaan.

See all articles
<menuitem id="defkw"></menuitem>

值傳遞引用傳遞
根本區(qū)別會創(chuàng)建副本不創(chuàng)建副本
所有函數(shù)中無法改變原始對象函數(shù)中可以改變原始對象
Pass by valuePass by reference
Perbezaan asasAkan membuat salinanTidak mencipta salinan
SemuaObjek asal tidak boleh ditukar dalam fungsiObjek asal boleh ditukar dalam fungsi< /td>