有人能向我解释一下为什么一个返回null的方法正在操作最终的int[]吗?
final int [] vals = {2,3};
int [] vals2 = multiply(vals);
for(int i : vals) System.out.println(i);
int [] multiply(int [] in){
for(int i = 0; i < in.length;i++){
in[i] *= 2;
}
return null;
}
输出:
4
6
编辑:
我只在返回数组的方法中注意到了这种行为。返回int的相同方法不会更改原始整数值。。。
完整代码:
public class Main{
public Main(){
int [] myList = {56, 32, 200};
int [] newList = myList;
bubble_sort(newList);
for(int i : myList){ System.out.println(i); }
System.out.println();
for(int i : newList){ System.out.println(i); }
}
public int [] bubble_sort(int a[]){
int n = a.length;
int [] s = a;
for (int i = 0; i < n ; i++){
for (int j = n - 1; j >= (i+1); j--){
if (s[j - 1] > s[j]){
int t = s[j - 1];
s[j - 1] = s[j];
s[j] = t;
}
}
}
return null;
// return s;
}
public static void main(String [] args){
new Main();
}
}
编辑:
以下代码按预期生成以下输出:2,4
int vals = 2;
int vals2 = multiply(vals);
System.out.println(vals);
System.out.println(vals2);
int multiply(int in){ return in*2; }
所以我的问题是,为什么一个返回int的方法不会改变输入值,而一个返回数组的方法会改变输入的原始值。
这里,final
表示vals
引用不能从引用其初始数组更改。但它没有说明数组的内容是否可以更改。正如你所看到的,它们是可以改变的。
final
关键字只会阻止您将另一个数组分配给vals
,例如
vals = anotherArray; // Disallowed; final
单独的return null;
是无用的。multiply
方法本应声明为void
,但不返回任何内容。
数组在java 中是可变的
"final"关键字只是阻止重新分配,而不是更改实际值。它的字面意思是,如果你在代码的某个地方写"in=someOtherArray",你会得到一个编译错误。
这听起来像"final"关键字是无用的,但它对基元类型或任何不可变对象都能正常工作。
如果我有:int I=0;如果不将值重新分配给I,我无法更改0。
尽管您看到方法返回null,但数组内容仍在multiply()方法中被修改。
multiply(vals);
对于(int i:vals)System.out.println(i);
请注意,您正在打印已通过乘法方法修改的vals。(Java传递值)
所以当我真的想使用这个方法int [] newList = bubble_sort(myList);
时,我不能修改输入值,而是将每个项保存到一个新数组中int [] s = new int[a.length]; for (int i = 0; i < n ; i++)s[i] = a[i];
,然后我可以继续对新数组进行排序并返回它。这样原始数组(myList)就不会受到影响。