我们可以在java中使用pass by reference吗?如果否如何java.util.Arrays.sort工作?

Jis*_*hap 4 java pass-by-reference pass-by-value

我曾经认为Java支持传递值和passby参考,但我遇到了许多讨论,如

  1. Java总是按值传递,没有例外.
  2. Java始终是按值传递的
  3. Java总是按值而不是通过引用传递参数.
  4. Java按值传递引用.因此,您无法更改传入的引用.

如果java只支持按值传递
怎么做java.util.Array.sort()Collections.sort(unsortList)有效?

int iArr[] = {2, 1, 9, 6, 4};// sorting array

Arrays.sort(iArr);    

System.out.println("The sorted int array is:");
for (int number : iArr) {
    System.out.println("Number = " + number);
}
Run Code Online (Sandbox Code Playgroud)

更新: 传递引用的内容(按值)实际上是什么意思?它与通过C或C++中的数组的引用行为有什么不同?

更新: 如果我错了,请纠正我.在C中,我们在通过引用传递时传递变量的地址.在Java中,我们将引用传递给对象(或值).只要方法中的变量指向Object,对象的值就会随着变量而变化.调用的方法. Java Pass通过引用传递 没有Object或reference的副本!我只能看到2个不同的变量指向同一个Object,而不是通过引用传递.在C++中的类似传递引用两个不同的变量指向同一个地址.

aio*_*obe 12

数组是引用类型,因此iArr变量包含对数组的引用.

换句话说,当你打电话

Arrays.sort(iArr);
Run Code Online (Sandbox Code Playgroud)

您将引用(按值)传递给sort方法,该方法对iArr引用的数组进行排序.


来自评论:

通过引用(按值)实际意味着什么?

通过引用传递的是您基本上将变量本身传递给方法.即,该方法对变量的影响会影响外部的变量.Java中绝不是这种情况.(尝试实现交换方法,你会看到我的意思.)按值传递意味着你传递存储在变量的值.在这种情况下,值是引用,因此它通过值传递引用.


回覆.第二次更新:

从你的形象来看,我认为你已经很好地理解了这种情况,我认为这可以归结为术语.

如果我们暂时忘记C++,那真的很简单.您需要记住的是(A)当您调用method(var)参数时,var包含的内容的副本,以及(B)非原始变量的内容是引用(如果您愿意,则为"指针").

请注意,在您提出的问题中

int iArr[] = {2, 1, 9, 6, 4};
Run Code Online (Sandbox Code Playgroud)

这相当于

int[] iArr = new int[] { 2, 1, 9, 6, 4 };
Run Code Online (Sandbox Code Playgroud)

所以它全部检出:iArr持有一个引用并new返回一个引用.

当您调用传递Arrays.sort(iArr)的内容时iArr(即对数组的引用).这仍然不是通过引用传递,因为值是传递的,而不是变量本身.如果将方法内的形式参数重新指定为指向其他数组,iArr则在方法返回时仍将指向原始数组.

如果我们认为在C++方面的东西往往更复杂一点; C++的参考概念略有不同.使用C++引用,您实际上可以实现一个真实的swap:

void swap(int &x, int &y)
{
   int temp = x;
   x = y;
   y = temp;
}
Run Code Online (Sandbox Code Playgroud)

即你可以传入"变量"(而不仅仅是变量的内容).我喜欢这样想,因为你正在用你正在调用的方法分享变量的范围.这不能用Java完成.

因此,考虑到这一点,我会说Java引用更像是C++指针,除了它们是有限的,*因为你不能在C++中使用运算符取消引用(你不能*person用Java 做,甚至虽然person存储了与指向某个人的指针相对应的内容,但您无法使用&运算符获取对象的地址.你也不能做任何指针算术.例如,您无法访问iArr + 3数组的第四个元素.

  • 什么*通过引用传递*意味着你基本上将*变量*传递给方法.即,该方法对变量的影响会影响外部的变量.在Java中不是这种情况.(尝试实现`swap`方法,你会明白我的意思.)按值传递意味着你传递*存储在变量中的*值.在这种情况下,值是引用,因此它通过值传递引用. (3认同)