JavaRush /Java Blog /Random-ID /Melewati parameter di Java
vincent_vega
Level 24
Gainesville

Melewati parameter di Java

Dipublikasikan di grup Random-ID
Variabel di Java adalah sebuah wadah dengan nilai di dalamnya. Jadi apa artinya "melewatkan" suatu variabel? Dan apa perbedaan antara tipe data primitif dan referensi.
Melewati parameter di Java - 1
Kita akan membahasnya nanti. Mari kita mulai dengan tugas sederhana terlebih dahulu. Apa yang dilakukan kode ini:
int х = 3;
int у = х;
Pada baris 1, variabel x bertipe int dibuat dan diberi nilai 3. Pada baris 2, variabel y bertipe int dibuat dan diberi nilai variabel x . Di masa depan, variabel x tidak mempengaruhi y dengan cara apapun . Java menyalin nilai x (3) dan tempat-tempat yang menyalinnya ke y . Ini meneruskan parameter berdasarkan nilai. Anda tidak menulis satu variabel ke variabel lainnya. Nilai disalin dan ditetapkan ke variabel baru. Ekspresi y = x; TIDAK berarti "tulis x ke y ". Artinya "salin nilai di dalam x dan tulis salinan itu ke y ." Jika nanti saya ubah y :
у = 34;
Apakah ini akan mempengaruhi x ? Tentu saja tidak. x masih bernilai 3. Jika nanti saya ubah x :
х = 90;
Bagaimana pengaruhnya terhadap kamu ? Mustahil. Mereka tidak berhubungan dengan cara apapun setelah tugas dibuat (MENYALIN nilainya). Bagaimana dengan tipe referensi? Bagaimana mereka bekerja? Tidak terlalu sulit, sebenarnya aturannya sama. Tautan melakukan hal yang sama - Anda mendapatkan salinan tautan tersebut. Jadi jika saya berkata:
Cat A = new Cat ();
Cat B = A;
Tautan A disalin ke tautan B. Ini tidak berlaku untuk objek - Anda masih hanya memiliki satu objek. Namun sekarang Anda memiliki dua referensi berbeda yang mengontrol objek Cat yang sama . Sekarang mari kita lihat meneruskan parameter ke metode. Java meneruskan parameter berdasarkan nilai. Selalu. Ini berarti "menyalin nilainya dan meneruskan salinannya." Untuk tipe primitif caranya mudah:
int х = 5;
doStuff (х); / / Передать копию х (meaning 5) в метод doStuff
Metode doStuff terlihat seperti ini:
void doStuff (int у) {

   / / Действия с 'y'
}
Salinan nilai x , yaitu 5, diteruskan ke metode doStuff() . Metode doStuff() memiliki variabelnya sendiri yang disebut y . Variabel y merupakan variabel baru yang berbeda. Dengan salinan dari apa yang ada di x pada saat meneruskannya ke metode. Mulai sekarang, y dan x tidak berpengaruh satu sama lain. Saat Anda mengubah y , Anda tidak memengaruhi x .
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
Dan sebaliknya - jika Anda mengubah x , Anda tidak akan mengubah y . Satu-satunya hal yang x lakukan dalam kasus ini adalah menyalin nilainya dan meneruskannya ke metode doStuff() . Bagaimana cara kerja "pass by value" dengan referensi? Terlalu banyak orang yang mengatakan, "Java meneruskan tipe primitif berdasarkan nilai dan objek berdasarkan referensi." Bukan itu yang mereka katakan. Java meneruskan semuanya berdasarkan nilai. Dengan primitif, Anda mendapatkan salinan konten. Dengan tautan Anda juga mendapatkan salinan kontennya. Tapi apa isi tautannya? Kendali jarak jauh. Fasilitas untuk mengelola/mengakses fasilitas. Saat Anda meneruskan referensi ke suatu objek ke suatu metode, Anda meneruskan salinan referensi tersebut. Klon kendali jarak jauh. Benda tersebut masih berada di tumpukan tempat pembuatannya, menunggu seseorang untuk menggunakan remote control. Fasilitas ini tidak peduli berapa banyak remote yang "diprogram" untuk mengendalikannya. Satu-satunya orang yang peduli dengan hal ini adalah pemulung dan Anda, sang programmer. Jadi ketika Anda berkata:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
Hanya ada satu objek Cat . Namun sekarang dua kendali jarak jauh (tautan) dapat mengakses objek Cat yang sama . Jadi sekarang apa pun yang dilakukan B pada objek Cat akan memengaruhi Cat yang ditunjuk oleh A , namun tidak akan memengaruhi konten A ! Anda dapat mengubah Cat menggunakan tautan baru B (disalin langsung dari A ), tetapi Anda tidak dapat mengubah A. Apa maksudnya ini? Anda dapat mengubah objek yang dirujuk A , tetapi Anda tidak dapat mengubah referensi A - mengalihkannya ke objek lain atau null . Jadi jika Anda mengubah referensi B (bukan objek Cat sebenarnya yang direferensikan B , tetapi nilai referensi itu sendiri) Anda tidak akan mengubah nilai A . Dan sebaliknya. Jadi:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
Artinya B menunjuk ke objek lain. A masih bahagia. Jadi ulangi setelah saya: Java meneruskan semuanya berdasarkan nilai. (Oke, sekali lagi... dengan perasaan.) Java memberikan segalanya berdasarkan nilai. Untuk tipe primitif Anda meneruskan salinan nilai saat ini, untuk referensi objek Anda meneruskan salinan referensi (remote control). Anda tidak pernah melewati objek itu. Semua objek disimpan di heap. Selalu. Sekarang seduh secangkir kopi yang banyak dan tulis beberapa kode! Artikel asli .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION