2012-09-30 69 views
4

我想傳遞一個陣列,而不使用參考,而是直接與價值觀:Java數組傳遞不參考

public static void main(String[] args){ 
      int[] result = insertionSort({10,3,4,12,2}); 
    } 

    public static int[] insertionSort(int[] arr){ 
     return arr; 
    } 

但它返回了以下異常:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
Syntax error on token(s), misplaced construct(s) 
Syntax error on token ")", delete this token 

當我嘗試下面的代碼,它的工作原理,任何人都可以解釋原因嗎?

public static void main(String[] args){ 
     int[] arr = {10,3,4,12,2}; 
     int[] result = insertionSort(arr); 
    } 

    public static int[] insertionSort(int[] arr){ 
     return arr; 
    } 
+1

一個重要的注意事項:Java **從來沒有**通過引用傳遞,只有通過價值。 –

+0

你的意思是什麼,而不是通過引用的價值?因爲當我將一個數組傳遞給一個處理該數組值的方法時,原始數組的值也會發生變化。 因此,有時我需要克隆一個數組,如果我不想改變原始數組! –

+0

嘗試接收方法中的數組並初始化方法內的數組(new int [20]或類似的方法),然後將null數組傳遞給方法並在方法外部打印數組,它仍然是'null',這是因爲Java按值傳遞,而不是對象的引用。 –

回答

8

它必須是

int[] result = insertionSort(new int[]{10,3,4,12,2}); 

{10,3,4,12,2}是數組初始化的語法糖,它必須像在下面的聲明語句去 -

int[] arr = {10,3,4,12,2}; 

東西作爲以下是不允許的 -

int[] arr; // already declared here but not initialized yet 
arr = {10,3,4,12,2}; // not a declaration statement so not allowed 
+0

對於術語「語法糖」:) +1 –

1

int[] array = { a, b, ...., n }是一個速記初始化 - 你必須寫:

int[] result = insertionSort(new int[]{10,3,4,12,2}); 

以匿名方式進行初始化。

5
insertionSort({10,3,4,12,2}) 

是不是有效的Java,因爲你沒有指定你的方法調用。 JVM不知道這是什麼類型的數組。它是一個具有double值或int值的數組嗎?

你可以做的是insertionSort(new int[]{10, 3 ,4 12, 2});

1

不添加其他什麼人說。

但是我相信你應該使用new int[]{10,3,4,12,2}(和其他人一樣)和Java不允許你只使用{10,3,4,12,2}的原因是Java是強類型的。

如果你只是使用{10,3,4,12,2}就不知道數組元素的類型是什麼。他們似乎是整數,但他們可以intlongfloatdouble,等...

嗯,其實它可能推斷方法簽名的類型,並觸發一個編譯錯誤,如果它不適合,但似乎很複雜。

+0

+1指出Java不會猜測元素類型。 – moonwave99