2013-03-18 12 views
0

我的意思是,當我們從該函數返回時,數組的地址與我們輸入函數之前的地址保持相同。 一個例子:Java:爲什麼在函數中改變數組的地址,當我們從函數返回時,不改變它的地址?

class sdasd { 
    public static void main(String[] args){ 
      int[] obj = new int [7]; 
      //obj has an address 
      sdasd t = new sdasd(); 
      t.func(obj); 
      //obj has the same address as before!! 
      } 
    void func(int[] obj){ 
     int[] otherObj = new int[13]; 
     obj=otherObj;`` 
     //we changed the address of the array 'obj'? 
     } 
    } 

感謝幫助

+0

您試圖更改值的值,因爲它是按值傳遞的。 – 2013-03-18 16:26:18

回答

2

在被調用函數obj中是的副本引用數組。所以,你有,只是當你進入func,有什麼可以被描述爲

main::obj --> int[7]; 
    func::obj --> int[7]; 

分配新的數組後,必須

main::obj --> int[7]; 
    func::obj --> int[13]; 

參數是按值傳遞,所以創造了他們的副本。當它是一個引用時,引用的副本指向原始對象;對參考的更改對於該方法是局部的(但對對象本身的更改由所有參考共享!)

要清楚地說明最後一點,如果您已完成,而不是分配新的參考,

void func(int[] obj) { 
    obj[1] = 69; 
} 

然後從main::obj可見變化。當你通過OBJ陣列FUNC(),它實際上創造了一個 你的陣列的複製「OBJ」,然後通過它作爲參數

1

這是因爲參考obj是按值傳遞到func。因此,在您的方法func中,您已將本地引用更改爲新數組,但main的obj仍然引用原始數組。在Java中,數組也是對象,因此數組就像普通對象一樣被聲明爲引用。

0
  • 那是因爲。

    因此,對複製的任何更改都不會影響您的原始'obj'。

相關問題