Java基本數(shù)據(jù)類型轉(zhuǎn)換

一:Java的基本數(shù)據(jù)類型和引用數(shù)據(jù)類型

1:基本數(shù)據(jù)類型


2:引用數(shù)據(jù)類型


二:基本數(shù)據(jù)的類型轉(zhuǎn)換

基本數(shù)據(jù)類型中,布爾類型boolean占有一個字節(jié),由于其本身所代碼的特殊含義照皆,boolean類型與其他基本類型不能進(jìn)行類型的轉(zhuǎn)換(既不能進(jìn)行自動類型的提升,也不能強(qiáng)制類型轉(zhuǎn)換), 否則败富,將編譯出錯

1.基本數(shù)據(jù)類型中數(shù)值類型的自動類型提升

數(shù)值類型在內(nèi)存中直接存儲其本身的值摩窃,對于不同的數(shù)值類型兽叮,內(nèi)存中會分配相應(yīng)的大小去存儲。如:byte類型的變量占用8位猾愿,int類型變量占用32位等鹦聪。相應(yīng)的,不同的數(shù)值類型會有與其存儲空間相匹配的取值范圍蒂秘。具體如下所示:

圖中依次表示了各數(shù)值類型的字節(jié)數(shù)和相應(yīng)的取值范圍泽本。在Java中,整數(shù)類型(byte/short/int/long)中姻僧,對于未聲明數(shù)據(jù)類型的整形规丽,其默認(rèn)類型為int型。在浮點類型(float/double)中撇贺,對于未聲明數(shù)據(jù)類型的浮點型赌莺,默認(rèn)為double型。



接下來我們看看如下一個較為經(jīng)典例子:

1 package com.corn.testcast;

2

3

4 public class TestCast {

5? ?

6? ? public static void main(String[] args) {

7? ? ? ? byte a = 1000;? // 編譯出錯 Type mismatch: cannot convert from int to byte

8? ? ? ? float b = 1.5;? // 編譯出錯 Type mismatch: cannot convert from double to float

9? ? ? ? byte c = 3;? ? ? // 編譯正確

10? ? }

11? ?

12 }

是不是有點奇怪松嘶?按照上面的思路去理解艘狭,將一個int型的1000賦給一個byte型的變量a,編譯出錯,提示"cannot convert from int to byte"是對的巢音,1.5默認(rèn)是一個double型遵倦,將一個double類型的值賦給一個float類型,編譯出錯官撼,這也是對的梧躺。但是最后一句:將一個int型的3賦給一個byte型的變量c,居然編譯正確傲绣,這是為什么呢燥狰?

原因在于:jvm在編譯過程中,對于默認(rèn)為int類型的數(shù)值時斜筐,當(dāng)賦給一個比int型數(shù)值范圍小的數(shù)值類型變量(在此統(tǒng)一稱為數(shù)值類型k龙致,k可以是byte/char/short類型),會進(jìn)行判斷顷链,如果此int型數(shù)值超過數(shù)值類型k目代,那么會直接編譯出錯。因為你將一個超過了范圍的數(shù)值賦給類型為k的變量嗤练,k裝不下嘛榛了,你有沒有進(jìn)行強(qiáng)制類型轉(zhuǎn)換,當(dāng)然報錯了煞抬。但是如果此int型數(shù)值尚在數(shù)值類型k范圍內(nèi)霜大,jvm會自定進(jìn)行一次隱式類型轉(zhuǎn)換,將此int型數(shù)值轉(zhuǎn)換成類型k革答。如圖中的虛線箭頭战坤。這一點有點特別,需要稍微注意下残拐。

在其他情況下途茫,當(dāng)將一個數(shù)值范圍小的類型賦給一個數(shù)值范圍大的數(shù)值型變量,jvm在編譯過程中俊將此數(shù)值的類型進(jìn)行了自動提升溪食。在數(shù)值類型的自動類型提升過程中囊卜,數(shù)值精度至少不應(yīng)該降低(整型保持不變,float->double精度將變高)错沃。

1 package com.corn.testcast;

2

3 public class TestCast {

4

5? ? public static void main(String[] args) {

6? ? ? ? long a = 10000000000; //編譯出錯: The literal 10000000000 of type int is out of range

7? ? ? ? long b = 10000000000L; //編譯正確

8? ? ? ? int c = 1000;

9? ? ? ? long d = c;

10? ? ? ? float e = 1.5F;

11? ? ? ? double f = e;

12? ? }

13

14 }

