2013-08-28 22 views
0

可有人請向我解釋爲什麼返回null的方法操縱最終詮釋[]?方法返回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; 
} 

輸出繼電器:

編輯:
我在返回一個陣列方法只注意到此行爲。同樣的方法返回一個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的方法不會改變輸入值,但返回一個數組的方法確實會改變輸入的原始值。

+0

我想你的意思是,如果你實際調用乘法,那就是輸出。在你提供的嚴格示例中,輸出應該是2,3。但是如果你先調用multiply,那麼你得到了你所建議的輸出 – Cruncher

+0

在你的代碼中,'myList'和'newList'引用同一個數組,所以改變一個他們也改變了另一個。 – arshajii

回答

3

這裏,final表示vals引用無法從引用其初始數組中更改。但是它沒有說明數組的內容是否可以改變。如你所見,他們可以改變。

final關鍵字將只從分配另一個陣列vals,例如阻止你

vals = anotherArray; // Disallowed; final 

孤零零return null;是無用的。應該將multiply方法聲明爲void,不返回任何內容。

+0

是的,我知道它沒用。但爲什麼返回null的方法不返回null? – domizai

+0

@domizai請發表一個這樣的例子。 – arshajii

+1

@domizai我相信你會發現'vals2' _is_'null'。 – rgettman

1

數組是在Java

「最終」關鍵字只能阻止你重新分配,而不是改變實際值可變。它的字面意思是,如果你要在你的代碼的某處寫入「in = someOtherArray」,你會得到一個編譯錯誤。

這使得它聽起來像「最終」關鍵字是沒用的,但它的作品如預期的基本類型,或任何不可變對象。

如果我有:INT I = 0;如果不向我重新分配一個值,我不能改變0。

0

雖然你看到的方法返回null,則數組的內容仍然得到乘法()方法中修改。

multiply(vals); 

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

請注意,您在打印這已經被多次修改方法瓦爾斯。 (Java的傳值)

+0

但是,如果我會使用一個int-return-method,它不會修改輸入的原始值。 array-int-return-method會修改輸入的原始值。 – domizai

+0

我只是想將數組的每個項目相乘並將其保存到一個新的數組中,而無需修改原始數組。我的意思是,我當然可以這樣做:'newArray [i] = vals [i] * 2;'但我仍然比較喜歡這種方法。 – domizai

0

所以,當我真的想用這個方法int [] newList = bubble_sort(myList);我不能修改輸入值,但節省每一個項目進入一個新的數組
int [] s = new int[a.length]; for (int i = 0; i < n ; i++)s[i] = a[i];
,然後我可以繼續在新的陣列和回報進行排序它。然後原始數組(myList)不會受到影響。