2013-01-23 71 views
3

Possible Duplicate:
When we have wrappers classes, why primitives are supported?爲什麼Java中有原始數據類型?

如果有使Wrapper類成爲純粹的面嚮對象語言的Wrapper類,那麼爲什麼有可以在Java中使用的Primitive數據類型?

+0

這裏檢查http://stackoverflow.com/questions/6151497/why-java-is-not-pure-object-oriented-language – PermGenError

+0

@GanGnaMStYleOverFlowErroR:它不能解釋*爲什麼*有原始類型。 –

+2

有[傳言說Java 10中的原語會消失](http://java.dzone.com/articles/oracle-discusses-features-java)。 – assylias

回答

9

提高效率。原始類型的變量直接包含該值;非原始類型的變量是引用,指的是存儲在其他地方的對象。

每次您需要使用包裝類型的值時,JVM都需要查找內存中的對象以獲取該值。原始類型不需要這樣做,因爲變量包含值本身,而不是包含該值的對象的引用。

但是,這並不能解釋爲什麼原始類型需要在Java編程語言中顯式可見。 Java語言和JVM的設計者可以選擇從語言本身隱藏基本類型,這樣你就可以將所有東西當作一個對象來處理;編譯器可以將其翻譯成更高效的原始類型。運行在JVM上的一些較新的編程語言(Groovy,Scala和其他)可以讓你做到這一點:在語言本身中,一切看起來像一個對象,你可以調用方法,但在下面覆蓋編譯器將它們轉換爲基元。

我想在開發Java語言的時候(在20世紀90年代的前半期)人們沒有想到這一點,現在爲了做到這一點,對語言進行徹底改變已經太晚了。

3

原始數據類型存在的主要原因是因爲創建對象,分配堆太昂貴並且存在性能損失。正如你可能知道像int這樣的基本數據類型,float等是最常用的,所以將它們作爲對象會產生巨大的性能影響。所以Java設計者認爲將它作爲非對象會更好。 是的,包裝存在的情況下,你準備妥協一點性能,但你需要更多的設施的OOP。所以在這種情況下,你可以使用包裝器。希望這些信息可以幫助你。

+0

*創建對象,分配堆太昂貴,並有性能損失* =>你有參考嗎?有一個懲罰,但並不是那麼高。 – assylias

+0

例如,[Goetz states](http://www.ibm.com/developerworks/java/library/j-jtp09275/index.html)* HotSpot 1.4.2及更高版本中新對象()的通用代碼路徑大約有10條機器指令*。 – assylias

+0

_原始類型代表單個值 - 不是複雜的對象。儘管Java是 否則完全是面向對象的,但是基本類型不是。它們類似於 這些簡單的類型,在大多數其他非面向對象的語言中都可以找到。原因是 效率。將基本類型變爲對象會使Java的性能退化,成爲完整的參考。 –

2

由於性能原因。在像SmallTalk之類的其他語言中,像int或char這樣的類型也是對象,並且可以在它們上調用方法。這在理論上更加正確,但當前的實現運行速度較慢。原始類型在純度和性能之間折衷。

如果需要更多(空值可能或與集合框架一起使用),Java提供包裝類,如java.lang.Integer和類似的。

相關問題