原始型別與包裝類

weixin_34185560發表於2017-03-10

我們都知道Java是物件導向的語言,但是它提供的8種原始的資料型別(byte,short,int,long,float,double,char,boolean)卻不是物件導向的。但是,Java又為每一個原始型別提供了各自的包裝類(Byte,Short,Integer,Long,Double,Float,Character,Boolean)。究竟Java為什麼要這樣做呢?

一、為什麼要使用原始型別(也叫基本型別)

站在Java程式設計師的角度來看,我們可以確認“原始型別不是物件”,它不存在封裝、繼承、多型這些概念,不在物件導向體系之內。但是在JVM中,它會為所有的基本型別建立一個物件,所以在JVM內部,原始型別就是物件。(注:這裡我是參考的別人的部落格,他裡面有詳細的解釋,文章末尾有原文連結)那既然如此,我們為什麼不直接使用對應的包裝類物件,而要使用原始資料型別呢?

大家應該都能想到,JVM為原始型別建立的物件,和我們直接建立對應包裝類物件,在JVM裡的內部實現肯定是有區別的。為原始型別建立物件,在JVM內部是很輕量級的,相比後者做了許多優化。因此,使得原始型別的功能減少(應該講已經優化的沒有功能了,所以其內部沒有任何方法可以供我們呼叫),但是卻獲得了更快的執行速度,這個是非常關鍵的一點。原始型別大量存在於我們的程式碼中,例如一個迴圈就要使用一個int型別的資料很多次,使用原始型別與建立物件相比,速度要提升很多很多。

二、為什麼要存在包裝類

前面我們提到,原始型別是不包含方法的,但是有時我們又有一些常用的操作,如果Java不給我們提供,我們就要自己去定義實現,比如:將字串轉換為基本值的操作(parseInt()),生成字串表示的操作(toString())等等。不過,Java的包裝類都為我們提供了這些方法,我們只需要在用到的時候進行呼叫就可以了。但是如果我們一開始定義的是原始型別,而不是建立它們的物件,那我們怎麼呼叫Java給我們提供的方法呢?這就牽扯到裝箱和拆箱了,通過裝箱與拆箱,int和Integer來回轉換。

三、裝箱和拆箱

(手動)裝箱和拆箱:就是將原始型別轉換成物件,例如通過Integer類將int裝箱。相反,拆箱就是將物件轉換為原始型別。

int n = 3;

Integer obj = new Integer(n);//裝箱

int m = obj.intValue();//拆箱

自動裝箱和拆箱:以上是我們進行手動的裝箱和拆箱,Java1.5後可以實現自動裝箱和拆箱操作。例如:

int n =3;

integer obj = n;//自動裝箱

int m = obj;//自動拆箱

參考:http://blog.csdn.net/qq_35101189/article/details/53580685


在對這個知識點進行梳理的過程中,我發現了程式設計師一個新的看待問題的角度,就是“換位思考”。拿我們這篇文章講的內容舉個例子:原始資料型別在程式設計師看來,並不是一個物件,所以我們不是以建立物件的方式建立它,也無法像使用一個物件一樣去呼叫它,它在程式設計師看來只是一個變數。但是在JVM中,JVM是把原始型別當作物件來處理的,原始型別在它真實的執行環境中是接受的物件的待遇,只不過進行了特殊的優化處理。所以本質上,原始型別就是一個物件,一個經過特殊優化的物件。

程式設計師是APP的創造者,我們開發出各式各樣的APP給使用者使用,使用者只能使用我們開發出的功能;但我們同時也是使用者,是開發語言的使用者,我們只能在程式語言的規範、標準下使用它。

產品經理在設計一款產品時,需要換位思考,要站在使用者的角度去設計,思考如何讓介面更加友好,操作更加順手,功能是否能滿足使用者的需要等等。我想程式設計師在敲程式碼時,有時也要站在程式語言的角度去思考問題,我們可能經常會困惑這行程式碼為什麼要這樣寫,Java設計者為什麼要這樣設計等等一些不太容易理解的問題上,如果此時我們深入Java(及其它程式語言)的世界當中,站在它的角度來思考,或許就會豁然開朗。

以上是我在寫這篇文章過程中突發靈感,然後就記錄下來了,靠譜性還有待實踐檢驗……

相關文章