Kode Java ini:
public class XYZ {
public static void main(){
int toyNumber = 5;
XYZ temp = new XYZ();
temp.play(toyNumber);
System.out.println("Toy number in main " + toyNumber);
}
void play(int toyNumber){
System.out.println("Toy number in play " + toyNumber);
toyNumber++;
System.out.println("Toy number in play after increement " + toyNumber);
}
}
akan mengeluarkan ini:
Nomor mainan dalam permainan 5 Nomor mainan dalam permainan setelah peningkatan 6 Nomor mainan di 5 utama
Dalam C ++ saya dapat mengirimkan toyNumber
variabel sebagai referensi lewat untuk menghindari bayangan yaitu membuat salinan variabel yang sama seperti di bawah ini:
void main(){
int toyNumber = 5;
play(toyNumber);
cout << "Toy number in main " << toyNumber << endl;
}
void play(int &toyNumber){
cout << "Toy number in play " << toyNumber << endl;
toyNumber++;
cout << "Toy number in play after increement " << toyNumber << endl;
}
dan keluaran C ++ akan menjadi ini:
Nomor mainan dalam permainan 5 Nomor mainan dalam permainan setelah peningkatan 6 Nomor mainan di 6 utama
Pertanyaan saya adalah - Apa kode yang setara di Java untuk mendapatkan output yang sama dengan kode C ++, mengingat bahwa Java adalah pass by value daripada pass by reference ?
java
pass-by-reference
Siswa
sumber
sumber
toyNumber
variabel yang dideklarasikan dalammain
metode tidak berada dalam ruang lingkup dalamplay
metode. Membayangi di C ++ dan Java hanya terjadi jika ada penumpukan cakupan. Lihat en.wikipedia.org/wiki/Variable_shadowing .Jawaban:
Anda punya beberapa pilihan. Salah satu yang paling masuk akal sangat bergantung pada apa yang Anda coba lakukan.
Pilihan 1: jadikan toyNumber variabel anggota publik di kelas
kemudian berikan referensi ke MyToy ke metode Anda.
Pilihan 2: kembalikan nilai alih-alih berikan referensi
Pilihan ini akan membutuhkan sedikit perubahan pada callsite di main sehingga terbaca
toyNumber = temp.play(toyNumber);
,.Pilihan 3: Jadikan sebagai variabel kelas atau statis
Jika dua fungsi adalah metode pada kelas yang sama atau contoh kelas, Anda dapat mengubah toyNumber menjadi variabel anggota kelas.
Pilihan 4: Buat array elemen tunggal bertipe int dan teruskan itu
Ini dianggap sebagai peretasan, tetapi terkadang digunakan untuk mengembalikan nilai dari pemanggilan kelas sebaris.
sumber
toyNumber = temp.play(toyNumber);
agar berfungsi sesuai keinginan.Java tidak dipanggil dengan referensi melainkan hanya dipanggil berdasarkan nilai
Tetapi semua variabel tipe objek sebenarnya adalah pointer.
Jadi, jika Anda menggunakan Objek yang Dapat Diubah, Anda akan melihat perilaku yang Anda inginkan
Output dari kode ini:
Anda juga dapat melihat perilaku ini di pustaka standar. Misalnya Collections.sort (); Collections.shuffle (); Metode ini tidak mengembalikan daftar baru tetapi mengubah objek argumennya.
Output dari kode ini:
sumber
play
; mismutableList[0] = mutableList[0] + 1;
. Seperti yang disarankan Ernest Friedman-Hill.private static void play(StringBuilder toyNumber)
- bagaimana Anda menyebutnya jika misalnya public static int yang mengembalikan integer? Karena saya memiliki metode yang mengembalikan angka tetapi jika saya tidak memanggilnya di suatu tempat, itu tidak digunakan.Membuat
kemudian berikan referensi ke salah satu instance darinya. Perhatikan bahwa metode yang mengubah status melalui argumennya sebaiknya dihindari, terutama dalam kode paralel.
sumber
Anda tidak bisa melewatkan primitif dengan referensi di Jawa. Semua variabel tipe objek sebenarnya adalah pointer, tentu saja, tapi kami menyebutnya "referensi", dan mereka juga selalu diteruskan oleh nilai.
Dalam situasi di mana Anda benar-benar perlu meneruskan primitif dengan referensi, yang terkadang dilakukan orang adalah mendeklarasikan parameter sebagai array tipe primitif, dan kemudian meneruskan array elemen tunggal sebagai argumen. Jadi, Anda meneruskan referensi int [1], dan dalam metode ini, Anda dapat mengubah konten array.
sumber
Untuk solusi cepat, Anda dapat menggunakan AtomicInteger atau variabel atom lainnya yang memungkinkan Anda mengubah nilai di dalam metode menggunakan metode bawaan. Berikut adalah contoh kode:
Keluaran:
sumber
sumber