Dalam C ++ argumen referensi ke fungsi memungkinkan fungsi untuk membuat referensi merujuk ke sesuatu yang lain:
int replacement = 23;
void changeNumberReference(int& reference) {
reference = replacement;
}
int main() {
int i = 1;
std::cout << "i=" << i << "\n"; // i = 1;
changeNumberReference(i);
std::cout << "i=" << i << "\n"; // i = 23;
}
Secara analogi, argumen referensi konstan ke suatu fungsi akan menimbulkan kesalahan waktu kompilasi jika kami mencoba mengubah referensi:
void changeNumberReference(const int& reference) {
reference = replacement; // compile-time error: assignment of read-only reference 'reference'
}
Sekarang, dengan Java, dokumen mengatakan bahwa argumen fungsi tipe non-primitif adalah referensi. Contoh dari dokumen resmi:
public void moveCircle(Circle circle, int deltaX, int deltaY) {
// code to move origin of circle to x+deltaX, y+deltaY
circle.setX(circle.getX() + deltaX);
circle.setY(circle.getY() + deltaY);
// code to assign a new reference to circle
circle = new Circle(0, 0);
}
Kemudian lingkaran diberi referensi ke objek Lingkaran baru dengan x = y = 0. Penugasan ulang ini tidak memiliki permanen, karena referensi dilewatkan oleh nilai dan tidak dapat berubah.
Bagi saya ini sama sekali tidak seperti referensi C ++. Itu tidak menyerupai referensi C ++ biasa karena Anda tidak dapat membuatnya merujuk ke sesuatu yang lain, dan itu tidak menyerupai referensi C ++ const karena di Jawa, kode yang akan berubah (tetapi sebenarnya tidak) referensi tidak membuang kompilasi kesalahan waktu
Ini lebih mirip dalam perilaku dengan pointer C ++. Anda bisa menggunakannya untuk mengubah nilai objek runcing, tetapi Anda tidak bisa mengubah nilai pointer itu sendiri dalam suatu fungsi. Juga, seperti dengan pointer C ++ (tetapi tidak dengan referensi C ++), di Java Anda bisa memberikan "null" sebagai nilai untuk argumen seperti itu.
Jadi pertanyaan saya adalah: Mengapa Java menggunakan gagasan "referensi"? Apakah harus dipahami bahwa mereka tidak menyerupai referensi C ++? Atau apakah mereka memang sangat mirip dengan referensi C ++ dan saya kehilangan sesuatu?