在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);
}
然后为circle分配了对x = y = 0的新Circle对象的引用。但是,这种重新分配没有永久性,因为该引用是按值传递的并且不能更改。
对我来说,这看起来并不像C ++引用。它不像常规的C ++引用,因为您不能使它引用其他东西,也不像C ++的const引用,因为在Java中,可能会更改(但实际上不会)的代码不会引发编译时间错误。
这在行为上与C ++指针更相似。您可以使用它来更改指针对象的值,但是不能在函数中更改指针的值本身。同样,与C ++指针(但不包含C ++引用)一样,在Java中,您可以将“ null”作为此类参数的值。
所以我的问题是:为什么Java使用“引用”概念?是否可以理解它们与C ++引用不同?还是它们确实确实类似于C ++引用,但我缺少某些东西?