Trong C ++, một đối số tham chiếu đến một hàm cho phép hàm tạo tham chiếu tham chiếu đến một thứ khá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;
}
Tương tự, một đối số tham chiếu không đổi cho một hàm sẽ đưa ra lỗi thời gian biên dịch nếu chúng ta cố gắng thay đổi tham chiếu:
void changeNumberReference(const int& reference) {
reference = replacement; // compile-time error: assignment of read-only reference 'reference'
}
Bây giờ, với Java, các tài liệu nói rằng các đối số hàm của các kiểu không nguyên thủy là các tham chiếu. Ví dụ từ các tài liệu chính thức:
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);
}
Sau đó, vòng tròn được gán một tham chiếu đến một đối tượng Circle mới với x = y = 0. Việc gán lại này không có tính lâu dài, tuy nhiên, vì tham chiếu được truyền theo giá trị và không thể thay đổi.
Đối với tôi điều này không giống như tất cả các tài liệu tham khảo C ++. Nó không giống với các tham chiếu C ++ thông thường vì bạn không thể làm cho nó tham chiếu đến một cái gì đó khác và nó không giống với các tham chiếu const C ++ bởi vì trong Java, mã sẽ thay đổi (nhưng thực sự không) tham chiếu không ném biên dịch lỗi thời gian.
Điều này tương tự nhiều hơn trong hành vi với con trỏ C ++. Bạn có thể sử dụng nó để thay đổi các giá trị đối tượng nhọn, nhưng bạn không thể thay đổi chính giá trị của con trỏ trong một hàm. Ngoài ra, như với các con trỏ C ++ (nhưng không phải với các tham chiếu C ++), trong Java, bạn có thể chuyển "null" làm giá trị cho một đối số như vậy.
Vì vậy, câu hỏi của tôi là: Tại sao Java sử dụng khái niệm "tham chiếu"? Có phải được hiểu rằng chúng không giống với tài liệu tham khảo C ++? Hay chúng thực sự giống với tài liệu tham khảo C ++ và tôi đang thiếu một cái gì đó?