2013-03-03 54 views
1

我正在從C++轉移到Java,並且我有一個問題,就是在Java中,數組持續在創建它的方法之外。看看下面這段簡單的代碼:Java:作爲參考類型的數組,在方法

public static int[] arrayMethod(){ 
    int[] tempArray = {1, 2, 3, 4}; 
    return tempArray; 
} 

public static void main(String[] args){ 
    int arr[] = arrayMethod(); 
    for(int i : arr){ 
     System.out.println(i); 
    } 
} 

在C++中,除非數組是動態與new運營商分配,數組不會調用之後,因爲它是在方法本地創建的存在。據我瞭解,Java總是按值傳遞,而數組是引用類型,所以我的C++邏輯會告訴我,我正在返回一個對本地創建數組的引用。我錯過了什麼?

+2

垃圾收集。 – Pubby 2013-03-03 07:21:56

回答

3

也許這會幫助你理解。

在Java中,這樣的:

int[] tempArray = {1, 2, 3, 4}; 

意味着完全相同同樣的事情,這樣的:

int[] tempArray = new int[]{1, 2, 3, 4}; 

有一個在第一形式的隱含new

在Java中,所有數組都是堆對象/引用。當數組傳遞給方法時,它的處理方式與處理任何引用的方式相同;即參考值是按值傳遞的。 (不,這不是「通過引用引用」或「通過引用傳遞」,因爲這些術語被正確理解)。

+1

啊!謝謝。我已經明白Java嚴格按照價值傳遞,我不知道數組是堆對象。 Java中的所有對象都存儲在堆中嗎? – naxchange 2013-03-03 07:36:09

+2

@naxchange - 所有Java對象類型都是引用類型,引用類型的所有實例都存儲在堆中。 – 2013-03-03 07:45:17

+0

@naxchange:Java中的所有對象都是動態分配的並存儲在堆中。你知道這一點是因爲在Java中沒有「對象類型」,所以你不能有一個變量的值是「對象」。所有對象都必須通過指向它們的引用進行操作。 – newacct 2013-03-03 21:27:18

1

由於您正在返回您然後分配給int arr []的數組的引用,該數組仍然有指向它的內容。所以垃圾收集器不會剔除它,因爲它仍然有一個參考。

一個局部變量,但是然後你將它返回給你的main方法並賦值給它一個變量,所以數組持續存在。

1

對數組的引用是按值傳遞的。所以你有兩個參考。您將按值返回對數組的引用。所以只要引用指向數組,你可以改變(應用一些操作)到數組。

現在,如果您有2個引用指向通過任一引用的相同數組更改數組將會更改相同的數組。但是,如果在某些時候改變參考值(即改變參考點所在的陣列),那麼這兩個參考將指向不同的陣列。

重要的一點是,這裏的引用是按值返回的。不是數組返回它的指針。總之你是對的。我實際上對C++有一點了解。

這就好像有一個電視機有2個遙控器。但是,如果您將一臺遙控器更改爲指向其他電視機,則第一臺遙控器仍然可以訪問舊電視機。