JavaRush /Blog Java /Random-MS /Melewati parameter dalam Java
vincent_vega
Tahap
Gainesville

Melewati parameter dalam Java

Diterbitkan dalam kumpulan
Pembolehubah dalam Java ialah bekas dengan nilai di dalamnya. Jadi apakah yang dimaksudkan untuk "melepasi" pembolehubah? Dan apakah perbezaan antara jenis data primitif dan rujukan.
Melewati parameter dalam Java - 1
Kami akan sampai ke sana nanti. Mari kita mulakan dengan tugasan yang mudah dahulu. Apa yang dilakukan oleh kod ini:
int х = 3;
int у = х;
Pada baris 1, pembolehubah x jenis int dicipta dan diberikan nilai 3. Pada baris 2, pembolehubah y jenis int dicipta dan diberikan nilai pembolehubah x . Pada masa hadapan, pembolehubah x tidak menjejaskan y dalam apa cara sekalipun . Java menyalin nilai x (3) dan tempat yang menyalin ke dalam y . Ini menghantar parameter mengikut nilai. Anda tidak menulis satu pembolehubah kepada yang lain. Nilai disalin dan diberikan kepada pembolehubah baharu. Ungkapan y = x; BUKAN bermaksud "tulis x kepada y ". Ia bermaksud "salin nilai di dalam x dan tulis salinan itu kepada y ." Jika kemudian saya menukar y :
у = 34;
Adakah ini akan menjejaskan x ? Sudah tentu tidak. x masih mempunyai nilai 3. Jika saya menukar x kemudian :
х = 90;
Bagaimanakah ini akan menjejaskan y ? tak boleh. Mereka tidak berkaitan dalam apa jua cara selepas tugasan dibuat (MENYALIN nilai). Bagaimana pula dengan jenis rujukan? Bagaimana mereka bekerja? Tidak begitu sukar, malah peraturannya adalah sama. Pautan melakukan perkara yang sama - anda mendapat salinan pautan. Jadi jika saya berkata:
Cat A = new Cat ();
Cat B = A;
Pautan A disalin ke pautan B. Ini tidak terpakai pada objek - anda masih mempunyai satu objek sahaja. Tetapi kini anda mempunyai dua rujukan berbeza yang mengawal objek Cat yang sama . Sekarang mari kita lihat pada menghantar parameter kepada kaedah. Java melepasi parameter mengikut nilai. Sentiasa. Ini bermakna "salin nilai dan lulus salinan." Untuk jenis primitif adalah mudah:
int х = 5;
doStuff (х); / / Передать копию х (meaning 5) в метод doStuff
Kaedah doStuff kelihatan seperti ini:
void doStuff (int у) {

   / / Действия с 'y'
}
Salinan nilai x , iaitu 5, dihantar ke kaedah doStuff() . Kaedah doStuff() mempunyai pembolehubah sendiri yang dipanggil y . Pembolehubah y ialah pembolehubah baharu yang berbeza. Dengan salinan apa yang ada dalam x pada masa menghantarnya kepada kaedah. Mulai sekarang, y dan x tidak mempunyai kesan antara satu sama lain. Apabila anda menukar y , anda tidak menjejaskan x .
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
Dan sebaliknya - jika anda menukar x , anda tidak akan menukar y . Satu-satunya perkara yang x lakukan dalam kes ini ialah menyalin nilainya dan menyerahkannya kepada kaedah doStuff() . Bagaimanakah "nilai lulus" berfungsi dengan rujukan? Terlalu ramai orang berkata, "Java menghantar jenis primitif mengikut nilai dan objek melalui rujukan." Ia bukan apa yang mereka katakan. Java melepasi segala-galanya mengikut nilai. Dengan primitif, anda mendapat salinan kandungan. Dengan pautan anda juga mendapat salinan kandungan. Tetapi apakah kandungan pautan itu? Alat kawalan jauh. Kemudahan untuk mengurus/mengakses kemudahan. Apabila anda menghantar rujukan kepada objek kepada kaedah, anda menghantar salinan rujukan. Klon kawalan jauh. Objek itu masih duduk di dalam longgokan di mana ia dicipta, menunggu seseorang untuk menggunakan alat kawalan jauh. Kemudahan itu tidak peduli berapa banyak alat kawalan jauh yang "diprogramkan" untuk mengawalnya. Satu-satunya orang yang mengambil berat tentang perkara ini ialah pemungut sampah dan anda, pengaturcara. Jadi apabila anda berkata:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
Terdapat hanya satu objek Kucing . Tetapi kini dua alat kawalan jauh (pautan) boleh mengakses objek Cat yang sama . Jadi sekarang apa sahaja yang B lakukan pada objek Cat akan menjejaskan Cat yang ditunjuk oleh A , tetapi ia tidak akan menjejaskan kandungan A ! Anda boleh menukar Cat menggunakan pautan baharu B (disalin terus daripada A ), tetapi anda tidak boleh menukar A. Apa maksudnya? Anda boleh menukar objek yang A rujuk , tetapi anda tidak boleh menukar rujukan A - ubah hala ke objek lain atau null . Jadi, jika anda menukar rujukan B (bukan objek Cat sebenar yang B rujuk , tetapi nilai rujukan itu sendiri) anda tidak akan mengubah nilai A . Dan begitu juga sebaliknya. Jadi:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
Ini bermakna B menunjuk ke objek lain. A masih gembira. Jadi ulangi selepas saya: Java melepasi segala-galanya mengikut nilai. (Baiklah, sekali lagi... dengan perasaan.) Java melepasi segala-galanya mengikut nilai. Untuk jenis primitif anda lulus salinan nilai semasa, untuk rujukan objek anda lulus salinan rujukan (kawalan jauh). Anda tidak pernah melepasi objek itu. Semua objek disimpan pada timbunan. Sentiasa. Sekarang bancuh secawan kopi yang banyak dan tulis beberapa kod! Artikel asal .
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION