Java自动类型转换和强制类型转换
數(shù)據(jù)類型的轉(zhuǎn)換可以分為隱式轉(zhuǎn)換(自動(dòng)類型轉(zhuǎn)換)和顯式轉(zhuǎn)換(強(qiáng)制類型轉(zhuǎn)換)兩種。
隱式轉(zhuǎn)換(自動(dòng)類型轉(zhuǎn)換)
滿足2 個(gè)條件,那么將一種類型的數(shù)據(jù)賦給另外一種類型變量的時(shí),將執(zhí)行自動(dòng)類型轉(zhuǎn)換(automatic type conversion)。
兩種數(shù)據(jù)類型彼此兼容目標(biāo)類型的取值范圍大于源數(shù)據(jù)類型(低級(jí)類型數(shù)據(jù)轉(zhuǎn)換成高級(jí)類型數(shù)據(jù))當(dāng)滿足以上 2 個(gè)條件時(shí),自動(dòng)轉(zhuǎn)換(widening conversion)發(fā)生。例如 byte 類型向 short 類型轉(zhuǎn)換時(shí),由于 short 類型的取值范圍較大,會(huì)自動(dòng)將 byte 轉(zhuǎn)換為 short 類型。
在運(yùn)算過(guò)程中,由于不同的數(shù)據(jù)類型會(huì)轉(zhuǎn)換成同一種數(shù)據(jù)類型,所以整型、浮點(diǎn)型以及字符型都可以參與混合運(yùn)算。自動(dòng)轉(zhuǎn)換的規(guī)則是從低級(jí)類型數(shù)據(jù)轉(zhuǎn)換成高級(jí)類型數(shù)據(jù)。轉(zhuǎn)換規(guī)則如下:
數(shù)值型數(shù)據(jù)的轉(zhuǎn)換:byte→short→int→long→float→double。字符型轉(zhuǎn)換為整型:char→int。以上數(shù)據(jù)類型的轉(zhuǎn)換遵循從左到右的轉(zhuǎn)換順序,最終轉(zhuǎn)換成表達(dá)式中表示范圍最大的變量的數(shù)據(jù)類型。
示例自動(dòng)類型轉(zhuǎn)換
顧客到超市購(gòu)物,購(gòu)買牙膏 2 盒,面巾紙 4 盒。其中牙膏的價(jià)格是 10.9 元,面巾紙的價(jià)格是 5.8 元,求商品總價(jià)格。
實(shí)現(xiàn)
public static void main(String[] args) {float price1 = 10.9f; // 定義牙膏的價(jià)格double price2 = 5.8; // 定義面巾紙的價(jià)格int num1 = 2; // 定義牙膏的數(shù)量int num2 = 4; // 定義面巾紙的數(shù)量double res = price1 * num1 + price2 * num2; // 計(jì)算總價(jià)System.out.println("一共付給收銀員" + res + "元"); // 輸出總價(jià) }上述代碼中首先定義了一個(gè) float 類型的變量存儲(chǔ)牙膏的價(jià)格,然后定義了一個(gè) double 類型的變量存儲(chǔ)面巾紙的價(jià)格,再定義兩個(gè) int 類型的變量存儲(chǔ)物品的數(shù)量,最后進(jìn)行了乘運(yùn)算以及和運(yùn)算之后,將結(jié)果儲(chǔ)存在一個(gè) double 類型的變量中進(jìn)行輸出。
輸出結(jié)果
一共付給收銀員44.999923706055元從執(zhí)行結(jié)果看出,float、int 和 double 三種數(shù)據(jù)類型參與運(yùn)算,最后輸出的結(jié)果為 double 類型的數(shù)據(jù)。這種轉(zhuǎn)換一般稱為“表達(dá)式中類型的自動(dòng)提升”。
使用一個(gè)顯示的強(qiáng)制類型轉(zhuǎn)換,例如:
byte b = 50; b = (byte)(b*2);這樣就能產(chǎn)生正確的值 100。
注意:char 類型比較特殊,char 自動(dòng)轉(zhuǎn)換成 int、long、float 和 double,但 byte 和 short 不能自動(dòng)轉(zhuǎn)換為 char,而且 char 也不能自動(dòng)轉(zhuǎn)換為 byte 或 short。
顯式轉(zhuǎn)換(強(qiáng)制類型轉(zhuǎn)換)
盡管自動(dòng)類型轉(zhuǎn)換是很有幫助的,但并不能滿足所有的編程需要。例如,如果你需要將 double 型的值賦給一個(gè) int 型的變量,你將怎么辦?
這種轉(zhuǎn)換不會(huì)自動(dòng)進(jìn)行,因?yàn)?double 型的變化范圍比 int 型的要小。這種轉(zhuǎn)換有使成為“縮小轉(zhuǎn)換”,因?yàn)槟憧隙ㄒ獙⒃磾?shù)據(jù)類型的值變小才能適合目標(biāo)數(shù)據(jù)類型。
所以當(dāng)兩種數(shù)據(jù)類型不兼容,或目標(biāo)類型的取值范圍小于源類型時(shí),自動(dòng)轉(zhuǎn)換將無(wú)法進(jìn)行,這時(shí)就需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。其語(yǔ)法格式如下:
(type)variableName其中,type 為 variableName 要轉(zhuǎn)換成的數(shù)據(jù)類型,而 variableName 是指要進(jìn)行類型轉(zhuǎn)換的變量名稱,強(qiáng)制轉(zhuǎn)換的實(shí)例如下:
int a = 3; double b = 9.0; a = (int)b;上述代碼中首先將 double 類型變量 b 的值強(qiáng)制轉(zhuǎn)換成 int 類型,然后將值賦給 a,但是變量 b 本身的值是沒(méi)有發(fā)生變化的。
在強(qiáng)制類型轉(zhuǎn)換中,如果是將浮點(diǎn)類型的值轉(zhuǎn)換為整數(shù),直接去掉小數(shù)點(diǎn)后邊的所有數(shù)字;而如果是整數(shù)類型強(qiáng)制轉(zhuǎn)換為浮點(diǎn)類型時(shí),將在小數(shù)點(diǎn)后面補(bǔ)零。
示例強(qiáng)制類型轉(zhuǎn)換
顧客到超市購(gòu)物,購(gòu)買牙膏 2 盒,面巾紙 4 盒。其中牙膏的價(jià)格是 10.9 元,面巾紙的價(jià)格是 5.8 元,求商品總價(jià)格,在計(jì)算總價(jià)時(shí)采用 int 類型的數(shù)據(jù)進(jìn)行存儲(chǔ)。實(shí)現(xiàn)代碼如下:
在上例中,有 double 類型、float 類型和 int 類型的數(shù)據(jù)參與運(yùn)算,其運(yùn)算結(jié)果默認(rèn)為 double 類型,題目要求的結(jié)果為 int 類型,因?yàn)?int 類型的取值范圍要小于 double 類型的取值范圍,所以需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
輸出結(jié)果
一共付給收銀員44元總結(jié)
以上是生活随笔為你收集整理的Java自动类型转换和强制类型转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 并发编程的目的和挑战
- 下一篇: Java 获取目录的大小