原始型別與包裝類
我們都知道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(及其它程式語言)的世界當中,站在它的角度來思考,或許就會豁然開朗。
以上是我在寫這篇文章過程中突發靈感,然後就記錄下來了,靠譜性還有待實踐檢驗……
相關文章
- Java 包裝類:原始資料型別與迭代器Java資料型別
- 【Java】基本型別包裝類Java型別
- Java 包裝類和基本型別Java型別
- 二十八、基本型別包裝類型別
- 常見物件-基本型別包裝類物件型別
- java基本資料型別包裝類Java資料型別
- 14.Java-Arrays(類)、基本型別包裝類、Integer(類)Java型別
- 基本資料型別及其包裝類(一)資料型別
- 基本資料型別及其包裝類(二)資料型別
- Java-API-基本資料型別包裝類JavaAPI資料型別
- (2)Java基本資料型別和包裝類Java資料型別
- javascript基本型別 引用型別 基本包裝型別JavaScript型別
- Java中的基本型別包裝類 Integer 類該怎麼使用?Java型別
- ECMAScript 原始型別與引用型別型別
- 包裝類型別,跳脫字元,BigDecimal,BigInteger,Ca型別字元Decimal
- 【Java】基本資料型別包裝類面試題之一Java資料型別面試題
- Java基礎-基本型別和包裝型別Java型別
- Javascript 之基本包裝型別JavaScript型別
- cheerp資料型別包裝資料型別
- java基本型別和包裝型別的“==”和equals()方法Java型別
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- JavaScript中的包裝型別詳解JavaScript型別
- 面試官:兄弟,說說基本型別和包裝型別的區別吧面試型別
- Java中基本資料型別和包裝型別有什麼區別?Java資料型別
- 包裝類
- linux原始碼包與RPM包的區別Linux原始碼
- 《JavaScript 闖關記》之基本包裝型別JavaScript型別
- JS中資料型別、內建物件、包裝型別物件、typeof關係JS資料型別物件
- 你不知道的JavaScript--Item4 基本型別和基本包裝型別(引用型別)JavaScript型別
- 區塊鏈錢包開發與型別區塊鏈型別
- Java 包裝類Java
- 物件,包裝類物件
- 七,包裝類
- Java開發學習--Java 中基本型別和包裝類之間的轉換Java型別
- 字串與日期型別轉換的工具類字串型別
- Java--包裝類(基本型別和字串之間的轉換)、進位制轉換Java型別字串
- 章13——包裝類——Math類
- 包裝類(Wrapper)APP