2008-09-19 17 views

回答

26

Java確實有指針 - 你不能執行指針運算的指針。

從古老的JLS

有兩種類型的Java編程語言:基本類型(4.2節)和引用類型(第4.3節)。相應地,有兩種數據值可以存儲在變量中,作爲參數傳遞,通過方法返回,並對原始值(§4.2)和參考值(§4.3)進行操作。

而且later

一種對象類實例陣列

參考值(通常僅引用)是指針到這些目的,和一個特殊的空引用,這是指沒有對象。

(強調他們)

所以,要解釋,如果你寫:

Object myObj = new Object(); 

然後myObj引用類型含有參考值這本身就是一個指針到新創建的Object

因此如果設置myObjnull您在基準值(又名指針)設置爲null。因此,當該變量被解引用時,NullPointerException被合理地拋出。

別擔心:此話題已被heartily debated之前。

1

我想這與JVM是用C++編碼的事實有關。除此之外,指針和引用幾乎是相似的。您可以說Java中的引用機制是使用C++指針實現的,名稱爲'NullPointerException'允許實現細節通過。

0

這是由於Java設計時考慮到了C程序員。在C terminoligy中,使用'pointer'這個詞來代替'reference'

+0

是的,但Java使用參考:p – hhafez 2010-04-08 03:13:55

3

在Java中,他們使用命名參考來引用動態創建的對象。在以前的語言中,它被命名爲POINTER。就像面嚮對象語言中的METHODS的命名已經從之前的FUNCTION和PROCEDURE的(面向對象的而不是面向對象的)語言中接管了。在這個命名或新標準中沒有特別的更好或更糟的是,它只是另一種能夠創建以前的動態對象,掛在空中(堆空間)並被固定對象引用引用的現象的方式(或懸掛在空中的動態參考)。新標準(使用METHODS和REFERENCES)的作者特別提到新標準的實施是爲了使其與即將到來的規劃系統(例如UML和UP)相一致,其中使用面向對象的術語規定使用ATTRIBUTES,方法和參考文獻,而不是變量,函數和指針。

現在你可能會想,現在它只是一種重命名,但這將簡化過程的描述,而不僅僅是語言以發展爲名所走的漫長道路。一種方法在性質上與程序有所不同,因爲它在一個類的範圍內運作,而程序本質上在全球範圍內運作。類似地,屬性不僅僅是變量的新名稱,因爲屬性是類(及其實例 - 對象)的屬性。同樣,引用是這個小寫作背後的問題,它的不同之處在於它是鍵入的,因此它沒有指針的典型屬性,是對存儲單元的原始引用,因此引用是對基於內存的對象。

現在,在Java內部,即在Java的胃中,底層C代碼和Java代碼(虛擬機)之間存在仲裁層。在該仲裁層中,抽象發生在如虛擬機完成的引用的基礎(裸機)實現中,從而保護引用不引用裸機(沒有結構的存儲單元)。原因是,NullPointerException是一個真正的空指針異常,而不僅僅是一個空引用異常。然而,這個事實對於Java環境中的程序員來說可能是完全不相關的,因爲他/她在任何時候都不會與裸機JVM聯繫。

1

我認爲答案是我們永遠不會真正知道真正的答案。

我懷疑在Java 1.0發佈之前的一段時間,有人定義了一個名爲NullPointerException的類。要麼這個人的名字錯了,要麼術語不穩定;即沒有做出使用術語「參考」而不是「指針」的決定。

無論哪種方式,很可能沒有人注意到不矛盾不能修復,而不會破壞向後兼容性。如果你看起來很辛苦,還有其他一些小的不一致之處。還有一些更嚴重的問題由於相同的原因而無法解決。

但這只是猜想。

+0

爲什麼隨機向下投票? – 2011-06-03 13:17:36

相關問題