Number n = new Number(5)
是非法的,但Number n = 5
不是。爲什麼?如果類號是抽象的,爲什麼我可以寫數字n = 5?
回答
由於自動裝箱。 5
不是一個對象,所以它被包裝成一個對象(在這種情況下爲Integer
),並且Integer
是Number
。
從根本上說,這是因爲Number
是一個抽象類 - 有是沒有對應於Number(5)
,即使有,你仍然不能夠直接實例化類,因爲它是抽象的構造。
正如Bombe解釋的那樣,在第二種情況下,您確實創建了一個Integer
對象* - 作爲Number
的一個子類,可以將其指定給這樣一個變量。因爲它是一個具體的類,你可以實例化它。 *儘管在實踐中它實際上更相當於Integer.valueOf(5)
,它在Sun JRE上不會創建額外的Integer對象,但會使用合併版本(如享元模式)。
爲什麼它必須是一個靜態類? – 2009-12-16 19:33:27
+1你的回答比Bombe的好,他甚至在他的回答中甚至沒有使用抽象這個詞,這就是問題的關鍵 – whiskeysierra 2009-12-17 03:35:02
@Carlos - 我的意思是*具體*類,而不是靜態的;我修復了這個錯字(「thinko」?),謝謝指出。 AFAIK本身沒有靜態類(忽略靜態內部類,這是一個單獨的東西)。 – 2009-12-17 13:47:52
它不應該。自動裝箱是一個很大的錯誤。
我不得不不同意。 int是錯誤的。 語言會更簡單一切都被定義爲一個Integer(或Long或Number的任何子類)。然後讓編譯器將其優化爲一個int(或任何基元)。當然,它必須以合理的方式處理== 。 – MrJacqes 2009-12-16 21:48:55
它類似於下面將如何工作:
List bob = new ArrayList();
List是一個接口,所以您不能直接對其進行實例化。但是,您可以聲明List類型的變量,然後爲其分配一個實現該接口的具體對象。沿着同樣的路線,您可以聲明一個Number類型的變量,然後爲其分配任何值對象,該對象是該類型的具體實例。你所用的功能代碼,對於所有意圖和目的(由於自動裝箱)完成:
Number n = new Integer(5);
- 1. 爲什麼我可以抽象重寫一個抽象方法?
- 2. 在iOS上,爲什麼UIGestureRecognizer可以實例化,如果它是抽象類?
- 3. 爲什麼我可以實例化這個抽象類?
- 4. 爲什麼我的子類被認爲是一個抽象類?
- 5. 爲什麼HttpServletRequestWrapper類不是抽象的
- 6. 什麼是抽象類型?
- 7. 爲什麼我的派生類是一個抽象類? C++
- 8. 爲什麼ClassLoader是一個抽象類?
- 9. 這是爲什麼抽象類在PHP
- 10. 即使沒有抽象方法,類也可以抽象嗎?如果是的話有什麼用?
- 11. 爲什麼重寫已經實現的抽象類型是不可能的?
- 12. 爲什麼XmlDictionaryWriter.CreateBinaryWriter可以返回抽象類的實例?
- 13. 什麼是抽象數據類型(ADT)?
- 14. 爲什麼你需要知道抽象類的抽象方法是否抽象
- 15. 抽象類中字段的可訪問性應該是什麼?
- 16. 爲什麼我們需要抽象類而不是虛擬類?
- 17. 「抽象類沒有參數」:爲什麼?
- 18. 什麼是允許我實現抽象類的關鍵字
- 19. 爲什麼你可以投到一個抽象類
- 20. 什麼是在PHP中的抽象類?
- 21. 如果無法創建抽象類的新對象,抽象類中的非抽象方法有什麼意義?
- 22. 什麼是抽象數據類型?它是Java中的類嗎?
- 23. 以抽象方法寫javadoc的正確方法是什麼
- 24. 哪個名字是可以接受的類擴展抽象類?
- 25. 爲什麼使用抽象如果我們有接口
- 26. 爲什麼對象類不是抽象的?
- 27. 是否可以將類型轉換爲父類抽象類?
- 28. 爲什麼我可以創建一個抽象對象的向量?
- 29. 什麼是+ N爲
- 30. 爲什麼編譯器認爲這個類是抽象的(C++)?
爲了驗證這個自己剛剛添加的System.out.println(n.getClass()的getName()); – Buhb 2009-12-16 16:26:54
問題主要是關於抽象類。 – whiskeysierra 2009-12-17 03:36:22
不,它是關於「數字n = 5怎麼樣」;如果「數字」是抽象的,則工作?「請參閱上面的說明。 :) – Bombe 2009-12-17 06:56:14