2009-12-14 55 views
2

我以爲我在java中很有經驗,但事實似乎並非如此,昨天我剛剛注意到了一些我以前用過的東西,但從未真正意識到它做了什麼。我GOOGLE了,但沒有找到我的問題的答案。在java中做指針實際上是否存在?

如果我宣佈一個int數組,並使用數組的靜態排序功能進行排序我的數組,我只需要鍵入

Arrays.sort(numbers); 

而不是

numbers = Array.sort(numbers); 

這看起來很容易用C和C++,因爲你可以在那裏使用指針。所以我想知道的是,這是如何完成的?這是太陽優勢嗎,還是我在這裏完全沒有意義?

回答

5

首先,這屬於StackOverflow。第二,你想讀Java is Pass-by-Value, Dammit!

+0

這並不能回答這個問題! – 2009-12-14 13:13:54

+5

其實它確實如此。 'sort()'得到數組引用的副本。它可以根據需要重新排列陣列的*內容*(即狀態)。它*不能*創建一個新的,並將其分配給您通過的。但這不是這裏發生的事情。 – Joey 2009-12-14 13:18:29

+0

它的確如此,但是一個更簡單的解釋是「對對象的引用被傳遞給'sort'函數,引用是被複制還是通過引用傳遞對於這個問題是無關緊要的,重要的是該函數看到的是對原始對象的引用,而不是對象的副本 – jalf 2009-12-14 14:13:33

2

我假設numbers是一個int數組,並且Java中的所有數組都是對象。因此,sort通過對numbers的引用,並且可以將它們排序。

2

此問題應該遷移到堆棧溢出。 Java有一個NullPointerException類的事實應該給你一個關於Java是否使用指針來拋出場景的強烈暗示。

+1

是的,但是'NullPointerException'實際上有一個錯誤的名稱 - 如果它是類似'NullReferenceException'或'IllegalNullDereferenceException'或類似的東西,會更好。不一定必須由後臺的指針來實現 – Jesper 2009-12-14 15:50:36

+0

我同意Sun的命名不一致。但是,如果沒有引用內存地址的變量(例如指針)的概念,你很難實現Java, under the hood。 – 2009-12-14 16:34:16

7

指針存在於java中 - 所有非基本變量都是java中的指針,也就是引用。

THey不支持與C tho中的指針相同的操作集 - 它們對於該語言的用戶來說本質上是不透明的。

原因作品是因爲array是一個「指針」,這允許功能sort()訪問存儲器位置,所述array變量指向。

現在,爲什麼不:如果

void swap (Integer a, Integer b) { 
    Integer tmp = a; 
    a = b; 
    b = tmp; 
} 

工作你做

Integer x = 1; 
Integer y = 2; 
swap(x,y); 

它因爲Java按值傳遞(這是從不同的指針概念)。指向1的指針給予swap(),而不是作爲變量x(它是存儲器地址或指針)的值。因此,操縱swap()中的參數不會影響變量x

+0

http://javadude.com/articles/passbyvalue.htm在joschi的答案是一個偉大的文章閱讀這個話題 – Chii 2009-12-14 14:22:57

4

它就地排列數組。

sort方法接收對number數組(它是一個對象)的引用,並更改數組內的值!沒有新的數組對象被創建,因此將它傳遞給sort函數就足夠了。

 

PS:所有Java源代碼是開放的,你可以去閱讀sort功能自己的來源。你會看到,沒有魔法。如果Java在您的系統上正確安裝,那麼Java主文件夾中應該有一個src.zip

+0

注意數組總是對象,甚至是基本類型的數組也是有用的。例如:void increaseInt(int value)不起作用,原始的int不能被方法內部的任何東西改變。 – 2009-12-14 14:57:51

+0

@adriaan添加了parens。 – akuhn 2009-12-14 15:28:32

相關問題