0

谁能向我解释为什么返回 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

4 回答 4

3

这里,final意味着vals引用不能从引用其初始数组改变。但它没有说明数组的内容是否可以更改。如您所见,它们可以更改。

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

vals = anotherArray;  // Disallowed; final

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

于 2013-08-28T21:17:00.610 回答
1

数组在java中是可变的

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

这使得“final”关键字听起来毫无用处,但它对原始类型或任何不可变对象都按预期工作。

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

于 2013-08-28T21:17:07.943 回答
0

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

于 2013-08-29T07:19:15.303 回答
0

尽管您看到该方法返回 null,但数组内容仍在 multiply() 方法中进行修改。

multiply(vals);

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

请注意,您正在打印已被乘法修改的 vals。(Java 传值)

于 2013-08-28T21:30:33.797 回答