数组是引用类型,因此iArr
变量保存对数组的引用。
换句话说,当你打电话时
Arrays.sort(iArr);
您将引用(按值)传递给排序方法,该方法对数组进行排序iArr
指。
来自评论:
传递引用(按值)实际上意味着什么?
通过引用传递意味着您基本上将变量本身传递给方法。即,该方法对变量所做的任何操作都会影响外部变量。在 Java 中从来没有出现过这种情况。 (尝试实现交换方法,您就会明白我的意思。)按值传递意味着您传递的值是存储在变量。在本例中,该值是一个引用,因此它按值传递引用。
关于。第二次更新:
从你的形象来看,我认为你已经非常了解情况了,我认为这可以归结为术语。
If we 忘记 C++有一段时间,它是really简单的。您需要记住的是 (A) 当您调用method(var)
参数是任何内容的副本var
包含,并且 (B) 非原始变量的内容是引用(如果您愿意,可以是“指针”)。
请注意,在你的问题中你有
int iArr[] = {2, 1, 9, 6, 4};
这相当于
int[] iArr = new int[] { 2, 1, 9, 6, 4 };
所以一切都检查出来了:iArr
持有一个参考和new
返回一个引用。
当你调用Arrays.sort(iArr)
的内容iArr
被传递(即对数组的引用)。这仍然不是按引用传递,因为传递的是值,而不是变量本身。如果您重新分配方法内的形式参数以指向其他数组,iArr
当方法返回时仍然指向原始数组。
If we do用 C++ 的方式思考事情往往有点复杂; C++ 的引用概念略有不同。通过 C++ 参考,您实际上可以实现一个真正的swap
:
void swap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
IE。您可以传入“变量”(而不是仅传递变量的内容)。我喜欢将其视为您与所调用的方法共享变量的范围。这在 Java 中是做不到的。
因此,考虑到这一点,我想说 Java 引用更像是 C++ 指针,只不过它们受到限制,因为您不能使用*
运算符,就像在 C++ 中一样(你不能这样做*person
在Java中,尽管person
存储对应于指向人的指针的内容)并且您无法使用以下方式获取对象的地址&
操作员。而且你不能做任何指针算术。例如你不能这样做iArr + 3
到达数组的第四个元素。