ใน C ++ อาร์กิวเมนต์การอ้างอิงไปยังฟังก์ชันอนุญาตให้ฟังก์ชันทำการอ้างอิงถึงสิ่งอื่น:
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;
}
อะนาล็อกอาร์กิวเมนต์อ้างอิงคงที่ไปยังฟังก์ชันจะแสดงข้อผิดพลาดเวลารวบรวมถ้าเราพยายามเปลี่ยนการอ้างอิง:
void changeNumberReference(const int& reference) {
reference = replacement; // compile-time error: assignment of read-only reference 'reference'
}
ตอนนี้ด้วย Java เอกสารบอกว่าฟังก์ชั่นข้อโต้แย้งของประเภทที่ไม่ใช่ดั้งเดิมคือการอ้างอิง ตัวอย่างจากเอกสารอย่างเป็นทางการ:
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);
}
จากนั้นวงกลมจะได้รับการอ้างอิงไปยังวัตถุวงกลมใหม่ที่มี x = y = 0 การมอบหมายใหม่นี้ไม่มีความคงทนอย่างไรก็ตามเนื่องจากการอ้างอิงถูกส่งผ่านโดยค่าและไม่สามารถเปลี่ยนแปลงได้
สำหรับฉันแล้วนี่ไม่ได้ดูการอ้างอิง C ++ เหมือนกันทั้งหมด มันไม่เหมือนกับการอ้างอิง C ++ ปกติเพราะคุณไม่สามารถอ้างถึงอย่างอื่นได้และไม่เหมือนกับการอ้างอิง C ++ const เพราะใน Java โค้ดที่จะเปลี่ยน (แต่จริงๆแล้วไม่ได้) การอ้างอิงนั้นไม่ได้รวบรวมคอมไพล์ ข้อผิดพลาดครั้ง
สิ่งนี้คล้ายกับพฤติกรรมของพอยน์เตอร์ C ++ คุณสามารถใช้มันเพื่อเปลี่ยนค่าของวัตถุที่มีปลายแหลม แต่คุณไม่สามารถเปลี่ยนค่าของตัวชี้ในฟังก์ชั่นได้ เช่นเดียวกับพอยน์เตอร์ C ++ (แต่ไม่ใช่กับการอ้างอิง C ++) ใน Java คุณสามารถส่งผ่าน "null" เป็นค่าสำหรับอาร์กิวเมนต์
ดังนั้นคำถามของฉันคือ: ทำไม Java ใช้ความคิดของ "อ้างอิง"? เป็นที่เข้าใจกันหรือไม่ว่าพวกเขาไม่คล้ายกับการอ้างอิง C ++? หรือว่าพวกเขาคล้ายกับการอ้างอิง C ++ จริง ๆ และฉันขาดอะไรไป