在下面的代码中,为什么arr2 [0]仍然等于1.5,即使在method2中更改了原始数组?忽略其他数组和变量。
public class Problem3
{
public static int method1(int[] array)
{
array[0] += 10;
return array[0];
}
public static int method2(int aNum, String aStr,
int[] array1, float[] array2, int[] array3)
{
float[] fNums = {1.5F, 2.5F};
array2 = fNums;
return 10 + method1(array3);
}
public static void main(String[] args)
{
int num = 1000;
String aStr = "Hello!";
int[] arr1 = {1, 2, 3};
float[] arr2 = {0.5F, 1.5F};
int[] arr3 = {5, 6, 7};
int retNum = method2(num, aStr, arr1, arr2, arr3);
System.out.println(arr2[0]);
}
}
答案 0 :(得分:2)
因为您更改了对整个数组的引用,并且没有修改传入的数组。
当你调用method2时,参数指向外部创建的数组。在method2中,您将参数指向一个新数组。这不会改变调用方法中的变量指向的数组,它仍然指向原始数组。
如果您只修改了在method2中给出的现有数组,那么您将在调用方法中看到这些更改。
答案 1 :(得分:2)
基本上,因为array2
不是arr2
,但是在调用method2
时它们引用内存中的相同数组:
method2(num, aStr, arr1, arr2, arr3);
public static int method2(int aNum, String aStr, int[] array1, float[] array2, int[] array3)
然后,你使array2
引用fNums
引用的新数组,并且你没有更改arr2
引用的数组:
float[] fNums = {1.5F, 2.5F};
array2 = fNums;
有关详细信息,请参阅此answer。
答案 2 :(得分:-1)
我相信Java使用pass-by-value参数传递语义。通过在PSVM()中声明float[] arr2
,其范围仅限于那里,如果将数组传递给另一个函数,它将按值传递。
另一方面,如果您在PSVM()之外声明了float[] arr2
(但在类定义中),那么它的范围在类中是全局的。但是,我仍然认为您的代码不起作用,因为IIRC,您无法像method2()
中的代码那样使用单个赋值分配整个数组的值。