如上:定義long類型的a變量時栅组,將編譯出錯,原因在于10000000000默認(rèn)是int類型枢析,同時int類型的數(shù)值范圍是-2^31 ~ 2^31-1玉掸,因此,10000000000已經(jīng)超過此范圍內(nèi)的最大值登疗,故而其自身已經(jīng)編譯出錯排截,更談不上賦值給long型變量a了。

此時辐益,若想正確賦值断傲,改變10000000000自身默認(rèn)的類型即可,直接改成10000000000L即可將其自身類型定義為long型智政。此時再賦值編譯正確认罩。

將值為1000的int型變量c賦值給long型變量d,按照上文所述续捂,此時直接發(fā)生了自動類型提升垦垂, 編譯正確。同理牙瓢,將e賦給f編譯正確劫拗。

接下來,還有一個地方需要注意的是:char型其本身是unsigned型矾克,同時具有兩個字節(jié)页慷,其數(shù)值范圍是0 ~ 2^16-1,因為胁附,這直接導(dǎo)致byte型不能自動類型提升到char酒繁,char和short直接也不會發(fā)生自動類型提升(因為負(fù)數(shù)的問題),同時控妻,byte當(dāng)然可以直接提升到short型州袒。


2.基本數(shù)據(jù)類型中的數(shù)值類型強(qiáng)制轉(zhuǎn)換

當(dāng)我們需要將數(shù)值范圍較大的數(shù)值類型賦給數(shù)值范圍較小的數(shù)值類型變量時,由于此時可能會丟失精度(1講到的從int到k型的隱式轉(zhuǎn)換除外)弓候,因此郎哭,需要人為進(jìn)行轉(zhuǎn)換。我們稱之為強(qiáng)制類型轉(zhuǎn)換菇存。

首先我們看一下如下的例子:

1 package com.corn.testcast;

2

3 public class TestCast {

4

5? ? public static void main(String[] args) {

6? ? ? ? byte p = 3; // 編譯正確:int到byte編譯過程中發(fā)生隱式類型轉(zhuǎn)換

7? ? ? ? int? a = 3;

8? ? ? ? byte b = a; // 編譯出錯:cannot convert from int to byte

9? ? ? ? byte c = (byte) a; // 編譯正確

10? ? ? ? float d = (float) 4.0;

11? ? }

12

13 }

byte p =3彰居;編譯正確在1中已經(jīng)進(jìn)行了解釋。接下來將一個值為3的int型變量a賦值給byte型變量b撰筷,發(fā)生編譯錯誤陈惰。這兩種寫法之間有什么區(qū)別呢?

區(qū)別在于前者3是直接量毕籽,編譯期間可以直接進(jìn)行判定抬闯,后者a為一變量,需要到運(yùn)行期間才能確定关筒,也就是說溶握,編譯期間為以防萬一,當(dāng)然不可能編譯通過了蒸播。此時睡榆,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換萍肆。

強(qiáng)制類型轉(zhuǎn)換所帶來的結(jié)果是可能會丟失精度,如果此數(shù)值尚在范圍較小的類型數(shù)值范圍內(nèi)胀屿,對于整型變量精度不變塘揣,但如果超出范圍較小的類型數(shù)值范圍內(nèi),很可能出現(xiàn)一些意外情況宿崭。

如下經(jīng)典例子:

1 package com.corn.testcast;

2

3 public class TestCast {

4

5? ? public static void main(String[] args) {

6? ? ? ? int a = 233;

7? ? ? ? byte b = (byte) a;

8? ? ? ? System.out.println("b:" + b);? // 輸出:-23

9? ? }

10

11 }

為什么結(jié)果是-23亲铡?需要從最根本的二進(jìn)制存儲考慮。

233的二進(jìn)制表示為:24位0 + 11101001葡兑,byte型只有8位奖蔓,于是從高位開始舍棄,截斷后剩下:11101001讹堤,由于二進(jìn)制最高位1表示負(fù)數(shù)吆鹤,0表示正數(shù),其相應(yīng)的負(fù)數(shù)為-23洲守。


3.進(jìn)行數(shù)學(xué)運(yùn)算時的數(shù)據(jù)類型自動提升與可能需要的強(qiáng)制類型轉(zhuǎn)換

?如下代碼:

1 package com.corn.testcast;

2

