返回null的方法是操作最终的int数组

时间:2013-08-28 21:14:30

标签: java arrays methods null return

任何人都可以向我解释为什么返回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的方法不会改变输入值,但返回数组的方法确实会改变输入的原始值。

4 个答案:

答案 0 :(得分:3)

此处,final表示vals引用无法更改引用其初始数组。但它没有说明是否可以更改数组的内容。如你所见,它们可以改变。

final关键字只会阻止您将另一个数组分配给vals,例如

vals = anotherArray;  // Disallowed; final

孤独的return null;是没用的。 multiply方法应该已声明为void,不返回任何内容。

答案 1 :(得分:1)

数组中的数组是可变的

“final”关键字只会阻止您重新分配,而不会阻止您更改实际值。它的字面意思是,如果你在代码中的某处写“in = someOtherArray”,你就会遇到编译错误。

这使得它听起来像“final”关键字是无用的,但它可以像原始类型或任何不可变对象一样工作。

如果我有:int i = 0;如果不将值重新分配给i,我无法更改0。

答案 2 :(得分:0)

虽然您看到该方法返回null,但数组内容仍在multiply()方法中被修改。

multiply(vals);

for(int i:vals)System.out.println(i);

请注意,您正在打印已通过multiply方法修改的val。 (Java Pass by value)

答案 3 :(得分:0)

因此,当我真的想要使用这种方法int [] newList = bubble_sort(myList);时,我不能修改输入值,而是将每个项目保存到一个新阵列中int [] s = new int[a.length]; for (int i = 0; i < n ; i++)s[i] = a[i];
然后我可以继续对新数组进行排序并返回它。然后原始数组(myList)不会受到影响。