2009-12-16 18 views

回答

26

由於自動裝箱。 5不是一個對象,所以它被包裝成一個對象(在這種情況下爲Integer),並且IntegerNumber

+1

爲了驗證這個自己剛剛添加的System.out.println(n.getClass()的getName()); – Buhb 2009-12-16 16:26:54

+0

問題主要是關於抽象類。 – whiskeysierra 2009-12-17 03:36:22

+1

不,它是關於「數字n = 5怎麼樣」;如果「數字」是抽象的,則工作?「請參閱上面的說明。 :) – Bombe 2009-12-17 06:56:14

4

從根本上說,這是因爲Number是一個抽象類 - 有沒有對應於Number(5),即使有,你仍然不能夠直接實例化類,因爲它是抽象的構造。

正如Bombe解釋的那樣,在第二種情況下,您確實創建了一個Integer對象* - 作爲Number的一個子類,可以將其指定給這樣一個變量。因爲它是一個具體的類,你可以實例化它。 *儘管在實踐中它實際上更相當於Integer.valueOf(5),它在Sun JRE上不會創建額外的Integer對象,但會使用合併版本(如享元模式)。

+0

爲什麼它必須是一個靜態類? – 2009-12-16 19:33:27

+0

+1你的回答比Bombe的好,他甚至在他的回答中甚至沒有使用抽象這個詞,這就是問題的關鍵 – whiskeysierra 2009-12-17 03:35:02

+0

@Carlos - 我的意思是*具體*類,而不是靜態的;我修復了這個錯字(「thinko」?),謝謝指出。 AFAIK本身沒有靜態類(忽略靜態內部類,這是一個單獨的東西)。 – 2009-12-17 13:47:52

-2

它不應該。自動裝箱是一個很大的錯誤。

+4

我不得不不同意。 int是錯誤的。 語言會更簡單一切都被定義爲一個Integer(或Long或Number的任何子類)。然後讓編譯器將其優化爲一個int(或任何基元)。當然,它必須以合理的方式處理== 。 – MrJacqes 2009-12-16 21:48:55

3

它類似於下面將如何工作:

List bob = new ArrayList(); 

List是一個接口,所以您不能直接對其進行實例化。但是,您可以聲明List類型的變量,然後爲其分配一個實現該接口的具體對象。沿着同樣的路線,您可以聲明一個Number類型的變量,然後爲其分配任何值對象,該對象是該類型的具體實例。你所用的功能代碼,對於所有意圖和目的(由於自動裝箱)完成:

Number n = new Integer(5); 
相關問題