3 public class TestCast {

4

5? ? public static void main(String[] args) {

6? ? ? ? byte a = 3 + 5; // 編譯正常 編譯成 3+5直接變?yōu)?

7? ? ? ? int b = 3, c = 5;

8? ? ? ? byte d = b + c; // 編譯錯誤:cannot convert from int to byte

9

10? ? ? ? byte e = 10, f = 11;

11? ? ? ? byte g = e + f; // 編譯錯誤 +直接將10和11類型提升為了int

12? ? ? ? byte h = (byte) (e + f);? //編譯正確

13? ? }

14

15 }

當(dāng)進(jìn)行數(shù)學(xué)運(yùn)算時檀头,數(shù)據(jù)類型會自動發(fā)生提升到運(yùn)算符左右之較大者,以此類推岖沛。當(dāng)將最后的運(yùn)算結(jié)果賦值給指定的數(shù)值類型時暑始,可能需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?歡迎工作一到五年的Java工程師朋友們加入Java群:?891219277

群內(nèi)提供免費的Java架構(gòu)學(xué)習(xí)資料(里面有高可用婴削、高并發(fā)较坛、高性能及分布式栈暇、Jvm性能調(diào)優(yōu)搞疗、Spring源碼娱仔,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構(gòu)資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己虫溜,不要再用"沒有時間“來掩飾自己思想上的懶惰雹姊!趁年輕,使勁拼衡楞,給未來的自己一個交代吱雏!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瘾境,隨后出現(xiàn)的幾起案子歧杏,更是在濱河造成了極大的恐慌,老刑警劉巖迷守,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犬绒,死亡現(xiàn)場離奇詭異,居然都是意外死亡兑凿,警方通過查閱死者的電腦和手機(jī)凯力,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門茵瘾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咐鹤,你說我怎么就攤上這事拗秘。” “怎么了慷暂?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晨雳。 經(jīng)常有香客問我行瑞,道長,這世上最難降的妖魔是什么餐禁? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任血久,我火速辦了婚禮,結(jié)果婚禮上帮非,老公的妹妹穿的比我還像新娘氧吐。我一直安慰自己,他們只是感情好末盔,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布筑舅。 她就那樣靜靜地躺著,像睡著了一般陨舱。 火紅的嫁衣襯著肌膚如雪翠拣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天游盲,我揣著相機(jī)與錄音误墓,去河邊找鬼。 笑死益缎,一個胖子當(dāng)著我的面吹牛谜慌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莺奔,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼欣范,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了令哟?” 一聲冷哼從身側(cè)響起熙卡,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎励饵,沒想到半個月后驳癌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡役听,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年颓鲜,在試婚紗的時候發(fā)現(xiàn)自己被綠了表窘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡甜滨,死狀恐怖乐严,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衣摩,我是刑警寧澤昂验,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站艾扮,受9級特大地震影響既琴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泡嘴,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一甫恩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酌予,春花似錦磺箕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至建椰,卻和暖如春击困,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背广凸。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工阅茶, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谅海。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓脸哀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扭吁。 傳聞我的和親對象是個殘疾皇子撞蜂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Java中的類型轉(zhuǎn)換在Java編碼中具有重要的作用。首先侥袜,來了解下數(shù)據(jù)類型的基本理解:數(shù)據(jù)類型是用來描述數(shù)據(jù)的種類...
    時待吾閱讀 1,332評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法蝌诡,類相關(guān)的語法,內(nèi)部類的語法枫吧,繼承相關(guān)的語法浦旱,異常的語法,線程的語...
    子非魚_t_閱讀 31,622評論 18 399
  • 朋友是 彼此生命的過客 告別時 道一聲珍重 再相聚 惟驚喜感慨 可曾知 時間的遠(yuǎn)方里 飄著經(jīng)歷的長河 偶然聽起 那...
    心蓮Kallen閱讀 192評論 0 2
  • 1.我在本篇文章中學(xué)到的最重要的概念是: 在有時間和精力的時候九杂,就要去做自己想做的颁湖,去驗證自己想驗證的宣蠕,再不瘋狂我...
    246任晶璐閱讀 262評論 1 0
  • 糜亂的周一讓人有點倉促。一日之計在于晨甥捺,可惜我已經(jīng)失去了抢蚀,生活總是這樣,越是抱有幻想镰禾,抱有期待皿曲,他越是辜負(fù)你?也許...
    仁者之道閱讀 534評論 0 0