C memiliki pointer dan Java memiliki apa yang disebut referensi. Mereka memiliki beberapa kesamaan dalam arti bahwa mereka semua menunjuk pada sesuatu. Saya tahu bahwa pointer di C menyimpan alamat yang mereka tuju. Apakah referensi juga menyimpan alamatnya? Bagaimana mereka berbeda kecuali bahwa pointer lebih fleksibel dan rawan kesalahan?
97
final
Referensi di Jawa hampir setara dengan referensi C ++. Alasan bahwa mereka tidak persis sama adalah, referensi C ++ juga tidak dapat dibatalkan, sedangkanfinal
referensi di Jawa adalah nullable.Jawaban:
Referensi dapat diimplementasikan dengan menyimpan alamat. Biasanya referensi Java akan diimplementasikan sebagai pointer, tetapi itu tidak diperlukan oleh spesifikasi. Mereka mungkin menggunakan lapisan tipuan tambahan untuk memungkinkan pengumpulan sampah lebih mudah. Tetapi pada akhirnya itu akan (hampir selalu) bermuara pada pointer (gaya-C) yang terlibat dalam implementasi referensi (gaya Jawa).
Anda tidak dapat melakukan aritmatika pointer dengan referensi. Perbedaan paling penting antara pointer di C dan referensi di Java adalah bahwa Anda tidak bisa benar-benar mendapatkan (dan memanipulasi) nilai yang mendasari referensi di Java. Dengan kata lain: Anda tidak dapat melakukan pointer aritmatika.
Dalam C Anda dapat menambahkan sesuatu ke pointer (yaitu alamat) atau mengurangi sesuatu untuk menunjuk ke hal-hal yang "dekat" atau arahkan ke tempat-tempat yang ada di tempat mana pun .
Di Jawa, referensi menunjuk ke satu hal dan hanya itu. Anda dapat membuat variabel memiliki referensi yang berbeda , tetapi Anda tidak bisa hanya memintanya untuk menunjuk ke "hal setelah hal yang asli".
Referensi sangat diketik. Perbedaan lainnya adalah bahwa jenis referensi jauh lebih ketat dikendalikan di Jawa daripada jenis pointer di C. Di C Anda dapat memiliki
int*
dan melemparkannya kechar*
dan hanya menafsirkan kembali memori di lokasi itu. Penafsiran ulang itu tidak berfungsi di Jawa: Anda hanya bisa menginterpretasikan objek di ujung referensi lain sebagai sesuatu yang sudah ada (yaitu Anda dapat melemparkanObject
referensi keString
referensi hanya jika objek yang ditunjuk sebenarnya aString
).Perbedaan itu membuat pointer C lebih kuat, tetapi juga lebih berbahaya. Kedua kemungkinan tersebut (pointer aritmatika dan menafsirkan kembali nilai-nilai yang ditunjukkan) menambah fleksibilitas untuk C dan merupakan sumber dari beberapa kekuatan bahasa. Tetapi mereka juga merupakan sumber masalah besar, karena jika digunakan secara tidak benar mereka dapat dengan mudah mematahkan asumsi bahwa kode Anda dibangun. Dan cukup mudah untuk menggunakannya secara salah.
sumber
memcpy
untuk memindahkan satu ke achar[]
) dan sebaliknya. Jika pointer dikonversi ke urutan angka yang disimpan di suatu tempat (mungkin ditampilkan di layar dan disalin oleh operator pada selembar kertas), semua salinan pointer di komputer dihancurkan, dan urutan angka dikonversi kembali ke pointer (mungkin setelah diketik oleh operator), pointer masih harus menunjuk ke hal yang sama seperti sebelumnya. Sebuah program yang ...Referensi C ++ berbeda lagi.
Mereka harus diinisialisasi dan tidak boleh nol (setidaknya tidak dalam program yang dibentuk dengan baik) dan tidak dapat diulang untuk merujuk ke sesuatu yang lain. referensi C ++ jauh lebih seperti alias untuk objek.
Perbedaan penting lainnya antara pointer dan referensi Java / C ++ adalah bahwa Anda dapat mengambil alamat penunjuk yang Anda tidak dapat mengakses alamat referensi (memang referensi C ++ tidak perlu benar-benar ada sebagai objek di memori sama sekali) akibatnya Anda dapat memiliki pointer ke pointer tetapi bukan referensi ke referensi
sumber
Referensi Java dan pointer C berbeda persis dalam dua poin:
char
,,int
dan sebagainya).Seseorang menulis bahwa Referensi sangat diketik, karena Anda tidak dapat memaksa kompiler untuk memperlakukan
int*
sebagai achar*
.Sepenuhnya terlepas dari kenyataan bahwa konversi tertentu sebenarnya aman , tidak ada polimorfisme dalam C, sehingga perbandingan adalah non-starter.
Tentu saja, Java lebih kuat daripada C, bukan berarti itu fitur C pointer vs Java referensi, Anda perlu menggunakan JNI untuk memecah keamanan tipe (selain mengabaikan pembatasan generik), tetapi bahkan dalam C Anda harus memaksa kompiler.
Seseorang menulis bahwa Java referensi mungkin dilaksanakan sebagai C pointer, yang saya katakan yakin, karena mereka secara ketat kurang kuat, pada mesin 32bit mereka biasanya adalah, jika JVM diimplementasikan dalam C . Meskipun pada mesin 64bit, mereka biasanya dikompresi pointer-objek biasa ("OOP terkompresi") untuk menghemat ruang dan bandwidth.
Pokoknya, pointer C tersebut juga tidak harus setara dengan alamat perangkat keras, bahkan jika biasanya (> 99% implementasi) adalah untuk alasan kinerja.
Akhirnya, itu adalah detail implementasi yang tidak terpapar ke programmer.
sumber
Mereka sedikit berbeda. Di Jawa, salinan referensi disalin ke tumpukan fungsi yang dipanggil, menunjuk ke objek yang sama dengan fungsi panggilan dan memungkinkan Anda untuk memanipulasi objek itu. Namun Anda tidak dapat mengubah objek yang mengacu pada fungsi panggilan.
Pertimbangkan kode java berikut
Sekarang pertimbangkan sebuah pointer di c ++:
sumber