gpt4 book ai didi

java - 代码未按预期工作;数组加倍;通过引用传递

转载 作者:行者123 更新时间:2023-12-02 09:28:47 26 4
gpt4 key购买 nike

当我遇到一个必须将数组加倍的问题时,我正在处理堆栈。我使用了这段代码,它不起作用,但它应该起作用。

class ArrayDouble
{
public static void main(String []args)
{
int arr[] = new int[10];
sizeChange(arr);
for(int i=0;i<arr.length;i++)
System.out.print(arr[i]+ " ");
}
public static void sizeChange(int arr[])
{
arr[0]=1;
arr = new int[2*arr.length];
arr[1]=1;
}
}

据我所知,作为参数传递的数组中发生的任何更改,这些更改都会反射(reflect)在实际参数中,对吗?那么为什么数组大小的变化没有反射(reflect)在原始参数中呢?

此外,原数组中的 arr[0] 变为 1,但 arr[1] 仍为 0。为什么会发生这种情况?

PS:当我将 sizeChange 的返回类型更改为 int[] 并传递 sizeChange 的 arr 并将其收集到 Main arr 中时,问题就解决了。所以我不需要更正代码,我只需要知道为什么会发生这种情况的答案。

提前谢谢您。

最佳答案

数组不是 Java 中的原始类型,但它们也不是对象......”

在Java中,被调用的方法可以更新数组的内容,并且可以更新其数组引用的副本,但不能更新调用者中保存调用者数组引用的变量。因此...Java 提供的不是引用传递。

像所有 Java 对象一样,数组是按值传递的……但值是对数组的引用。因此,当您在被调用方法中将某些内容分配给数组的单元格时,您将分配给调用者看到的同一个数组对象。

这不是引用传递。真正的按引用传递涉及传递变量的地址。通过真正的引用传递,被调用的方法可以分配给它的局部变量,这会导致调用者中的变量被更新。

详细说明:
数组实际上是对象,因此传递了一个引用(引用本身是按值传递的,困惑了吗?)。简单示例:

// assuming you allocated the list
public void addItem(Integer[] list, int item) {
list[1] = item;
}

您将看到调用代码对列表的更改。但是,您无法更改引用本身,因为它是按值传递的:

// assuming you allocated the list
public void changeArray(Integer[] list) {
list = null;
}

如果您传递一个非空列表,则该方法返回时它不会为空。

关于java - 代码未按预期工作;数组加倍;通过引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58137994/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com