作為一種強類型語言,Java針對每一種資料都定義了明确的資料類型。大體來講可分為:基本資料類型和引用資料類型;在此,主要讨論前者,後者以後再繼續探究。
Java基本資料類型分為四類八種:
請注意:
整數預設為int類型
浮點數預設為double類型
在聲明double類型的資料時,建議添加字尾L
在聲明float類型的資料時,建議添加字尾F
浮點數中double的精度高于float
不同類型的資料所占位元組數也是不一樣的,但是它們可以互相轉換,請看下圖:

左側資料類型可自動轉換至右側資料類型,這也稱為java資料類型自動轉換(提升)
右側資料類型可強制轉換為左側資料類型;但是在該轉換過程中可能造成資料的精度丢失
boolean類型資料不可與其他資料類型互相轉換
現在我們來通過一些執行個體,進一步了解Java基本資料類型及其互相轉換。
示例一:
先來看字元char類型的資料。字元從本質上來講是數字;它可以參與算術預算;故也可将char轉換成int檢視其對應的數值是什麼。
示例二:
此處,我們想聲明一個float類型的變量f用于儲存小數123.45,但是IDE報錯:
Type mismatch: cannot convert from double to float 不能将double轉換為float類型
此處IDE給出了兩個修改該錯誤的建議
第一種建議:将123.45轉換為float,即:
float f=(float) 123.45;
這是為什麼呢?其實,原因我們剛才已經講過了:浮點數預設為double類型。是以,此時系統将123.45當做了double類型,故可将其強轉為float類型,但是别忘了如此強轉可能造成精度丢失
第二種建議:将變量f的類型改為double,即:
double f=123.45;
直接将f聲明為double類型,用其來存儲123.45是再合适不過的了。
示例三:
在該例子中定義了int i=5和byte b=7,再将兩者相加指派給byte類型的result;此時IDE報錯:
Type mismatch: cannot convert from int to byte 不能将int類型轉換為byte類型
與示例二非常類型,IDE也給出了兩個建議,我們可遵循其建議進行修改。
好了,繼續看一個例子。
示例四:
看到這裡,或許就郁悶了:兩個byte類型的資料相加再指派給byte的變量也有錯麼??居然再次報錯:
或許有的人會想:兩個byte相加,其結果可能會大于byte的取值範圍。這麼想沒啥錯,但這是根本的原因麼?繼續往下看!
示例五:
看到此處,可能沒有那麼郁悶但是有點麻木了,為啥又報錯了呢?
示例六:
這些錯誤的原因到底是什麼呢?
JVM在處理byte,char,short的時候會将它們處理成32位長再進一步操作;也就是說JVM會将byte,char,short轉換為int類型再繼續運算。
關于Java基本資料類型參與+、-、*、/、%運算的時候請注意:
兩個操作數中若有一個是double類型的,那麼另一個操作數将會被轉換成double類型,并且結果也是double類型
兩個操作數中若有一個是float類型的,另一個操作數将會被轉換成float類型,并且結果也是float類型
兩個操作數若有一個是long類型的,另一個操作數将會被轉換成long類型,并且結果也是long類型
兩個操作數若均為byte、short、int、char中任意一個,那麼它們均會被轉換成int類型,并且結果也是int類型
以上四點可小結為:整個算術表達式的資料類型自動提升到與表達式中最高等級操作數相同的類型
當使用+=、-=、*=、/=、%=、運算符對基本類型進行運算時,遵循如下規則:運算符右邊的數值将首先被強制轉換成與運算符左邊數值相同的類型,然後再執行運算,且運算結果與運算符左邊數值類型相同。
再來看個例子:
通過之前的講解我們已經知道了:byte b3=b1+b2;會報錯的
但是byte b4=3+4;為什麼是對的呢?因為等号的右側是兩個常量相加并不是兩個變量相加;就算寫byte b4=300;明顯超出byte的範圍IDE也是不會報錯的。變量所表示的值在運作時才會最終确定,而常量所表示的值在編譯期間就已經确定了。
最後,附上文中的測試代碼: