为什么 Java 在这里表现得不像 "Pass-By-Value"?
Why isn't Java acting like "Pass-By-Value" here?
下面main的输出是
[5,4,3,2,1]
[1,2,3,4,5]
这对我来说毫无意义。是的,我第一次运行 "reverseArrayIteratively",我肯定期待 [5,4,3,2,1] 所以这是正确的输出,但是在第二个函数(reverseArrayRecursively)之后,我期待它也return [5,4,3,2,1] 因为 Java 本来应该是 "pass by value" 所以我没想到 "reverseArrayIteratively" 实际上会改变周围的值我的整数数组。我认为无论我多少次调用 reverseArrayIteratively 或 reverseArrayRecursively,main 中的 myIntArray 都会保持 [1,2,3,4,5]。这里发生了什么?
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] myIntArray = {1,2,3,4,5};
System.out.println(Arrays.toString(reverseArrayIteratively(myIntArray, 0, myIntArray.length-1)));
System.out.println(Arrays.toString(reverseArrayRecursively(myIntArray, 0, myIntArray.length-1)));
}
public static int[] reverseArrayIteratively(int[] array, int first, int end) {
while (first < end) {
int temp = array[end];
array[end] = array[first];
array[first] = temp;
first++;
end--;
}
return array;
}
public static int[] reverseArrayRecursively(int[] array, int first, int end) {
int temp = array[end];
array[end] = array[first];
array[first] = temp;
first++;
end--;
if (first < end) {
reverseArrayRecursively(array, first, end);
}
else {
return array;
}
return array;
}
它表现为按值传递。我认为,您的困惑源于非原始参数的含义(数组是对象,而不是原始参数)。对于对象参数,按值传递的始终是对象的 reference。在您的递归方法中,您正在修改数组参数的元素,因此它当然会在调用代码中更改数组元素。
如果您有 C++ 背景,请将 Java 引用视为 C++ 指针,而不是 C++ 引用。
下面main的输出是 [5,4,3,2,1] [1,2,3,4,5]
这对我来说毫无意义。是的,我第一次运行 "reverseArrayIteratively",我肯定期待 [5,4,3,2,1] 所以这是正确的输出,但是在第二个函数(reverseArrayRecursively)之后,我期待它也return [5,4,3,2,1] 因为 Java 本来应该是 "pass by value" 所以我没想到 "reverseArrayIteratively" 实际上会改变周围的值我的整数数组。我认为无论我多少次调用 reverseArrayIteratively 或 reverseArrayRecursively,main 中的 myIntArray 都会保持 [1,2,3,4,5]。这里发生了什么?
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] myIntArray = {1,2,3,4,5};
System.out.println(Arrays.toString(reverseArrayIteratively(myIntArray, 0, myIntArray.length-1)));
System.out.println(Arrays.toString(reverseArrayRecursively(myIntArray, 0, myIntArray.length-1)));
}
public static int[] reverseArrayIteratively(int[] array, int first, int end) {
while (first < end) {
int temp = array[end];
array[end] = array[first];
array[first] = temp;
first++;
end--;
}
return array;
}
public static int[] reverseArrayRecursively(int[] array, int first, int end) {
int temp = array[end];
array[end] = array[first];
array[first] = temp;
first++;
end--;
if (first < end) {
reverseArrayRecursively(array, first, end);
}
else {
return array;
}
return array;
}
它表现为按值传递。我认为,您的困惑源于非原始参数的含义(数组是对象,而不是原始参数)。对于对象参数,按值传递的始终是对象的 reference。在您的递归方法中,您正在修改数组参数的元素,因此它当然会在调用代码中更改数组元素。
如果您有 C++ 背景,请将 Java 引用视为 C++ 指针,而不是 C++ 引用。